diff --git a/.dockerignore b/.dockerignore index 3c3629e647f..923c7c73323 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,10 @@ +.env node_modules +logs +dist +website +page +client/desktop +client/desktop-old +client/mobile +apps diff --git a/.eslintignore b/.eslintignore index a6c7c2852d0..0fcfc08556c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,3 @@ *.js +client/desktop/ +apps/cli/templates/ diff --git a/.eslintrc.js b/.eslintrc.js index f918830f3ee..33f343ec862 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,6 +27,10 @@ module.exports = { // e.g. "@typescript-eslint/explicit-function-return-type": "off", '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + 'react/react-in-jsx-scope': 'off', 'react/prop-types': 'off', }, }; diff --git a/.github/workflows/admin.yaml b/.github/workflows/admin.yaml new file mode 100644 index 00000000000..88f2aefac65 --- /dev/null +++ b/.github/workflows/admin.yaml @@ -0,0 +1,38 @@ +name: "Server Admin CI" + +on: + push: + branches: + - master + paths: + - "server/admin/**" + workflow_dispatch: + +jobs: + ci: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18.x] + steps: + - name: checkout + uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - name: Cache pnpm modules + uses: actions/cache@v2 + with: + path: ~/.pnpm-store + key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}- + - uses: pnpm/action-setup@v2.0.1 + with: + version: 8.15.8 + run_install: false + - name: Install packages + run: pnpm install --frozen-lockfile + - name: Check Build + run: pnpm build:admin diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 393b24be6a7..499d6cfd306 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -4,6 +4,10 @@ on: push: branches: - master + paths: + - "client/web/**" + - "client/shared/**" + - "client/packages/design/**" workflow_dispatch: jobs: @@ -11,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [14.x, 16.x] + node-version: [18.x] steps: - name: checkout uses: actions/checkout@v2 @@ -28,15 +32,17 @@ jobs: ${{ runner.os }}- - uses: pnpm/action-setup@v2.0.1 with: - version: latest - run_install: true + version: 8.15.8 + run_install: false - name: Install packages run: pnpm install --frozen-lockfile - name: Check Type - run: cd web && pnpm check:type + run: cd client/web && pnpm check:type - name: Test - run: pnpm test + run: cd client/web && pnpm test env: TZ: Asia/Shanghai - name: Check Build - run: cd web && pnpm build + run: cd client/web && pnpm build:ci + env: + PERFSEE_TOKEN: ${{ secrets.PERFSEE_TOKEN }} diff --git a/.github/workflows/deploy-deno.yml b/.github/workflows/deploy-deno.yml new file mode 100644 index 00000000000..ed1e6e07ceb --- /dev/null +++ b/.github/workflows/deploy-deno.yml @@ -0,0 +1,64 @@ +name: Deploy into deno deploy + +on: + push: + branches: + - master + paths: + - "client/web/**" + - "client/shared/**" + - "client/packages/design/**" + workflow_dispatch: + +jobs: + deploy: + name: Deploy deno + runs-on: ubuntu-latest + + permissions: + id-token: write # Needed for auth with Deno Deploy + contents: read # Needed to clone the repository + + steps: + - name: Clone repository + uses: actions/checkout@v3 + + - name: Install Deno + uses: denoland/setup-deno@main + with: + deno-version: 1.18.2 + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: lts/* + + - name: Cache pnpm modules + uses: actions/cache@v2 + with: + path: ~/.pnpm-store + key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}- + - uses: pnpm/action-setup@v2.0.1 + with: + version: latest + run_install: false + - name: Install packages + run: pnpm install --frozen-lockfile + + - name: Build step + run: cd client/web && pnpm build + env: + SERVICE_URL: https://tailchat-nightly.moonrailgun.com + + - name: Copy Deno Entry + run: cd client/web && cp ./scripts/deno-static-entry.ts ./dist/deno-static-entry.ts + + - name: Upload to Deno Deploy + uses: denoland/deployctl@v1 + with: + project: "tailchat-nightly" + # entrypoint: https://deno.land/std@0.202.0/http/file_server.ts + entrypoint: deno-static-entry.ts + root: "./client/web/dist" diff --git a/.github/workflows/deploy-github-app.yml b/.github/workflows/deploy-github-app.yml new file mode 100644 index 00000000000..56560e52358 --- /dev/null +++ b/.github/workflows/deploy-github-app.yml @@ -0,0 +1,28 @@ +name: "Deployment Tailchat Github App" + +on: + push: + branches: + - master + paths: + - "apps/github-app/**" + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18.x] + steps: + - uses: actions/checkout@v1 + - name: Deploy to Vercel + uses: amondnet/vercel-action@master + env: + VERSION: ${{ env.GITHUB_SHA }} + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + vercel-org-id: ${{ secrets.ORG_ID}} + vercel-project-id: prj_KwCzbuSaEj3XmP0sYvvnqqiK7nCW + working-directory: ./apps/github-app + vercel-args: '--prod' diff --git a/.github/workflows/deploy-laf.yml b/.github/workflows/deploy-laf.yml new file mode 100644 index 00000000000..326adece6b9 --- /dev/null +++ b/.github/workflows/deploy-laf.yml @@ -0,0 +1,62 @@ +name: Deploy into laf + +on: + push: + branches: + - master + paths: + - ".github/workflows/deploy-laf.yml" + - "client/web/**" + - "client/shared/**" + - "client/packages/design/**" + workflow_dispatch: + +jobs: + deploy: + name: Deploy Laf + runs-on: ubuntu-latest + + permissions: + id-token: write # Needed for auth with Deno Deploy + contents: read # Needed to clone the repository + + steps: + - name: Clone repository + uses: actions/checkout@v3 + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: lts/* + + - name: Cache pnpm modules + uses: actions/cache@v2 + with: + path: ~/.pnpm-store + key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}- + - uses: pnpm/action-setup@v2.0.1 + with: + version: latest + run_install: false + + - name: Install packages + run: pnpm install --frozen-lockfile + + - name: Inject Analytics + run: node ./client/web/build/inject-analytics.js + + - name: Build step + run: cd client/web && pnpm build + env: + SERVICE_URL: https://tailchat-nightly.moonrailgun.com + + - name: Deploy to laf storage + uses: moonrailgun/laf-storage-deploy-action@v1.1 + with: + laf-server: https://laf.dev + laf-pat: ${{ secrets.LAF_PAT }} + laf-appid: yyejoq + laf-bucket-name: yyejoq-tailchat-nightly + dist-path: client/web/dist diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml new file mode 100644 index 00000000000..29fa8bce697 --- /dev/null +++ b/.github/workflows/deploy-website.yml @@ -0,0 +1,55 @@ +name: "Deployment Website" + +on: + push: + branches: + - master + paths: + - "website/**" + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18.x] + defaults: + run: + working-directory: website + steps: + - uses: actions/checkout@v1 + # - name: Use Node.js ${{ matrix.node-version }} + # uses: actions/setup-node@v1 + # with: + # node-version: ${{ matrix.node-version }} + # - name: Cache pnpm modules + # uses: actions/cache@v2 + # with: + # path: ~/.pnpm-store + # key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + # restore-keys: | + # ${{ runner.os }}- + # - uses: pnpm/action-setup@v2.0.1 + # with: + # version: 7.1.9 + # run_install: true + # - name: Install Packages + # run: pnpm install + # - name: Build page + # run: pnpm build + # - name: Deploy to gh-pages + # uses: peaceiris/actions-gh-pages@v3 + # with: + # github_token: ${{ secrets.GITHUB_TOKEN }} + # publish_dir: ./website/build + - name: Deploy to Vercel + uses: amondnet/vercel-action@master + env: + VERSION: ${{ env.GITHUB_SHA }} + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + vercel-org-id: ${{ secrets.ORG_ID}} + vercel-project-id: prj_mqIp5rfpiL3xObjBj5zMyI1y3x9r + working-directory: ./ + vercel-args: '--prod' diff --git a/.github/workflows/desktop-build.yml b/.github/workflows/desktop-build.yml new file mode 100644 index 00000000000..000c1cc92fe --- /dev/null +++ b/.github/workflows/desktop-build.yml @@ -0,0 +1,57 @@ +name: "Desktop Build" + +on: + push: + branches: + - master + paths: + - "client/desktop/release/app/package.json" # build when version upgrade + workflow_dispatch: + +jobs: + build-desktop: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: + - macos-latest + # - ubuntu-latest + - windows-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v1 + + - name: Install Node.js, NPM and Yarn + uses: actions/setup-node@v1 + with: + node-version: 16 + + - name: Install global dependencies + uses: pnpm/action-setup@v2.0.1 + with: + version: latest + run_install: true + + - name: Install npm dependencies + run: yarn + working-directory: ./client/desktop + + - name: Build/release Electron app + uses: paneron/action-electron-builder@v1.8.1 + with: + package_root: ./client/desktop + + # GitHub token, automatically provided to the action + # (No need to define this secret in the repo settings) + github_token: ${{ secrets.github_token }} + + release: false + # # If the commit is tagged with a version (e.g. "v1.0.0"), + # # release the app after building + # release: ${{ startsWith(github.ref, 'refs/tags/v') }} + + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: desktop-client-artifacts + path: ./client/desktop/release/build/* diff --git a/.github/workflows/docker-publish-canary.yml b/.github/workflows/docker-publish-canary.yml new file mode 100644 index 00000000000..603eba7ee57 --- /dev/null +++ b/.github/workflows/docker-publish-canary.yml @@ -0,0 +1,40 @@ +# Reference: https://github.com/docker/build-push-action/blob/master/docs/advanced/tags-labels.md + +name: "Docker Publish Canary" + +on: + workflow_dispatch: + +jobs: + dockerize: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: moonrailgun/tailchat + # generate Docker tags based on the following events/attributes + tags: | + type=sha + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: VERSION=canary-${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 21595fd096d..316f3e0f87a 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -41,6 +41,14 @@ jobs: uses: docker/build-push-action@v2 with: context: . + platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + build-args: VERSION=docker-${{ steps.meta.outputs.tags }} + - name: Notify to Service + continue-on-error: true + uses: muinmomin/webhook-action@v1.0.0 + with: + url: https://tailchat-nightly.moonrailgun.com/api/plugin:com.msgbyte.simplenotify/webhook/callback + data: '{"text": "The new docker images has been push, visit https://hub.docker.com/r/moonrailgun/tailchat/tags to learn more", "subscribeId": "${{ secrets.NOTIFY_SUB_ID}}"}' diff --git a/.github/workflows/rn-build-apk.yml b/.github/workflows/rn-build-apk.yml new file mode 100644 index 00000000000..5749d5bde45 --- /dev/null +++ b/.github/workflows/rn-build-apk.yml @@ -0,0 +1,40 @@ +name: "RN Android Build Apk" + +on: + # push: + # branches: + # - master + # paths: + # - "client/mobile/**" + workflow_dispatch: + +jobs: + install-dependencies: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./client/mobile + steps: + - uses: actions/checkout@v3 + - name: Install npm dependencies + run: | + yarn + build-android: + needs: install-dependencies + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./client/mobile + steps: + - uses: actions/checkout@v3 + - name: Install npm dependencies + run: | + yarn + - name: Build Android Release + run: | + cd android && ./gradlew assembleRelease + - name: Upload Artifact + uses: actions/upload-artifact@v1 + with: + name: app-release.apk + path: android/app/build/outputs/apk/release/ diff --git a/.github/workflows/translator.yaml b/.github/workflows/translator.yaml new file mode 100644 index 00000000000..5d31b532578 --- /dev/null +++ b/.github/workflows/translator.yaml @@ -0,0 +1,30 @@ +name: 'translator' + +on: + issues: + types: [opened, edited] + issue_comment: + types: [created, edited] + discussion: + types: [created, edited] + discussion_comment: + types: [created, edited] + pull_request_target: + types: [opened, edited] + pull_request_review_comment: + types: [created, edited] + +jobs: + translate: + permissions: + issues: write + discussions: write + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: lizheming/github-translate-action@1.1.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + IS_MODIFY_TITLE: true + APPEND_TRANSLATION: true diff --git a/.github/workflows/vercel-nightly-test.yml b/.github/workflows/vercel-nightly-test.yml new file mode 100644 index 00000000000..13fdda5e59e --- /dev/null +++ b/.github/workflows/vercel-nightly-test.yml @@ -0,0 +1,20 @@ +name: "deploy nightly test" + +on: + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + - name: Deploy Prod + uses: amondnet/vercel-action@master + env: + VERSION: ${{ env.GITHUB_SHA }} + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + vercel-org-id: ${{ secrets.ORG_ID}} + vercel-project-id: ${{ secrets.PROJECT_ID}} + working-directory: ./ diff --git a/.github/workflows/vercel-nightly.yml b/.github/workflows/vercel-nightly.yml index 4730eeed02c..e6b6ec7c5c9 100644 --- a/.github/workflows/vercel-nightly.yml +++ b/.github/workflows/vercel-nightly.yml @@ -4,6 +4,10 @@ on: push: branches: - master + paths: + - "client/web/**" + - "client/shared/**" + - "client/packages/design/**" workflow_dispatch: jobs: @@ -12,6 +16,8 @@ jobs: steps: - name: checkout uses: actions/checkout@v2 + - name: Inject Analytics + run: node ./client/web/build/inject-analytics.js - name: Deploy Prod uses: amondnet/vercel-action@master env: @@ -23,7 +29,8 @@ jobs: working-directory: ./ vercel-args: '--prod' - name: Notify to Service + continue-on-error: true uses: muinmomin/webhook-action@v1.0.0 with: url: https://paw-server-nightly.moonrailgun.com/api/plugin:com.msgbyte.simplenotify/webhook/callback - data: '{"text": "新版前端代码部署完毕", "subscribeId": "${{ secrets.NOTIFY_SUB_ID}}"}' + data: '{"text": "The new version of the frontend code is deployed", "subscribeId": "${{ secrets.NOTIFY_SUB_ID}}"}' diff --git a/.gitignore b/.gitignore index ceda7a4feef..23dc814f763 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,12 @@ -locales +docker/swag.env +client/locales .vercel .DS_Store +# yalc +.yalc +yalc.lock + # Logs logs *.log diff --git a/.husky/pre-commit b/.husky/pre-commit index fab6428a1a7..36af219892f 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -pnpm lint-staged +npx lint-staged diff --git a/.lintstagedrc.json b/.lintstagedrc.json new file mode 100644 index 00000000000..86f48ac1f4f --- /dev/null +++ b/.lintstagedrc.json @@ -0,0 +1,12 @@ +{ + "src/*.{json,less}": [ + "prettier --write --config ./.prettierrc.json" + ], + "./**/*.js": [ + "prettier --write --config ./.prettierrc.json" + ], + "./**/*.{ts,tsx}": [ + "eslint --fix", + "prettier --write --config ./.prettierrc.json" + ] +} diff --git a/.npmrc b/.npmrc index 278230a25c5..4ec9013dd69 100644 --- a/.npmrc +++ b/.npmrc @@ -1,6 +1,3 @@ # https://npmmirror.com/ registry = https://registry.npmmirror.com -public-hoist-pattern[] = react -public-hoist-pattern[] = @types/react -# For docker: https://pnpm.io/npmrc#unsafe-perm -unsafe-perm = true +strict-peer-dependencies = false # some dependency is not fit tailchat, tailchat's dependency is complex, every peer dependencies problem should check with manual. diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000000..f8253fc5aca --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +apps/cli/templates/ diff --git a/.prettierrc.json b/.prettierrc.json index 1b51297f95f..1e15a4bcb86 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -7,20 +7,5 @@ "trailingComma": "es5", "bracketSpacing": true, "arrowParens": "always", - "parser": "babel", - "jsxBracketSameLine": false, - "overrides": [ - { - "files": "*.{tsx,ts}", - "options": { - "parser": "typescript" - } - }, - { - "files": "*.less", - "options": { - "parser": "less" - } - } - ] + "jsxBracketSameLine": false } diff --git a/.release-it.json b/.release-it.json new file mode 100644 index 00000000000..3f89c68200c --- /dev/null +++ b/.release-it.json @@ -0,0 +1,20 @@ +{ + "github": { + "release": true + }, + "git": { + "commitMessage": "chore: release v${version}" + }, + "npm": { + "publish": false + }, + "hooks": { + "after:bump": "echo Version Upgrade Success. checkout more in CHANGELOG" + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": "angular", + "infile": "CHANGELOG.md" + } + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000000..2ba7db3bd32 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1211 @@ + + +## [1.11.10](https://github.com/msgbyte/tailchat/compare/v1.11.9...v1.11.10) (2025-01-02) + + +### Bug Fixes + +* disable support html tag in markdown ([8e593f7](https://github.com/msgbyte/tailchat/commit/8e593f720009de8c8a0402cac8854a7b9c957fcd)) + + +### Features + +* add file upload in chat usage ([52f70c8](https://github.com/msgbyte/tailchat/commit/52f70c89d5324ccd27640385862a1963e7bafb41)) +* add filter for usage in admin ([d72f878](https://github.com/msgbyte/tailchat/commit/d72f8783526c512234fbe10ea42f42c027d3d198)) +* add rehype-sanitize to protect markdown html from xss ([0e17991](https://github.com/msgbyte/tailchat/commit/0e17991d4f77b26e75974170d1478274984b946d)) + +## [1.11.9](https://github.com/msgbyte/tailchat/compare/v1.11.8...v1.11.9) (2024-11-23) + + +### Bug Fixes + +* fix xss problem when render iframe ([c1365f2](https://github.com/msgbyte/tailchat/commit/c1365f2b82b3bd6d71b5da7e8aac06faf7c99d44)) +* not allow svg ([f74647f](https://github.com/msgbyte/tailchat/commit/f74647fb307c1ccca272dfd4badf61e3fb5f7697)) +* only allow http link in iframe render ([9a327dc](https://github.com/msgbyte/tailchat/commit/9a327dca14b5629731a1f2c847595dc90c4fe594)) + +## [1.11.8](https://github.com/msgbyte/tailchat/compare/v1.11.7...v1.11.8) (2024-10-28) + + +### Bug Fixes + +* fix a issue which markdown component can render meta tag problem ([9998c57](https://github.com/msgbyte/tailchat/commit/9998c57358b31b85bfec5955bcf852e12afe6bfd)) + + +### Features + +* add DISABLE_TRACING env which useful save logs ([55e4f38](https://github.com/msgbyte/tailchat/commit/55e4f3835085b2efe94e177c80c5ceefa030fa95)) +* markdown disable iframe auto play ([16086d1](https://github.com/msgbyte/tailchat/commit/16086d1b77dd158f0ccbd5f4803384b96c676e12)) + + +### Performance Improvements + +* improve file table display in file table ([ab78309](https://github.com/msgbyte/tailchat/commit/ab7830999d000d68f37cee5ccbd36720bcf016ab)) + +## [1.11.7](https://github.com/msgbyte/tailchat/compare/v1.11.6...v1.11.7) (2024-09-07) + + +### Bug Fixes + +* [#252](https://github.com/msgbyte/tailchat/issues/252) disable support custom style in markdown render ([c33dbd2](https://github.com/msgbyte/tailchat/commit/c33dbd241c605b90f79837bc39fc1e7115cb3db5)) +* fix user info is null will crash list problem ([c43a99e](https://github.com/msgbyte/tailchat/commit/c43a99e12969f109876ad8f72dca219563990219)) + + +### Features + +* add DISABLE_INFO_LOG env ([5cc71d0](https://github.com/msgbyte/tailchat/commit/5cc71d02357c78cb4ac34b99f8dc376a3375fdfd)) + +## [1.11.6](https://github.com/msgbyte/tailchat/compare/v1.11.5...v1.11.6) (2024-07-20) + + +### Features + +* add file filter chat files checkbox(use for remove unused chat files) ([c4e70ef](https://github.com/msgbyte/tailchat/commit/c4e70efb61101ee6647bd4c4f4d7207f8400530a)) +* **admin:** add image url preview in admin ([3cea16e](https://github.com/msgbyte/tailchat/commit/3cea16ee601092dd45cc4361f94fd4ac6b85c8d5)) + + +### Performance Improvements + +* add virtual list for friend list [#238](https://github.com/msgbyte/tailchat/issues/238) ([f09f701](https://github.com/msgbyte/tailchat/commit/f09f7017bd3c06b7f5a99720d94e5dc932a2453f)) +* add virtual list of inbox list ([68ea354](https://github.com/msgbyte/tailchat/commit/68ea354e3cb726ee68600091b0600b05ec01a39d)) + +## [1.11.5](https://github.com/msgbyte/tailchat/compare/v1.11.4...v1.11.5) (2024-06-04) + + +### Bug Fixes + +* fix a problem which make disableMsgpack not work ([61184d1](https://github.com/msgbyte/tailchat/commit/61184d1e599495fa3374769a3140d02f5f0c61a0)) + +## [1.11.4](https://github.com/msgbyte/tailchat/compare/v1.11.3...v1.11.4) (2024-06-02) + + +### Bug Fixes + +* [#230](https://github.com/msgbyte/tailchat/issues/230) fix a bug which will occur error tip when invite a user into conversation ([3801bb2](https://github.com/msgbyte/tailchat/commit/3801bb20a8492449a15e54fb916da8078e79359a)) +* rename all disableSocketMsgpack to disableMsgpack ([7870c83](https://github.com/msgbyte/tailchat/commit/7870c835d7d31c976d9f05fa15ec81d2aa526075)) + +## [1.11.3](https://github.com/msgbyte/tailchat/compare/v1.11.2...v1.11.3) (2024-05-11) + + +### Bug Fixes + +* fix quick switcher layer problem and filter group panel type because should not direct open ([6dba794](https://github.com/msgbyte/tailchat/commit/6dba794198575952b3b88e1fbdd8fa3a0d05d07b)) + + +### Features + +* add chat.message.getMessage api ([#227](https://github.com/msgbyte/tailchat/issues/227)) ([34a380e](https://github.com/msgbyte/tailchat/commit/34a380eff546bff3540d6dcd059ed1f901370905)) +* add tianji script environment ([125df13](https://github.com/msgbyte/tailchat/commit/125df13976daec27a9df294e0b496093dc350235)) + +## [1.11.2](https://github.com/msgbyte/tailchat/compare/v1.11.1...v1.11.2) (2024-05-05) + + +### Bug Fixes + +* fix a problem which deleted conversation can not get name occur crash ([88b05da](https://github.com/msgbyte/tailchat/commit/88b05da0c97d3a43f00a8149ab085477f89a942c)) +* fix a problem which user info maybe return null cause error ([96d8cda](https://github.com/msgbyte/tailchat/commit/96d8cda5c3c1809d7319f395130ce8d62ee276b8)) + +## [1.11.1](https://github.com/msgbyte/tailchat/compare/v1.11.0...v1.11.1) (2024-04-14) + + +### Bug Fixes + +* fix command panel cannot click problem ([5c259d7](https://github.com/msgbyte/tailchat/commit/5c259d70049257fc516b08914144ff9d17cbe59c)) +* fix image message context menu cannot save image problem ([a3a442a](https://github.com/msgbyte/tailchat/commit/a3a442a34f1ea465fe8e91813f5be10e67b767be)) +* fix text cannot select part problem and url dont need context menu problem ([a02ad80](https://github.com/msgbyte/tailchat/commit/a02ad80bf177b1c6086e9c6150df744ba2027b84)) + + +### Features + +* add context menu into message item ([a36ca7c](https://github.com/msgbyte/tailchat/commit/a36ca7c4e1f20d6fa6eeb5eefbf1c05d50e8f8d1)) +* add setting for close message context menu ([0107edf](https://github.com/msgbyte/tailchat/commit/0107edfa0cbed744129237d0ea4bf18b5877f2bc)) + +# [1.11.0](https://github.com/msgbyte/tailchat/compare/v1.10.1...v1.11.0) (2024-04-06) + + +### Bug Fixes + +* fix error tip for user cannot add self as friend ([592e4ab](https://github.com/msgbyte/tailchat/commit/592e4ab8bd03f001737d7195759e533799bbd8df)) +* invalid user id will broken all userId info query problem ([de63b31](https://github.com/msgbyte/tailchat/commit/de63b312adf53d8dd9425b213736415be4314dfb)) + + +### Features + +* add group panel quick actions ([c451a09](https://github.com/msgbyte/tailchat/commit/c451a091c33a89da04e6013306efe554c2be3bc8)) +* add quick search button in navbar ([6b0fffb](https://github.com/msgbyte/tailchat/commit/6b0fffb0786a5eb83ef5cb26e748f3198e82194d)) + + +### Performance Improvements + +* improve mention list to make sure its will work fine in huge group ([d79a62b](https://github.com/msgbyte/tailchat/commit/d79a62bf455ce0aa268b8582438433eab4413b6d)) + +## [1.10.1](https://github.com/msgbyte/tailchat/compare/v1.10.0...v1.10.1) (2024-03-17) + + +### Bug Fixes + +* fix bbcode auto transform logic [#196](https://github.com/msgbyte/tailchat/issues/196) ([5f81459](https://github.com/msgbyte/tailchat/commit/5f814594e83ad4be825934b10734aabd825a13d6)) +* fix drag drop feature display area ([92fdccf](https://github.com/msgbyte/tailchat/commit/92fdccfe729b0840872ca97154be43c1a5ae8a3a)) +* fix mention list will not hide member discriminator problem ([d22eabe](https://github.com/msgbyte/tailchat/commit/d22eabeec78002997411ec51aca7943b45e9e879)) + + +### Features + +* add bot tag in group/dm user popover ([1359b6e](https://github.com/msgbyte/tailchat/commit/1359b6eee7fe122e53252c933132364a8c7068f6)) +* add robot to disable invite page fetch by search engine ([67f87e8](https://github.com/msgbyte/tailchat/commit/67f87e84e43d94e03f506770122f61ac3802d3e9)) +* allow @ feature in conversation [#212](https://github.com/msgbyte/tailchat/issues/212) ([3ee37d6](https://github.com/msgbyte/tailchat/commit/3ee37d6bdeb7fe480057470aaaa581ab76483d7b)) + + +### Performance Improvements + +* add friendly tip for add non-message feature bot ([53a05cb](https://github.com/msgbyte/tailchat/commit/53a05cb6bd0e9d5304666c7c6845f463c127d641)) + +# [1.10.0](https://github.com/msgbyte/tailchat/compare/v1.9.5...v1.10.0) (2023-12-09) + + +### Bug Fixes + +* cli smtp test command add close logic and add time in body ([7c8749b](https://github.com/msgbyte/tailchat/commit/7c8749bee7de66ef00f20cfdbf0400547900e2f0)) +* fix route disable if disable plugin store ([ad59c97](https://github.com/msgbyte/tailchat/commit/ad59c971d6e2dbb1c77bbf51418058270541b261)) +* fix the bug where the groupheader drop-down menu may expand upwards ([64c0977](https://github.com/msgbyte/tailchat/commit/64c097761a9efedc512be61f1627e535330f6377)) +* fix topic ack not work problem ([bf88662](https://github.com/msgbyte/tailchat/commit/bf886625a9a37d587e58ff9214cacd00babd2838)) + + +### Features + +* add agora plugin support webrtc permission request ([d290d94](https://github.com/msgbyte/tailchat/commit/d290d94597a681d8843bd91b2590de8ba73f1207)) +* add custom sidebar item ([e73046e](https://github.com/msgbyte/tailchat/commit/e73046e7d540da82eebb703919408225e129bbaa)) +* add debug script inject ([4eedaf8](https://github.com/msgbyte/tailchat/commit/4eedaf87daa1921198798e213a9e2d38167c3441)) +* add device helper for mobile in api ([09200ad](https://github.com/msgbyte/tailchat/commit/09200ad33909d48c31122b88825999e9b4245cbd)) +* add embeding meeting view in mobile when start meeting between conversation ([b97dddf](https://github.com/msgbyte/tailchat/commit/b97dddf60d0d5ffcb9bc0170d6bdb4526b9e18d5)) +* add permission to edit basic info and fixed the bug of incorrect display of group fields ([5d69b32](https://github.com/msgbyte/tailchat/commit/5d69b326b98a7ca7f79831116da99d53da0bf902)) +* add popconfirm for topic delete ([56e97fc](https://github.com/msgbyte/tailchat/commit/56e97fccd73267e4492a1398d4f8ecabd6b2ddf0)) +* add topic delete action ([e012c9e](https://github.com/msgbyte/tailchat/commit/e012c9e20b1c409d0c09fd0de947a43205153137)) +* **mobile:** add webrtc permission grant and allow webrtc service work correct ([3de7fe2](https://github.com/msgbyte/tailchat/commit/3de7fe2c69f4500ac684641b83e10176437a134c)) + + +### Performance Improvements + +* add audio preload for livekit invite call ([18ae4c4](https://github.com/msgbyte/tailchat/commit/18ae4c4aef7e35bff873e2ac6cc5691c8f910f10)) +* add dummy user to avoid unused user info request ([b2d5d06](https://github.com/msgbyte/tailchat/commit/b2d5d063d663b5b58dc5e4041ebaeae47a686c88)) +* hide mobile member button in livekit ([cc04c36](https://github.com/msgbyte/tailchat/commit/cc04c36a86f63331faaec89e197fe23486d992be)) + +## [1.9.5](https://github.com/msgbyte/tailchat/compare/v1.9.4...v1.9.5) (2023-11-20) + + +### Bug Fixes + +* add limit for emotion style to fix transparent panel ([766477a](https://github.com/msgbyte/tailchat/commit/766477ac171be5d1817c8a5beca6bb393d4f1208)) +* fix a bug ban user clean cache will be have a gap between userinfo and token cache [#179](https://github.com/msgbyte/tailchat/issues/179) ([7e239ea](https://github.com/msgbyte/tailchat/commit/7e239ead8675b46becf66222de396cbde06987bb)) +* fixed an issue where the inbox groupId was incorrect when replying in a private conversation ([5b16ff9](https://github.com/msgbyte/tailchat/commit/5b16ff90c9e481a4f463a7c0b928342a7fced6ec)) + + +### Features + +* add action inviteCall in livekit ([087713a](https://github.com/msgbyte/tailchat/commit/087713afbf4aae7c50c139871eae6ecabc16956c)) +* add dark theme support for notification ([aa43d04](https://github.com/msgbyte/tailchat/commit/aa43d0462bb954d54fe920819a3421ffcb78e6ed)) +* add env MINIO_SSL [#172](https://github.com/msgbyte/tailchat/issues/172) ([7be0489](https://github.com/msgbyte/tailchat/commit/7be0489542229bf5d2e202950720dbdb2b7403c9)) +* add fast change role group with group member right click menu manage [#171](https://github.com/msgbyte/tailchat/issues/171) ([ed3e9ca](https://github.com/msgbyte/tailchat/commit/ed3e9ca6d756fda56af6e4e3a18f54dee6786edf)) +* add invite call when start meeting from conversation ([8906b93](https://github.com/msgbyte/tailchat/commit/8906b933d7e0e50e487770da16f296f86636b8de)) +* add livekit call invite notication card and actions ([505c6c3](https://github.com/msgbyte/tailchat/commit/505c6c38eda3d180eb9086c6bc68f02b00301a8c)) +* add livekit meeting context and ([c937178](https://github.com/msgbyte/tailchat/commit/c937178956a119a618da103ce839ac11f78f84bf)) +* add livekit member panel ([19a1e5d](https://github.com/msgbyte/tailchat/commit/19a1e5dbe58346ec9dd7aaffe12cc413a08d7982)) +* add livekit panel for converse dm meeting ([0be2bf6](https://github.com/msgbyte/tailchat/commit/0be2bf6c470cb202acae90c4be3194d98b8549d4)) +* add ref to avoid send invite twice ([67b29ac](https://github.com/msgbyte/tailchat/commit/67b29ac26cac3fbe0512a189f2b5823104ccb9b3)) +* add search friend feature [#157](https://github.com/msgbyte/tailchat/issues/157) ([a7fe82e](https://github.com/msgbyte/tailchat/commit/a7fe82eff341e071597d24229f4fa6b2efae9223)) +* added reload button ([72a68d3](https://github.com/msgbyte/tailchat/commit/72a68d3bdef0726ffa24d3e534081b10fea3d78d)) +* web panel support add background color which useful for transparent background website ([5fe0ff0](https://github.com/msgbyte/tailchat/commit/5fe0ff06d7c9248f3769a9c3294f7485764e5b44)) + + +### Performance Improvements + +* **desktop:** improve server list manager logic ([3a6a729](https://github.com/msgbyte/tailchat/commit/3a6a729e1f17589edd63a7216a3258eed881b70c)) + +## [1.9.4](https://github.com/msgbyte/tailchat/compare/v1.9.3...v1.9.4) (2023-11-06) + +## [1.9.3](https://github.com/msgbyte/tailchat/compare/v1.9.2...v1.9.3) (2023-11-06) + + +### Bug Fixes + +* **desktop:** v0.0.8 fix ipc error problem with import data from other files ([2b329db](https://github.com/msgbyte/tailchat/commit/2b329db0170025e68be1d54de1200a4263e6e4e7)) +* fix iam plugin not fit in light theme in login view ([86ed84a](https://github.com/msgbyte/tailchat/commit/86ed84a83deec6a162101fc7f4c490714bffcd5a)) +* update inject script exec order ([5274d2a](https://github.com/msgbyte/tailchat/commit/5274d2a7b942469998ec4f38834aa021cb05b1d0)) + + +### Features + +* add env REQUEST_TIMEOUT to custom requestTimeout of actions ([d678d0a](https://github.com/msgbyte/tailchat/commit/d678d0a839568f72f8f69e7a001ace7732cc1415)) +* add http cache for static and public files ([eae8d35](https://github.com/msgbyte/tailchat/commit/eae8d350537c8d4bcd2e82e71021abe5edfdecab)) +* add more tip in ai-assistant plugin ([caad90c](https://github.com/msgbyte/tailchat/commit/caad90cd478c2192bb86f2073fb9f6f282321a42)) +* add telemetry to aware of the presence of other deployment instances ([c25d3a0](https://github.com/msgbyte/tailchat/commit/c25d3a0b46bd7ec8a3321cd72e7ee7360a218bff)) +* add text panel message search right panel ([176528b](https://github.com/msgbyte/tailchat/commit/176528b303c5d25f26ad364f2f5c5cdd4d1cff61)) + + +### Performance Improvements + +* add defer for tianji script ([8d8ba6f](https://github.com/msgbyte/tailchat/commit/8d8ba6f345b8bec46dc777996e0ebeed3b53911f)) +* reduce image size ([efd7b4c](https://github.com/msgbyte/tailchat/commit/efd7b4c501e36f8890c45b08f2a6de47ee0b2988)) + +## [1.9.2](https://github.com/msgbyte/tailchat/compare/v1.9.1...v1.9.2) (2023-10-16) + + +### Bug Fixes + +* fix problem which ai assistant will be transparent in popover in light mode ([ffebbf6](https://github.com/msgbyte/tailchat/commit/ffebbf6c4e5981240bc36e117eb9b88ab3eec5c1)) +* fixed the bug where # would appear when typing without rich text plugin being loaded ([e768bd1](https://github.com/msgbyte/tailchat/commit/e768bd11f93e1885e004336d8395a2613380e435)) + + +### Features + +* add electron native webview render support [#152](https://github.com/msgbyte/tailchat/issues/152) ([146952d](https://github.com/msgbyte/tailchat/commit/146952d4f3519fd2dc0a74593b83acbe4f560abc)) +* add file views field to record file get frequency ([46648b4](https://github.com/msgbyte/tailchat/commit/46648b45904c96ceebf13e520612ecd1519d969b)) +* add getDisplayMedia support for desktop [#158](https://github.com/msgbyte/tailchat/issues/158) ([18bc2ed](https://github.com/msgbyte/tailchat/commit/18bc2ed4a6dec3acbb196ca054ea83f9813f5bfa)) +* add hide tip ([0bb1c85](https://github.com/msgbyte/tailchat/commit/0bb1c85f0d23d24d522773ac8c4333792ccf2258)) +* add message.searchMessage api ([235389b](https://github.com/msgbyte/tailchat/commit/235389b394237a26ea505aa7a2ce08e6cb793627)) +* **admin:** allow to delete private message ([915ed01](https://github.com/msgbyte/tailchat/commit/915ed01a5125bf855f7f9f75677d28350cfd65ab)) +* buildRegFn add reset func ([af16ebe](https://github.com/msgbyte/tailchat/commit/af16ebe47b372c313a9267f27d7ccd42d788cfb3)) +* use file save upsert logic rather than insert for avoid duplicate recording of the same file ([9b72fc3](https://github.com/msgbyte/tailchat/commit/9b72fc3ffe981e24ae1079a5e859dd30490ebb78)) + +## [1.9.1](https://github.com/msgbyte/tailchat/compare/v1.9.0...v1.9.1) (2023-09-25) + + +### Bug Fixes + +* fix duplicate key error collection problem in ack update api ([3c1d8ef](https://github.com/msgbyte/tailchat/commit/3c1d8efe03ee95c8d0d102bea02c610cd8368ee5)) +* fix linkmeta bilibili video support [#155](https://github.com/msgbyte/tailchat/issues/155) ([fd904fd](https://github.com/msgbyte/tailchat/commit/fd904fd37c3339176b689b2a3e4a038d1314e591)) +* fix problem of linkmeta will fetch tailchat's url and not match bbcode url ([9411200](https://github.com/msgbyte/tailchat/commit/9411200ae32437d28eed06ac3a6c4717976be7dc)) + + +### Features + +* add clipboard paste handler ([ec23b7b](https://github.com/msgbyte/tailchat/commit/ec23b7bd921e42c7d6041cacecc81c34a6ab6237)) +* add view panel permission which can control panel display for different users [#149](https://github.com/msgbyte/tailchat/issues/149) ([c59e56c](https://github.com/msgbyte/tailchat/commit/c59e56c31a7f4b6421e352444b594829ddbf79a8)) +* **admin:** added total file size statistics ([b26d34e](https://github.com/msgbyte/tailchat/commit/b26d34e8e2e8118941bc5c0fbec0445098401a73)) + +# [1.9.0](https://github.com/msgbyte/tailchat/compare/v1.8.12...v1.9.0) (2023-09-15) + + +### Bug Fixes + +* fix xss attacks caused by security issues in custom web group panels ([81a062a](https://github.com/msgbyte/tailchat/commit/81a062a70b54de42c66cb23e98d44f0741506b3e)) + + +### Features + +* add AdvanceGroupPanelPermission controller ([86ef2d5](https://github.com/msgbyte/tailchat/commit/86ef2d5c20ae0db7120a6b802fcb36f35dda68bb)) +* add component CollapseView ([e85c39e](https://github.com/msgbyte/tailchat/commit/e85c39e570f03c710901beef2aa6e70a7c6c208a)) +* add group panel permission filter in permission ([5f9140d](https://github.com/msgbyte/tailchat/commit/5f9140db9d55136509417bcd62f8a2b32cbc6f95)) +* add permissionMap and fallbackPermissions for group panel permission control ([e731c61](https://github.com/msgbyte/tailchat/commit/e731c61964235c64b563727c006d667414d74faf)) +* add role based send text message permission control ([8b89b26](https://github.com/msgbyte/tailchat/commit/8b89b265c15d709c0d6f19ec91f9ee749a1937ca)) +* remove alpha control for advanced permission control ([650f350](https://github.com/msgbyte/tailchat/commit/650f350350ee022242f81a119e26edf08bfef59a)) + +## [1.8.12](https://github.com/msgbyte/tailchat/compare/v1.8.11...v1.8.12) (2023-09-04) + + +### Bug Fixes + +* [#148](https://github.com/msgbyte/tailchat/issues/148) fix non-mime problem when get file from minio ([98e81fa](https://github.com/msgbyte/tailchat/commit/98e81fa9b7d0d230b2e1b9d96b8de376fbaefe59)) +* fix lost extname problem after compress image ([8f8e8a1](https://github.com/msgbyte/tailchat/commit/8f8e8a1e2f3e75213f110f5b882d1d571a840e4a)) + + +### Features + +* add online status in user popover ([1b813f9](https://github.com/msgbyte/tailchat/commit/1b813f9b82e49b72db2ca155c03eb6565f2a22a6)) +* add raw markdown syntax support for MarkdownRender ([55f8c45](https://github.com/msgbyte/tailchat/commit/55f8c4537a6c046d58d31df9ba2d783acaff0465)) +* add upload image feature ([4d6c70c](https://github.com/msgbyte/tailchat/commit/4d6c70c3cf15a82b56ae02c479cec9583b6a065c)) +* **admin:** add fuzzy search support for user `q` with `nickname` ([923b373](https://github.com/msgbyte/tailchat/commit/923b3734032f89459060b34cb69134b9aedce2e2)) +* allow remove converse from dmlist ([018d311](https://github.com/msgbyte/tailchat/commit/018d311da65ebfe26303d2609fb56775226217d5)) +* markdown editor add dark mode adaptation ([39879c1](https://github.com/msgbyte/tailchat/commit/39879c1413769f31d1d88730db0a983ef60dbefe)) + + +### Performance Improvements + +* optimize small size image display ([c4d3d8c](https://github.com/msgbyte/tailchat/commit/c4d3d8c3fac53955ca75ebe64dc0c8ef3eee6d35)) + +## [1.8.11](https://github.com/msgbyte/tailchat/compare/v1.8.10...v1.8.11) (2023-08-28) + + +### Bug Fixes + +* completion algorithm adds missing offline icons ([509d701](https://github.com/msgbyte/tailchat/commit/509d70195c889625dfe99427f0dcb34644501231)) +* fix add friend button still display when disableAddFriend is open ([5484cb7](https://github.com/msgbyte/tailchat/commit/5484cb7df13bc84bf3f692a47d5a8f6bde35608f)) +* fix linkmeta plugin dont parse {BACKEND} problem ([2b923b4](https://github.com/msgbyte/tailchat/commit/2b923b40b6e3caab60713b6c58a98716ba44417f)) +* fix no friend add button incorrect key problem ([4a06368](https://github.com/msgbyte/tailchat/commit/4a063685d3c3cbe808f363ca290088d47e7e5d48)) +* fix the problem of flickering after modifying user settings ([17464b0](https://github.com/msgbyte/tailchat/commit/17464b0c6f421831913545261937e3011120f944)) +* fix userSettings cache lost then make user settings drop bug ([fe90319](https://github.com/msgbyte/tailchat/commit/fe90319e607dc6fecff085c15ff9b70fff4cb373)) +* **openapi:** fix logoUri must be a a web uri warning problem ([b6e9190](https://github.com/msgbyte/tailchat/commit/b6e91900d8389df924a6898af0dc44c8b2736497)) + + +### Features + +* **admin:** add file delete action which delete minio file also and allow fuzzy match of objectName ([c98dc47](https://github.com/msgbyte/tailchat/commit/c98dc4714d89a8a11a7065cd1e309194cd660f90)) +* **openapi:** add backend image icon support in authorize page ([cfacc65](https://github.com/msgbyte/tailchat/commit/cfacc655f8897ae7a682f9476cf136cddccf0d60)) +* **openapi:** add delete app action ([380bc3d](https://github.com/msgbyte/tailchat/commit/380bc3d960d56509ac16ee32a73926559d1f7d1f)) +* **openapi:** add open app base info ([351641c](https://github.com/msgbyte/tailchat/commit/351641cf338402de76fa4ead814ab2961e89f33c)) +* **openapi:** allow app back action which back to app list ([283888d](https://github.com/msgbyte/tailchat/commit/283888d645554b687bfa65a9fd0e50813bd763ea)) +* **openapi:** allow edit appName, appDesc and appIcon ([e0141f4](https://github.com/msgbyte/tailchat/commit/e0141f4bc435310a6099ac87374bffd4dc90c29a)) + + +### Performance Improvements + +* lock axis on group nav sortting ([7d601f0](https://github.com/msgbyte/tailchat/commit/7d601f0577fd6d2fb80d960f537698feb6aa2c1b)) + +## [1.8.10](https://github.com/msgbyte/tailchat/compare/v1.8.9...v1.8.10) (2023-08-21) + + +### Bug Fixes + +* [#143](https://github.com/msgbyte/tailchat/issues/143) fix message api overreach vulnerability problem ([f7e84ca](https://github.com/msgbyte/tailchat/commit/f7e84cad35492fecbd14cabc905f24878ba07f79)) +* **desktop:** fix cannot flashframe problem ([7cdbe45](https://github.com/msgbyte/tailchat/commit/7cdbe45954be6cd822caa5aa59c1620eea002274)) +* fix badge move when hover and display scrollbar in group nav ([ad9c9f4](https://github.com/msgbyte/tailchat/commit/ad9c9f4f5244358ad81a3493bbdd636250d51d71)) +* fix converse permission check for pluginBot ([5e27ab8](https://github.com/msgbyte/tailchat/commit/5e27ab899ecdd23274c24ae732a3f014fe4202e8)) +* fix danger button color error in light mode ([a430a67](https://github.com/msgbyte/tailchat/commit/a430a670c79db8a4c955d909452bb1131377ac65)) +* fix incorrect cache key of user settings ([778c3a4](https://github.com/msgbyte/tailchat/commit/778c3a4f4b9d4185451f47c83713a8e8cfc467bc)) +* not allowed input should hide action ([464fd7c](https://github.com/msgbyte/tailchat/commit/464fd7c9f8b2a6b79d7979d5064b6c9b768f59d8)) + + +### Features + +* add disableCreateConverseFromGroup in group config ([b3d80c4](https://github.com/msgbyte/tailchat/commit/b3d80c4ef069f0f461cd6d0fc9ac6a73419efb01)) +* **admin:** add refresh in messages ([49678f3](https://github.com/msgbyte/tailchat/commit/49678f3a93aed6eed36bfc1df002e9b94ace43f9)) +* allow create converse from group user popover ([1a8b94e](https://github.com/msgbyte/tailchat/commit/1a8b94eaeda7474a7e259822f29e86effdd2f82e)) + + +### Performance Improvements + +* add persist option for one day to reduce request by react-query cache ([4b0fc66](https://github.com/msgbyte/tailchat/commit/4b0fc66ffbcd9efd5b82264804a6ffbabb6d8491)) +* **admin:** update user avatar preRenderTransform ([0058880](https://github.com/msgbyte/tailchat/commit/0058880cdc61bd02f23fc4dee9b6290188029ead)) +* compress website homepage feature image size ([560c256](https://github.com/msgbyte/tailchat/commit/560c25659891fa09513feac6f1533c9c1cb6bedd)) +* optimize db performance and greatly reduce the time-consuming fetchConverseMessage request ([ad862b7](https://github.com/msgbyte/tailchat/commit/ad862b7991b7bcb019cdec71c149d6f4a74d81b3)) +* optimize the update group configuration interaction under low-speed network ([13d32af](https://github.com/msgbyte/tailchat/commit/13d32afb481826d91814cdee180d7d4143b86804)) +* reduce entry js size ([747a6d3](https://github.com/msgbyte/tailchat/commit/747a6d3afe618d84e7430ed3589ab2acc3bcfd9c)) + +## [1.8.9](https://github.com/msgbyte/tailchat/compare/v1.8.8...v1.8.9) (2023-08-13) + + +### Bug Fixes + +* [#135](https://github.com/msgbyte/tailchat/issues/135) avatar dragging should be disable ([c7334eb](https://github.com/msgbyte/tailchat/commit/c7334ebd4f807cb28dbfa15b43f4e688cec7ed98)) +* fix action repush and will display repeated user ([967e671](https://github.com/msgbyte/tailchat/commit/967e6715215ab9a66f2fc1c81c807d794cbd9896)) +* fix ant badge display which will change avatar dom height ([ee636e6](https://github.com/msgbyte/tailchat/commit/ee636e6cb4d24bc2c4b446553d13206a9e1173ef)) +* fix append group member roles will occur error when operate multi users ([52647a9](https://github.com/msgbyte/tailchat/commit/52647a98b5271c8b1e813aa2bcedbd8ed1723ab1)) +* fix combined avatar render error in two people converse ([1b93bfb](https://github.com/msgbyte/tailchat/commit/1b93bfb698eb586975b111b13aeda96cc3318bf2)) +* fix message ack not trigger update problem ([7900a3e](https://github.com/msgbyte/tailchat/commit/7900a3e17fdb3577f6c1eb734576c6f7997ce21d)) +* fix plugin root route path incorrect problem ([588fae2](https://github.com/msgbyte/tailchat/commit/588fae2e60a2afc6376cd448684d454095dad27e)) +* fix tour will be break when flag DISABLE_CREATE_GROUP is been open ([d1a3523](https://github.com/msgbyte/tailchat/commit/d1a352321554ca49c4f7f7d091da284f390284d7)) +* fixed an issue where the avatar size control could change ([d1035cc](https://github.com/msgbyte/tailchat/commit/d1035cc57c164888ffc946d908f15584500de11f)) + + +### Features + +* [#120](https://github.com/msgbyte/tailchat/issues/120) add group nav item sortable feature ([8f3ec1c](https://github.com/msgbyte/tailchat/commit/8f3ec1c996b1ebb86d88ae3c0fee3b95a08eb86b)) +* add dm create action in sidebar ([8c26856](https://github.com/msgbyte/tailchat/commit/8c268568dcc5a10a3566a4aceff060181b29a71d)) +* add github repo group ensure action which will auto create group and subscribe activity ([c96367f](https://github.com/msgbyte/tailchat/commit/c96367f157eb221952fb7f8358afa48858270b04)) +* add iam proxy support for github ([5b718c4](https://github.com/msgbyte/tailchat/commit/5b718c4b040c4ede099467dbb0f4f5e8232747a8)) +* add the multi converse strategy, create a multi converse without reusing past converse ([edc076f](https://github.com/msgbyte/tailchat/commit/edc076f430d8c418e0049501b6ac0f00aa99c3b2)) +* converse suppport order with message, and add more checker for local message ([2468d45](https://github.com/msgbyte/tailchat/commit/2468d45c66d33879e9dd38e776ad5666f8e7927b)) + + +### Performance Improvements + +* add offline icons sort ([cbfb7c8](https://github.com/msgbyte/tailchat/commit/cbfb7c8449d9d1249c512203ed9c8e8143309dac)) +* optimize group drag positioning ([2adfe92](https://github.com/msgbyte/tailchat/commit/2adfe923af3d6b0dbb88f375f05d50708513873a)) +* optimize low-speed networking to send message ([4506a63](https://github.com/msgbyte/tailchat/commit/4506a63db086543a6f9bbc6f3b48222a6bfc5103)) + +## [1.8.8](https://github.com/msgbyte/tailchat/compare/v1.8.7...v1.8.8) (2023-08-06) + + +### Bug Fixes + +* filter summary messages will bypass recall message problem ([3f06e3d](https://github.com/msgbyte/tailchat/commit/3f06e3d35e83207d8623f86a8eb6f1ecca640336)) +* fix badge in sidebaritem bouncing when hover ([c045475](https://github.com/msgbyte/tailchat/commit/c045475f6293c40258703917afc4aa4f03cb54db)) +* fix problem which allow operate to local message ([9fb0246](https://github.com/msgbyte/tailchat/commit/9fb024659b9d8b21889c6919cb8d5de3e6841dbd)) + + +### Features + +* add friend nav item badge when has unprocess friend request ([bc36cb0](https://github.com/msgbyte/tailchat/commit/bc36cb06651c3ca21662aaebfc9210f3aba138f1)) +* add grouping by status to member list ([288f5a6](https://github.com/msgbyte/tailchat/commit/288f5a61e8999eb7d13b7c5593babc842ba87631)) +* add i18n support for antd and WebFastifyForm ([63c203e](https://github.com/msgbyte/tailchat/commit/63c203e8973d1203be0b9ef5b14b6ac7b8aba002)) +* add local message to avoid network error which occur repeat send same message ([9bb931a](https://github.com/msgbyte/tailchat/commit/9bb931aa5d57e1e158b1bdefda61cef3f2908f2f)) +* add person icon badge when has unprocessed friend request ([1b84143](https://github.com/msgbyte/tailchat/commit/1b84143bbe73a4f0d578d89bf14c9df040ccb945)) +* add plugin which can auto join group after register or createTemporaryUser ([1084913](https://github.com/msgbyte/tailchat/commit/1084913d3a43aa1c3c06add37e66c0765d6cc9d0)) +* **admin:** add analytics page ([39e0b2c](https://github.com/msgbyte/tailchat/commit/39e0b2cee77e2da02a2824bc4af3ac1b883f558e)) +* **admin:** add operate which can add group member ([8df7b47](https://github.com/msgbyte/tailchat/commit/8df7b47c07c050f6debfb1e36fb49029566186af)) +* **admin:** allow create group through admin ([58f7144](https://github.com/msgbyte/tailchat/commit/58f7144c315736b23c2d06fcfecd5e8a9714e27a)) +* **admin:** allow search user and group with id ([5099170](https://github.com/msgbyte/tailchat/commit/50991708f2611e1b207755adc79c08d29a36946a)) + + +### Performance Improvements + +* optimize the loading experience of the web panel ([7db9d63](https://github.com/msgbyte/tailchat/commit/7db9d63349d18357c18ff54eaec9be69825a63a0)) + +## [1.8.7](https://github.com/msgbyte/tailchat/compare/v1.8.6...v1.8.7) (2023-07-30) + + +### Bug Fixes + +* **admin:** fix number problem in group member count ([59ad340](https://github.com/msgbyte/tailchat/commit/59ad34082c7c6b4cd3bf29b7d6069f2262050589)) +* fix tailchat-client-sdk dependencies problem ([c80e619](https://github.com/msgbyte/tailchat/commit/c80e61949c185ea380a258ae2f907ea6cb0eb584)) + + +### Features + +* add for voice channel ([79a5b76](https://github.com/msgbyte/tailchat/commit/79a5b76ba4e79324010b570e1d9c92e4855e8c1c)) +* add alioss or other s3 protocol external storage support [#104](https://github.com/msgbyte/tailchat/issues/104) ([5849978](https://github.com/msgbyte/tailchat/commit/584997826b2544170e57a81ab8bb73fc4a4c529e)) +* add fullscreen btn to make dom full screen ([4054489](https://github.com/msgbyte/tailchat/commit/4054489eafa605a992afc70915603d5c8c1f92c2)) +* add group badge for current room participants ([d99e556](https://github.com/msgbyte/tailchat/commit/d99e556c796fdc7fcbc4b5975d302cb6f581915e)) +* add keep alive overlay for livekit view ([3a56d13](https://github.com/msgbyte/tailchat/commit/3a56d13da75c9786a3dede68aab68a2d22fbf13c)) +* add leave pre room when join new room ([fe3b68f](https://github.com/msgbyte/tailchat/commit/fe3b68fb752f47ec715511c490ec9182dedb5344)) +* add livekit into production env ([263be66](https://github.com/msgbyte/tailchat/commit/263be66d335f66356b806ab053e3b81e17ec69d9)) +* add navbar icon which can jump to active panel ([95c589d](https://github.com/msgbyte/tailchat/commit/95c589df4fdc7dbaeaa45ba29d31fc3df29b70d8)) +* add roomMembers list in prejoin view ([d68f75b](https://github.com/msgbyte/tailchat/commit/d68f75b49135a747a3f388bc800e4c4967f59316)) +* **admin:** add type and emailVerified field in user list ([a56f412](https://github.com/msgbyte/tailchat/commit/a56f412995cedbeede8f006fcbba3bc0239e7ecf)) +* **livekit:** add basic room and service endpoint ([78407f0](https://github.com/msgbyte/tailchat/commit/78407f04d56dec2a0b501f41c58697f915e61a80)) +* **livekit:** add livekit webhook receiver ([3610b79](https://github.com/msgbyte/tailchat/commit/3610b796ec6559dc0c0a6dd0e1b153cbcd9a7261)) +* **livekit:** add long dependency ([80347f9](https://github.com/msgbyte/tailchat/commit/80347f9c4181ddd1d37a517c59c4a21067c615ba)) +* regCustomPanel add useIsShow props to hide icon ([c7497cc](https://github.com/msgbyte/tailchat/commit/c7497cc79e89dbcf3220ed986e481e7538039a06)) +* rewrite all videoconference components. support useravatar and i18n ([8eca54a](https://github.com/msgbyte/tailchat/commit/8eca54a77b50970c1e1ab353975643fccce44218)) + +## [1.8.6](https://github.com/msgbyte/tailchat/compare/v1.8.5...v1.8.6) (2023-07-24) + + +### Bug Fixes + +* fix i18n problem in about panel ([542e029](https://github.com/msgbyte/tailchat/commit/542e0292ca04659a40715ad879fbb6e80eca98db)) + + +### Features + +* add TailchatWsClient and update tailchat-types ([924f644](https://github.com/msgbyte/tailchat/commit/924f644d49c6b56190854ac111ec156f2b0c44b9)) +* add tushan icon in about page ([a88c3a6](https://github.com/msgbyte/tailchat/commit/a88c3a62a8fa6c484995e53c26fc42ddcbf1a69a)) +* **desktop:** add flash frame when receive message ([bf5c040](https://github.com/msgbyte/tailchat/commit/bf5c0405153f90e24c54889d3da4fb55147a2d1e)) +* **electron:** add auto upgrade version check ([5305b31](https://github.com/msgbyte/tailchat/commit/5305b31ebd18cc9788f79024776e0f93f396dc49)) + + +### Performance Improvements + +* append missed offline icons ([a17fe34](https://github.com/msgbyte/tailchat/commit/a17fe349d3a2eba8277e47b270f2dd6945fb22ac)) +* **desktop:** reduce logo png size ([9d24b10](https://github.com/msgbyte/tailchat/commit/9d24b10f5101eec3a7100dadb53d5d585943e084)) +* optimize page loading timing, and allow refresh on resource loading issues ([f48ecfb](https://github.com/msgbyte/tailchat/commit/f48ecfb9e80aaab90d4def95c4e43789f8a927d4)) +* optimize the avatar text performance of the `com.msgbyte.genshin` plugin ([734afff](https://github.com/msgbyte/tailchat/commit/734afff15d8131234db294fe48a50b0c426f6e73)) +* reduce instance number in docker-compose ([920cbf6](https://github.com/msgbyte/tailchat/commit/920cbf6a448339348b27c384b7ba9e95e56d8a44)) +* remove admin-old to reduce image size ([6f57f80](https://github.com/msgbyte/tailchat/commit/6f57f80f578c621e21d7f3150bc6bf23bcdb61e3)) + +## [1.8.5](https://github.com/msgbyte/tailchat/compare/v1.8.4...v1.8.5) (2023-07-19) + + +### Bug Fixes + +* [#106](https://github.com/msgbyte/tailchat/issues/106) fixed maybe xss attack from custom web html panel ([6d16e09](https://github.com/msgbyte/tailchat/commit/6d16e09ae1ea8e01257ae112fdf5f429e922cb88)) +* add fallback for github account which maybe not include name in github ([bd4907d](https://github.com/msgbyte/tailchat/commit/bd4907dfe537d9d33677e88ce420c7a64c044c0a)) +* add plugin list maybe repeat problem ([b129cd7](https://github.com/msgbyte/tailchat/commit/b129cd78874668d2d7ae1e1d402b1e83d6e07f46)) +* added forceUploadOriginImage to force specify whether to enable image compression ([a224ac6](https://github.com/msgbyte/tailchat/commit/a224ac602eb0288557c6e340e438a309c9e9ac6d)) + + +### Features + +* add broadcast notify when call config.setClientConfig ([5ca5c76](https://github.com/msgbyte/tailchat/commit/5ca5c765b847ef28664eeedc38894d711137d4a4)) +* add global announcement ([798abeb](https://github.com/msgbyte/tailchat/commit/798abeb1ec700ed4dfd04f4359c4c11e655b20e2)) + + +### Performance Improvements + +* **admin:** cache management segmentation ([fba1b26](https://github.com/msgbyte/tailchat/commit/fba1b261ee298cea911f4c0246057b69de6f5a8d)) +* optimize the display of global notifications and increase system notification prompts ([7419df1](https://github.com/msgbyte/tailchat/commit/7419df17758bb7ece70b2007931d066e38c4a5f6)) +* optimize the performance of the member list in the case of large data ([4c77d14](https://github.com/msgbyte/tailchat/commit/4c77d144e8c0d086c457966092281326a237ba91)) +* update custom web panel render xss rules ([fd18eb7](https://github.com/msgbyte/tailchat/commit/fd18eb70301de2ce3c9265e2986c14a3e2c0d356)) +* use group extra to storage custom web panel html ([721da6f](https://github.com/msgbyte/tailchat/commit/721da6f34c8ab93aaa5d4dd6bb422a74480397fc)) + +## [1.8.4](https://github.com/msgbyte/tailchat/compare/v1.8.3...v1.8.4) (2023-07-14) + + +### Bug Fixes + +* [#102](https://github.com/msgbyte/tailchat/issues/102) fix non-email github account login cannot register problem ([a0cbc45](https://github.com/msgbyte/tailchat/commit/a0cbc45760cf0f3b8743f1e410934c88eaa29fa2)) +* add invite code generate check to avoid duplicated invite code ([b6e978e](https://github.com/msgbyte/tailchat/commit/b6e978e569750dfb467e0ed4595bbd380d180161)) +* fix discover server card color schema fit ([480a1e3](https://github.com/msgbyte/tailchat/commit/480a1e344209a8ac9dbc21e88eab7e06883cf73c)) +* fix problem if send message throw error will clear input message ([1a81281](https://github.com/msgbyte/tailchat/commit/1a81281ad1e18a175439827bd8c8a1bce2397b36)) +* fix unupdate problem in group invite code create action ([9bb4b30](https://github.com/msgbyte/tailchat/commit/9bb4b301434a3250ea86e01a889183f197f9bfeb)) + + +### Features + +* add clear button for group background image ([4028f46](https://github.com/msgbyte/tailchat/commit/4028f46083775bbaed2139b44a66577bdd735b48)) +* add create invite code edited data update. now can review changed info ([f44a5c9](https://github.com/msgbyte/tailchat/commit/f44a5c9ec0696d1d6bdcbda5dc13b0e624e767b0)) +* add env DISABLE_PLUGIN_STORE which will hide plugin store entry ([51c7111](https://github.com/msgbyte/tailchat/commit/51c7111621d20a5545ca2964176c9355a8cd094a)) +* add feature disableAddFriend which can disable add friends ([36061f6](https://github.com/msgbyte/tailchat/commit/36061f6b740cf23fa663139ae71fbee2a4e99ee6)) +* add group background image in invite ([947d056](https://github.com/msgbyte/tailchat/commit/947d05697afdd0acdeb1c67c8ae54a2e7dd12bf9)) +* add invite code usage limit for every invite code ([738eb75](https://github.com/msgbyte/tailchat/commit/738eb750039a0f56ad3ea68df894f46554a81e56)) +* add jump to button for joined groups in discover ([2128c01](https://github.com/msgbyte/tailchat/commit/2128c019c41a220131e91851968289792e424706)) +* add unique index for group invite code ([8c1c03e](https://github.com/msgbyte/tailchat/commit/8c1c03e91dd81c9d3bf552f915d67d613c87a03c)) +* **desktop:** add menu and shortcuts to reload page ([0c8da55](https://github.com/msgbyte/tailchat/commit/0c8da55a2cbca8efe863ae1b38472cc523eccc86)) +* **desktop:** when file download completed, open folder ([2e48935](https://github.com/msgbyte/tailchat/commit/2e489351c15f2b6753babedbfe6b4b8de9d28418)) + + +### Performance Improvements + +* add url link for github subscribe message ([0d67261](https://github.com/msgbyte/tailchat/commit/0d6726111d182e2eb26a69d3cc94ec680d0e2331)) +* Remove linkmeta plugin based on performance considerations ([03e8ce1](https://github.com/msgbyte/tailchat/commit/03e8ce132ff05c8c36c543fe1205063b487a54c4)) + +## [1.8.3](https://github.com/msgbyte/tailchat/compare/v1.8.2...v1.8.3) (2023-07-10) + + +### Bug Fixes + +* **admin:** fix import problem in import plugin model ([6afde58](https://github.com/msgbyte/tailchat/commit/6afde58c60f643bb50d35a933d875f37efde33be)) +* append some ignored offine icons ([487bff7](https://github.com/msgbyte/tailchat/commit/487bff78f9b63f1014cbdf0f04f0b1b60f85d6ca)) +* fix ci problem, update lockfile ([1384e49](https://github.com/msgbyte/tailchat/commit/1384e4957c94e4a7c541785e0a2f74716b61b47a)) +* fix NavItem badge move when display scrollbar problem ([4fdd876](https://github.com/msgbyte/tailchat/commit/4fdd8766af993834766f1b4ae2b92f41079d41f6)) + + +### Features + +* [#76](https://github.com/msgbyte/tailchat/issues/76) add offline icons plugin which will prefetch icons from iconify ([25a5c41](https://github.com/msgbyte/tailchat/commit/25a5c41bfc4ac620a7f5302808589b5e157bf5c3)) +* add com.msgbyte.discover plugin as published plugin ([bc5c522](https://github.com/msgbyte/tailchat/commit/bc5c522a775abbf0f217e52cc9888bd3163363da)) +* add discover plugin basic web page ([e507aae](https://github.com/msgbyte/tailchat/commit/e507aaee9d65b95bb3097dc029e51b39b5d270a0)) +* add discover server card and join action ([f943edf](https://github.com/msgbyte/tailchat/commit/f943edf3fe440d2d28489ad17d5c8bf2c8489e38)) +* add group description ([065f7d4](https://github.com/msgbyte/tailchat/commit/065f7d44c8ab853fea42ebcab835b3ec00fe8448)) +* add member count in group summary ([7b699ca](https://github.com/msgbyte/tailchat/commit/7b699ca606069e5e5741bf1979b732d645f7dfb6)) +* **admin:** add discover resource manager ([54c2676](https://github.com/msgbyte/tailchat/commit/54c2676d23b84050e9643cded1ad6a5753c32e4e)) +* plugin discover add error handle and add description ([f766d33](https://github.com/msgbyte/tailchat/commit/f766d33bb3ec11acc47d3895dd6c8c9c335d48d7)) +* **plugin:** add bo data fallback in discover ([d77eef4](https://github.com/msgbyte/tailchat/commit/d77eef44ff192f7da8ad92275ccef9c1865e7105)) + + +### Performance Improvements + +* add com.msgbyte.linkmeta plugin into builtin plugin list ([4c2f883](https://github.com/msgbyte/tailchat/commit/4c2f88352daa4402fe6be639babd3b1880c0a3d4)) +* add getGroupBasicInfo request cache ([2709beb](https://github.com/msgbyte/tailchat/commit/2709beb2d8c67bdfea2c997f12d534e0290a912a)) +* **admin:** change admin summary days from 7 to 14 ([94090e6](https://github.com/msgbyte/tailchat/commit/94090e666404d655ea1c674edd5ae351c47b787e)) +* **discover:** add text wrap in card desc ([9b63be6](https://github.com/msgbyte/tailchat/commit/9b63be60e64fe89fe36d02f30168c506ed5c870e)) +* fix ai-assistant answer too long problem ([b419f44](https://github.com/msgbyte/tailchat/commit/b419f44d1990edb02611c80ebd3e87ed0e2a044a)) + +## [1.8.2](https://github.com/msgbyte/tailchat/compare/v1.8.1...v1.8.2) (2023-07-05) + + +### Bug Fixes + +* **admin:** fix dashboard color conflict problem ([9f6d10c](https://github.com/msgbyte/tailchat/commit/9f6d10cb2829cdd211db8688d779d45fab37a89f)) +* fix auth http client not pass storage key problem [#98](https://github.com/msgbyte/tailchat/issues/98) ([eec3a79](https://github.com/msgbyte/tailchat/commit/eec3a798995c905f0d34cf2f2c67c9a9cab2c339)) +* **mobile:** fix name error when fetch serverName ([3a03c71](https://github.com/msgbyte/tailchat/commit/3a03c7124fac265d95be183967b9769b5c7a61d3)) + + +### Features + +* create discover plugin and define db schema ([4cd2267](https://github.com/msgbyte/tailchat/commit/4cd2267d6490137085aedbffb4467066c2810dd9)) +* **desktop:** support add server and remove server ([b7e720d](https://github.com/msgbyte/tailchat/commit/b7e720dd68f5d913e92e8fe2949714c9aeaaeaeb)) + +## [1.8.1](https://github.com/msgbyte/tailchat/compare/v1.8.0...v1.8.1) (2023-07-03) + + +### Bug Fixes + +* fix audio.play() error throw which will marked as Unhandled ([741e9f7](https://github.com/msgbyte/tailchat/commit/741e9f7983748ff9aea7a04c8f31b3622b3f65bf)) +* fix builtin plugin cannot load with {BACKEND} ([05aae65](https://github.com/msgbyte/tailchat/commit/05aae656a2995260d8b96fce026d705c5056c0c9)) +* fix translation problem ([b038c5a](https://github.com/msgbyte/tailchat/commit/b038c5adf36c87f658a173f9f7b0d2ae05fa4f8d)) +* **iam:** fix account existed problem ([d906322](https://github.com/msgbyte/tailchat/commit/d906322eb4dcdae6ce2be2e06dc7f0a08e43c661)) + + +### Features + +* add chat.inbox.batchAppend action which can batch add inbox item ([3ad1e44](https://github.com/msgbyte/tailchat/commit/3ad1e4410cd85fc3374b1d0f8517d65ae0c445c8)) +* add env `DISABLE_CREATE_GROUP` which can control user allow create group ([2e56139](https://github.com/msgbyte/tailchat/commit/2e56139925dbaaa70556e8d46acb9c6268b071b3)) +* add fim plugin and add github oauth strategy ([b64d037](https://github.com/msgbyte/tailchat/commit/b64d037b60f26d2d8c234d6d2951400d2a159060)) +* add fim record provider create / search and sign token ([ed1d7cc](https://github.com/msgbyte/tailchat/commit/ed1d7cc1d629fee2c7118fd8fa87a5797b98a536)) +* add markdown inbox item which help to develop system notice ([a1048b7](https://github.com/msgbyte/tailchat/commit/a1048b77fd11413b9c388c35cd067bc7fe6b048b)) +* add nickname edit in register view ([40b0076](https://github.com/msgbyte/tailchat/commit/40b007698f478c7bc5d14a608c7ff546bc04a8e3)) +* add plugin com.msgbyte.env.electron ([eb83f78](https://github.com/msgbyte/tailchat/commit/eb83f784a1d4e67040d400652c077b7e8998346f)) +* **admin:** add MarkdownEditor ([ca95a0d](https://github.com/msgbyte/tailchat/commit/ca95a0dac78402b6c08b344a3af27190a1727255)) +* **admin:** add system notify ([4498453](https://github.com/msgbyte/tailchat/commit/449845315e0042eec9443c0f853ee12c99441bcb)) +* **desktop:** add desktop inject ([27eee90](https://github.com/msgbyte/tailchat/commit/27eee90034cfa5714d659c25457d40b70312b343)) +* **desktop:** add screenshot button in chatbox at electron env ([aebcd0d](https://github.com/msgbyte/tailchat/commit/aebcd0d130877f27c240aa7449ebdabddd286ef8)) +* **fim:** add avatar storage and enable fim ([a8bb744](https://github.com/msgbyte/tailchat/commit/a8bb744bfd343dec70a622c0230fb09552ee1c98)) +* **fim:** add fim login callback ([f6ef59e](https://github.com/msgbyte/tailchat/commit/f6ef59e37d4563ed23de4a6ed3a3ad9a44e7653e)) +* github oauth login view ([e81e7ad](https://github.com/msgbyte/tailchat/commit/e81e7ad64f76ac33584eeb5c7db96de1709a222c)) +* iam plugin add into builtin plugin ([e0d6738](https://github.com/msgbyte/tailchat/commit/e0d673867725278a8e6132da1e11b65e900be5d7)) +* **iam:** added a security policy that allows setting domain name verification for passing tokens ([9ae787f](https://github.com/msgbyte/tailchat/commit/9ae787f42b116a1a5d27afe94191f796a695b286)) + + +### Performance Improvements + +* beautify dashboard chart color ([fd9787f](https://github.com/msgbyte/tailchat/commit/fd9787f77bc6588eb0a6365e1e59843f3080cade)) +* beautify github repo star message with emoji ([22651c7](https://github.com/msgbyte/tailchat/commit/22651c74bf86f7c603c7d4d6cd0fbbd0835e5f6c)) + +# [1.8.0](https://github.com/msgbyte/tailchat/compare/v1.7.6...v1.8.0) (2023-06-21) + + +### Bug Fixes + +* fix problem on bbcode value maybe include space ([b47a22b](https://github.com/msgbyte/tailchat/commit/b47a22b51f2f05e9925b637f2e6b31a36637b00e)) +* remove admin-next in source code ([c4b1af5](https://github.com/msgbyte/tailchat/commit/c4b1af5e626f79184c96594e7aa34bb40547f14a)) + + +### Features + +* add batch delete ([bde3665](https://github.com/msgbyte/tailchat/commit/bde36656d5a968bbddc0302d1fd2e34b62f9e14e)) +* add group panel in PanelRoute ([99f6793](https://github.com/msgbyte/tailchat/commit/99f679363f4148018fd910999b6542d484fde19a)) +* add limit for temporary to verify email ([3f6c3b0](https://github.com/msgbyte/tailchat/commit/3f6c3b08d8b364d1b3727754aeea379fda78f1b7)) +* add preRenderTransform in field file.url ([886e274](https://github.com/msgbyte/tailchat/commit/886e274a52e35761302702029b5a773ca70a757b)) +* **admin-next:** add resetPasswordTip ([de357bd](https://github.com/msgbyte/tailchat/commit/de357bd4e7bc409c15d213b1878fd0e0286c4c22)) +* **admin-next:** add system user fields support ([2796a7d](https://github.com/msgbyte/tailchat/commit/2796a7d38a7866a010af5ec86def68fe3b8426c3)) +* **cli:** add `smtp test` command which help user send test email full ([5bfa5b9](https://github.com/msgbyte/tailchat/commit/5bfa5b91bfbc1d529b4ba257960427c588d09e5c)) +* **cli:** add benchmark connections and register command ([9524502](https://github.com/msgbyte/tailchat/commit/9524502d7050c7beb6a4cdaf8f6775c04366bd46)) +* **cli:** add message revice test ([d096821](https://github.com/msgbyte/tailchat/commit/d09682139fa785ef3b0da1f82fcd414a338a7295)) +* **cli:** cli benchmark connections add progress ([77e6927](https://github.com/msgbyte/tailchat/commit/77e6927cf02601127f8311c0d0f00590867aac04)) +* health add more context ([8a9dd4f](https://github.com/msgbyte/tailchat/commit/8a9dd4f65c20675cbea99c0c4e516aa520771b9a)) + + +### Performance Improvements + +* beautify the visual experience of message text on windows [#41](https://github.com/msgbyte/tailchat/issues/41) ([2f0c8b2](https://github.com/msgbyte/tailchat/commit/2f0c8b2a265d1ed13b6a425b6bfd84cb063d2987)) +* **cli:** optimize the experience of the benchmark command ([2d6eaac](https://github.com/msgbyte/tailchat/commit/2d6eaac96a1205c6762ee927054ca66969421d14)) + +## [1.7.6](https://github.com/msgbyte/tailchat/compare/v1.7.5...v1.7.6) (2023-06-07) + + +### Bug Fixes + +* fix friend struct changed problem in `FriendPicker` ([fa49886](https://github.com/msgbyte/tailchat/commit/fa498867c4a40f023cdb613c9137a831fad146db)) + + +### Features + +* add ban user ([ea3ad15](https://github.com/msgbyte/tailchat/commit/ea3ad15f5fd8e5669b713d1c73f2d7b67211e991)) +* add friend nickname set model and api ([7029e67](https://github.com/msgbyte/tailchat/commit/7029e67f0cc8785f3bd7a30251ce2e8cdad5fb76)) +* add friend nickname support in everywhere ([20c16ad](https://github.com/msgbyte/tailchat/commit/20c16adeec66582943f952c4303a896993ea4bc4)) +* add mention support friend nickname ([902ab8f](https://github.com/msgbyte/tailchat/commit/902ab8f422a8580e8d7c394bf0ef21a0d6a3d4e9)) +* add message count ([db52b3d](https://github.com/msgbyte/tailchat/commit/db52b3d5d527e850609393bbf7287458eb3b0384)) +* add unban operation ([1b880a5](https://github.com/msgbyte/tailchat/commit/1b880a50518fb5876783b09f8e477291802e0c82)) +* **admin-next:** add cache manager ([0d7d71d](https://github.com/msgbyte/tailchat/commit/0d7d71d22f5a81f1a6ac5d4f08a8c4701229d530)) +* **admin-next:** add disableGuestLogin and disableUserRegister in admin/config ([43cc8e3](https://github.com/msgbyte/tailchat/commit/43cc8e34a3c0960feff7ccaa6ba97359cb990d0e)) +* **admin-next:** add user count chart ([54a7340](https://github.com/msgbyte/tailchat/commit/54a73403d73ff1acc55e4a41d49a6f1c841d533f)) +* mail record createdAt and updatedAt ([4d6e85c](https://github.com/msgbyte/tailchat/commit/4d6e85c849ee1cf8f671de33a74ea4afd28ba741)) + + +### Performance Improvements + +* **admin-next:** perf message content and id field ([e0a22e0](https://github.com/msgbyte/tailchat/commit/e0a22e01be286a1c33306a657ab3011b3bcbe389)) + +## [1.7.5](https://github.com/msgbyte/tailchat/compare/v1.7.4...v1.7.5) (2023-05-27) + + +### Bug Fixes + +* fix check logic in getGroupUserPermission ([bad6aa0](https://github.com/msgbyte/tailchat/commit/bad6aa05fadcececafdf129254f35c5ef5f6b05e)) + + +### Features + +* add preRenderTransform to parse avatar url and add reference field ([1ae5770](https://github.com/msgbyte/tailchat/commit/1ae5770603c7129490798cdf1e1f306368b2daaa)) +* **admin-next:** custom admin header and footer ([7f08f54](https://github.com/msgbyte/tailchat/commit/7f08f5408cd8a6f53b7235805f5178e0a0eff977)) +* jump to login page in invite view ([9868d24](https://github.com/msgbyte/tailchat/commit/9868d24ad569e077a678a63be5e81c7e6a16a408)) + +## [1.7.4](https://github.com/msgbyte/tailchat/compare/v1.7.3...v1.7.4) (2023-05-24) + + +### Bug Fixes + +* fix after hook not work problem ([3f22037](https://github.com/msgbyte/tailchat/commit/3f220373c7471abccba1951fe556453e804d8535)) +* fix updateGroupConfig not work problem ([ff86b84](https://github.com/msgbyte/tailchat/commit/ff86b84c14c631c2b9f91c098a7fcb2f69b9dcd7)) +* fix website title with global config ([0922f83](https://github.com/msgbyte/tailchat/commit/0922f83bb92ddea1ed4fcc8ae8bac90a387624f0)) +* fix will input enter when send image with enter key ([98e78e2](https://github.com/msgbyte/tailchat/commit/98e78e28f87a24c498b3e76ba5048affbf286a6a)) + + +### Features + +* add cache refresh when load user popover ([0b116e5](https://github.com/msgbyte/tailchat/commit/0b116e54060049fe2e2e0383108a26fdef66020b)) +* add group data get and save action in group.extra ([d83300e](https://github.com/msgbyte/tailchat/commit/d83300e141e0a5e44479fdb6c3860baa87e5cff2)) +* add multi line support for chatbox ([7b17614](https://github.com/msgbyte/tailchat/commit/7b176141be79a4bd223b9900161a7b96f1fca8b2)) +* add regPluginGroupConfigItem ([41cdfb0](https://github.com/msgbyte/tailchat/commit/41cdfb071514fd062faf2185820042c47a31a236)) +* add sender nickname in wxpusher ([5b238bf](https://github.com/msgbyte/tailchat/commit/5b238bf860d20bf4e99ead656a8083129bff16ef)) +* add welcome plugin for user which can send welcome message when user join group ([dbebbc5](https://github.com/msgbyte/tailchat/commit/dbebbc54e66172653006a002c03b8932cb9d8ed2)) +* **admin-next:** add custom dashboard ([4ee2fa8](https://github.com/msgbyte/tailchat/commit/4ee2fa81e2a49ff52dde730002091f5457c583be)) +* **admin-next:** add custom translation ([ba28719](https://github.com/msgbyte/tailchat/commit/ba287195b5e7ca89302f1ad227e1939ca5029688)) +* **admin-next:** add mail ([60b050d](https://github.com/msgbyte/tailchat/commit/60b050d416599b0be84a4b9d2eaf3df3e38fb4a1)) +* **admin-next:** add reset password ([26f4c6a](https://github.com/msgbyte/tailchat/commit/26f4c6a8646f495bf3bea5cd465fc30ba6e2b5d8)) +* **cli:** add smtp tools which help user positioning issue ([e357d2e](https://github.com/msgbyte/tailchat/commit/e357d2e1c56e4db376e2b1b29139581e4b32596d)) + + +### Performance Improvements + +* **admin-next:** optimize mongodb's performance on statistical quantities ([11154f7](https://github.com/msgbyte/tailchat/commit/11154f735b3ddbfcb33f4b6819ec78993e8a2044)) + +## [1.7.3](https://github.com/msgbyte/tailchat/compare/v1.7.2...v1.7.3) (2023-05-11) + + +### Features + +* patch moleculer ([467a13c](https://github.com/msgbyte/tailchat/commit/467a13c5b043889c234a816929b371ae506ffd99)) + +## [1.7.2](https://github.com/msgbyte/tailchat/compare/v1.7.1...v1.7.2) (2023-05-10) + + +### Bug Fixes + +* resolve zIndex problem which will make zIndex level incorrect ([52f1534](https://github.com/msgbyte/tailchat/commit/52f153472f075c214cc10d52f9e2d6d09921ca77)) +* upgrade level with zIndex in PageContent ([c902731](https://github.com/msgbyte/tailchat/commit/c902731aec4ebba3f4f1c5f0640366e09f67d958)) + + +### Features + +* add AI Assistant plugin for Tailchat with ChatGPT ([060d07a](https://github.com/msgbyte/tailchat/commit/060d07ae8ee36dcf088ad253a18e6cabcd80f4d7)) +* add starred event push for github service ([2b20aee](https://github.com/msgbyte/tailchat/commit/2b20aee3dd58c0ef00bd1209bf72f68e69bb59cb)) +* **admin-next:** add custom routes ([ef88363](https://github.com/msgbyte/tailchat/commit/ef88363bbf0ade9d328164543a665d45cd98dc90)) +* **admin-next:** add file list ([d68108b](https://github.com/msgbyte/tailchat/commit/d68108b21a1b7e9da6edf56d0bc41443927fe461)) +* **admin-next:** add message and group list ([65e7cfe](https://github.com/msgbyte/tailchat/commit/65e7cfe11647dc785d03014423c7e86c03d8fa23)) +* **ai:** add message summary ([12c8813](https://github.com/msgbyte/tailchat/commit/12c8813b68d174d3ecfcc28533ea4c2c6c49a150)) +* **ai:** add output apply ([00c45d3](https://github.com/msgbyte/tailchat/commit/00c45d305024301ffb4ec13e17ab5efadc6fe8e5)) + +## [1.7.1](https://github.com/msgbyte/tailchat/compare/v1.7.0...v1.7.1) (2023-04-29) + + +### Bug Fixes + +* fix react-router version not match problem ([b3ae79b](https://github.com/msgbyte/tailchat/commit/b3ae79bf7809a79ccfb84c07b6882b621a925138)) +* fix return error problem in message.fetchNearbyMessage ([44ec059](https://github.com/msgbyte/tailchat/commit/44ec0599e22b2541ab1cb8e2aa187b7314fbd398)) + + +### Features + +* add disableUserRegister and disableGuestLogin ([dedeaa8](https://github.com/msgbyte/tailchat/commit/dedeaa805fae4a06edc484c09ed0d998b3338cd2)) +* add message author in inbox event ([7f0568f](https://github.com/msgbyte/tailchat/commit/7f0568feed53a44bcabbe24abf781d73d9940bc4)) +* add openapi bot client ([7c65858](https://github.com/msgbyte/tailchat/commit/7c658583c23ac7019124ee4fd3aca8b92f120968)) +* add sakana widget ([d5db57d](https://github.com/msgbyte/tailchat/commit/d5db57dfdcd54168b8a05112c5701b285faa6742)) +* add stripMentionTag utils in tailchat-client-sdk ([14255b6](https://github.com/msgbyte/tailchat/commit/14255b680494c9ceee5d313f695233a8692a77d3)) + +# [1.7.0](https://github.com/msgbyte/tailchat/compare/v1.6.8...v1.7.0) (2023-04-24) + + +### Bug Fixes + +* fix plugin manifest validator checker not allowed i18n ([b9c829d](https://github.com/msgbyte/tailchat/commit/b9c829d024f5dcc9cd68afcfc19742df86ee9538)) +* fix the problem that the version of react-query is not uniform ([1d5c061](https://github.com/msgbyte/tailchat/commit/1d5c061f0ce94f4435751e3f75e5db293dd5c038)) + + +### Features + +* add common service available check ([0cb61bc](https://github.com/msgbyte/tailchat/commit/0cb61bcf85d120a53184a85755834f00316bca22)) +* add fe ui in wxpusher plugin ([44595b3](https://github.com/msgbyte/tailchat/commit/44595b351f9888709958e979f983de630da95571)) +* add markdown editor into panel ([694a62c](https://github.com/msgbyte/tailchat/commit/694a62cd5aba9b6f2a83c3880ef622fcb5a56849)) +* add markdown gfm support and add markdown editor ([9f24bb1](https://github.com/msgbyte/tailchat/commit/9f24bb1de0e3294d84cca0291312ecc60d2738ea)) +* add more badge ([d0176b0](https://github.com/msgbyte/tailchat/commit/d0176b03138fd86ba22f995a7c291ddd824917ab)) +* add plain text with send text message ([1fa1293](https://github.com/msgbyte/tailchat/commit/1fa1293d1a3c8f43a758a30bd25bed369e77cdee)) +* add plugin com.msgbyte.wxpusher ([32de5b1](https://github.com/msgbyte/tailchat/commit/32de5b17e5e895b5388c0a135a165c46355f1e8a)) +* add url document support for http protocol ([6edb013](https://github.com/msgbyte/tailchat/commit/6edb013af79d4534f4374088c52ee854da3cbfa2)) +* add wxpusher message push ([1c09b17](https://github.com/msgbyte/tailchat/commit/1c09b17211189b4f0992941fe149095b33648475)) +* append openapi and integration plugin into registry ([c370347](https://github.com/msgbyte/tailchat/commit/c370347cf47b4c92c9e4b44c47f6a2fce6295bc2)) +* **getui:** add requestId record with single push ([4a068ee](https://github.com/msgbyte/tailchat/commit/4a068ee3d5e720d8bf0a43e14f1838210e90af57)) +* hidden github icon from markdown editor ([f25eea9](https://github.com/msgbyte/tailchat/commit/f25eea90ebad981e68b169738db3e8d17966d99a)) +* **mobile:** add cid in entry view ([781d413](https://github.com/msgbyte/tailchat/commit/781d4135273319626fd5bb93703b4204a029ace9)) +* **mobile:** add com.huawei.agconnect:agconnect-core in huawei ([4192d35](https://github.com/msgbyte/tailchat/commit/4192d35234c4f77d7377f97c9ab6dd07418a227f)) + + +### Performance Improvements + +* add ErrorBoundary for routes ([f426d92](https://github.com/msgbyte/tailchat/commit/f426d92a9f486784ec943f2f096a6b2091d82e6e)) +* beautify the visual performance of scroll bars caused by too many groups ([85d501d](https://github.com/msgbyte/tailchat/commit/85d501dae5bb2db6fa3cce7ac5d897c94362f956)) +* optimize the rendering animation and layer sequence of withKeepAliveOverlay ([f099307](https://github.com/msgbyte/tailchat/commit/f09930796bb67544fc9809bc0cefc0a929bdb69e)) +* perf mobile view display in pagecontent ([add116c](https://github.com/msgbyte/tailchat/commit/add116cffc6e7b86da9b3ed1b1f77f381e394f38)) + +## [1.6.8](https://github.com/msgbyte/tailchat/compare/v1.6.7...v1.6.8) (2023-04-02) + + +### Bug Fixes + +* **admin:** fix unit incorrect problem ([3747776](https://github.com/msgbyte/tailchat/commit/3747776239e4bb72abda893aac1f723dd5244661)) +* fix emoji render problem if not found ([deceb60](https://github.com/msgbyte/tailchat/commit/deceb60da38587812f813d4d7c69aa2884ecfb59)) +* fix getui.service cannot get client problem ([a245373](https://github.com/msgbyte/tailchat/commit/a245373e0031a39bb296092af64ee695967f5621)) +* fix rn plugin error and plain message ([fcf8373](https://github.com/msgbyte/tailchat/commit/fcf837394a590bfd764361810099903a0f70f6aa)) +* fix url problem about avatar url in popover ([dcaa279](https://github.com/msgbyte/tailchat/commit/dcaa2799aa133dff104d31366f9a565af121b934)) +* fix url which without protocol will not been correct parse ([cfd1479](https://github.com/msgbyte/tailchat/commit/cfd1479ac628f3a8b87775d616d77c2e2fb26945)) + + +### Features + +* add device version display in settings ([11827f7](https://github.com/msgbyte/tailchat/commit/11827f7a4cfb4692c5c16f307c517ea0f6c3e7f1)) +* add event tracker in website ([82a08d6](https://github.com/msgbyte/tailchat/commit/82a08d65efb8bda162019b49bc2b6ef0f90adb68)) +* add huawei vendor SDK integration ([3c94ac2](https://github.com/msgbyte/tailchat/commit/3c94ac2438f624f10bdb9ed3e657b8bc34c4095e)) +* add mobile level socket to subscribe remote message ([91a6721](https://github.com/msgbyte/tailchat/commit/91a6721671c39d9bd62abe2b0b6f00717e564ac3)) +* add send button when message input has content ([ed05d61](https://github.com/msgbyte/tailchat/commit/ed05d61511d355e426a5ad23486d25ae70dd85d8)) +* add server getui.service ([e6e13db](https://github.com/msgbyte/tailchat/commit/e6e13db307774d121c4f7b2564c6c49f1a881843)) +* **mobile:** add i18n support in rn ([5668e09](https://github.com/msgbyte/tailchat/commit/5668e091edbabed6c8d54dfbf339cf2a1535fdd0)) +* **mobile:** custom release store file and bind alias with native modules ([e028998](https://github.com/msgbyte/tailchat/commit/e0289988d5dffd9c77383fa2871eb1bb8f2a9569)) +* **mobile:** integrate getui for chinese mainland notify push ([256cb43](https://github.com/msgbyte/tailchat/commit/256cb43c934c9dad3a010fbad091a686e3830397)) +* **mobile:** remove getui build problem ([c62e551](https://github.com/msgbyte/tailchat/commit/c62e551274f585c9925571d141481788d000d0ae)) +* **server:** add getuiclient lib and plugin ([1605b2d](https://github.com/msgbyte/tailchat/commit/1605b2d1869ad68b1e79baeb0c8b3e9f04b0fc4f)) + + +### Performance Improvements + +* beautify url tag style ([db4e4e8](https://github.com/msgbyte/tailchat/commit/db4e4e8958bac923ef193325acaee4e183d9deea)) +* reuse script in same image in single emoji ([fdf527e](https://github.com/msgbyte/tailchat/commit/fdf527eaa7c74523bdd23dc671c3fb40e66121a8)) + +## [1.6.7](https://github.com/msgbyte/tailchat/compare/v1.6.6...v1.6.7) (2023-03-14) + + +### Bug Fixes + +* fix size problem in ([53e476d](https://github.com/msgbyte/tailchat/commit/53e476d8a8e504c35bb8b2cdd53d2f6f9dcee62b)) +* modify right position of ScrollToBottom ([e66591d](https://github.com/msgbyte/tailchat/commit/e66591d022a6f009438980ab6d66a4dace6685d8)) + + +### Features + +* add config model and add action for get client config ([b45d782](https://github.com/msgbyte/tailchat/commit/b45d782f8e0069656d033d2981cbe5b031f21ed0)) +* add custom serverName render in login view ([d9adf84](https://github.com/msgbyte/tailchat/commit/d9adf840148c8f7daf11823b4d9ec46a734ec35f)) +* add image parser ([8ee1215](https://github.com/msgbyte/tailchat/commit/8ee1215a9a04c6c47eec04c35ab9dcee2aa61f64)) +* add toast for message item action ([a5133b2](https://github.com/msgbyte/tailchat/commit/a5133b2d800448864d59f9c27e62d96e595fbd94)) +* add unlimited upload api in admin ([5ab4829](https://github.com/msgbyte/tailchat/commit/5ab4829565f1965946ac322c348d69db34f67ec3)) +* **admin:** add basic system config ([7688c84](https://github.com/msgbyte/tailchat/commit/7688c844f3790c5461956b1f8620462f0b3a77d8)) +* **admin:** add converseID filter and message detail ([9484e4c](https://github.com/msgbyte/tailchat/commit/9484e4ccedd3f512e2d665e10929b286ab5aee77)) +* **admin:** add delete button in server entry image ([4d6fd45](https://github.com/msgbyte/tailchat/commit/4d6fd451a177ae632db03fa8dab41f1556525b8a)) +* **admin:** allow edit client config serverName edit in admin ([9c7448b](https://github.com/msgbyte/tailchat/commit/9c7448b7cbf2a8019f54e350b8da190eb9085f4c)) +* allow admin upload and edit serverEntryImage ([fb13a3c](https://github.com/msgbyte/tailchat/commit/fb13a3c92802e73976f7e70549d242d4fca0aadb)) + + +### Performance Improvements + +* **admin:** replace ts-node with node to run admin ([f26a423](https://github.com/msgbyte/tailchat/commit/f26a42356fd6a45826aa18ed79719fc43c1567e4)) + +## [1.6.6](https://github.com/msgbyte/tailchat/compare/v1.6.5...v1.6.6) (2023-02-27) + + +### Bug Fixes + +* fix antd popover dark theme color fit ([aaab464](https://github.com/msgbyte/tailchat/commit/aaab464b6b5a306cce5ad6939960275f13b20084)) +* fix bug if cannt get file then will throw error ([056709c](https://github.com/msgbyte/tailchat/commit/056709c8a53101c67a87fdfd698826458ccad813)) +* fix incorrect bbcode url ([693edf2](https://github.com/msgbyte/tailchat/commit/693edf2739fd2150d23764aa11cfa2b6e797951a)) +* fix style problem in avatar in invite info ([751fb55](https://github.com/msgbyte/tailchat/commit/751fb5534e6f0e4bdad9d6e10bdc5f847c18ab6b)) + + +### Features + +* add action group.extra for storage group extra data ([8aa5d93](https://github.com/msgbyte/tailchat/commit/8aa5d93eea6b86f24136f273a73daf4c2f084469)) +* add GroupExtraDataPanel for support panel which allow edit ([a64f742](https://github.com/msgbyte/tailchat/commit/a64f7423652870498120500e84c5af65c154815f)) +* add i18n support in plugin store ([69e8bd2](https://github.com/msgbyte/tailchat/commit/69e8bd2902dce979a75f09095a756d9ea6da2540)) +* add mdpanel plugin. then we can create markdown panel in group ([1f21e40](https://github.com/msgbyte/tailchat/commit/1f21e406a54432fd0289c1ae37aa8342cb758856)) +* add message list popover for DM and group ([704c05e](https://github.com/msgbyte/tailchat/commit/704c05e0ec594f88b7a6fbd962a905d6d3df55d7)) +* add navigator language detector ([ce1d7ee](https://github.com/msgbyte/tailchat/commit/ce1d7eec99a14e9473157dec3d8715f7e72f7428)) +* add permission for deleteMessage ([cbb436c](https://github.com/msgbyte/tailchat/commit/cbb436cfbe056cffbe9bee3f752dc1bc519a9e20)) +* **admin:** add group filter in chat list ([b9b1931](https://github.com/msgbyte/tailchat/commit/b9b193186892a194f2d69b88c5242a585d976bb6)) +* **admin:** add user edit page ([0f902d4](https://github.com/msgbyte/tailchat/commit/0f902d4766ad28fcc089d54111fc7cbc23f26a44)) +* **admin:** update delete message logic with call ([0cd4268](https://github.com/msgbyte/tailchat/commit/0cd4268a6553bb8464c6e7ad745a81b65f8aae4a)) +* **cli:** i18n support for create template ([3105406](https://github.com/msgbyte/tailchat/commit/310540631d76cccb448aa57b45bad0333e226760)) +* **desktop:** 增加截图功能 ([d82854a](https://github.com/msgbyte/tailchat/commit/d82854a3ec590541d22baf457fd25857976db0ea)) +* 增加开放平台oauth demo app ([51c2fb2](https://github.com/msgbyte/tailchat/commit/51c2fb20325d0f0f5c6c7cdc3b2c9eb9a9d186e2)) + + +### Performance Improvements + +* compress bundle js ([5ffac2b](https://github.com/msgbyte/tailchat/commit/5ffac2bf12c492de2c569fb3af0de963d136e920)) +* update backend language fallback to en ([a78221e](https://github.com/msgbyte/tailchat/commit/a78221e111a5c5ae6fc1753d4bccf726ae8325bc)) +* **website:** perf homepage without styled-component ([5faaa74](https://github.com/msgbyte/tailchat/commit/5faaa74ddf8186ad5cf3705d46ebb34c3c949d73)) + +## [1.6.5](https://github.com/msgbyte/tailchat/compare/v1.6.4...v1.6.5) (2023-02-17) + + +### Bug Fixes + +* 修复放大字体插件默认状态不生效的bug ([f33a978](https://github.com/msgbyte/tailchat/commit/f33a9781795723cf972c6539eda9cb0b2d311111)) +* 修改Avatar宽度策略变更后CombinedAvatar样式异常的bug ([d3a6e1b](https://github.com/msgbyte/tailchat/commit/d3a6e1b196489ea276be2136a7d1e6f86589aabf)) + + +### Features + +* 增加字体放大插件 ([caf5a45](https://github.com/msgbyte/tailchat/commit/caf5a45fe1933911cdb0b0165232f372987e4cee)) + +## [1.6.4](https://github.com/msgbyte/tailchat/compare/v1.6.3...v1.6.4) (2023-02-14) + + +### Bug Fixes + +* 修复topic列表过长会导致新增按钮位置错误的问题 ([43969e2](https://github.com/msgbyte/tailchat/commit/43969e23dd410fa24c7516957ff10a68d95ddfd8)) + + +### Features + +* add tailchat-client-sdk package ([94b56f0](https://github.com/msgbyte/tailchat/commit/94b56f0af5cd3cf6f3d0beb956cbf0b382ead42a)) +* **rn:** 增加notifee用于本地通知 ([02095aa](https://github.com/msgbyte/tailchat/commit/02095aa6280fe7b87af04adac217eec35eef33b8)) +* **rn:** 增加删除服务器功能 ([66b0f36](https://github.com/msgbyte/tailchat/commit/66b0f36bbb001913334dfc7fa4855f7d87423970)) +* **rn:** 增加插件逻辑注入 ([92d5e39](https://github.com/msgbyte/tailchat/commit/92d5e39cfc0b38b3fe980fe148dcf1b3f5dbce57)) +* **rn:** 增加服务列表持久化 ([93985b0](https://github.com/msgbyte/tailchat/commit/93985b02fba04885ee860b3fdc049925b2c6f6f0)) +* **rn:** 增加服务器选择入口 ([f8a4055](https://github.com/msgbyte/tailchat/commit/f8a4055628e768e9705331c710b30396111dbd5e)) +* **rn:** 添加服务器时增加基本信息的获取 ([c972eb8](https://github.com/msgbyte/tailchat/commit/c972eb8937623e0708f5e576f6a0b17ba6eade3c)) +* **rn:** 移动端增加消息通知显示 ([25084e0](https://github.com/msgbyte/tailchat/commit/25084e0422e52cca5a14f48c76f82b9265177be0)) +* 增加 react-native-webview 以显示主要内容 ([a15e127](https://github.com/msgbyte/tailchat/commit/a15e1270a03d5942cf6f402ae32aed2769d4fb93)) +* 增加react-native-ui-lib,增加添加服务器功能 ([59f559d](https://github.com/msgbyte/tailchat/commit/59f559d98cd19753e6190268f47f53ef921c2281)) +* 增加topic插件的收件箱通知项 ([6dcc18a](https://github.com/msgbyte/tailchat/commit/6dcc18a7e00269d37e755a21b7be11390571bcd9)) +* 增加插件安装方法到window对象 ([65d1e91](https://github.com/msgbyte/tailchat/commit/65d1e916f84bdb7b0968e212d7d058485ade759a)) + + +### Performance Improvements + +* 优化topic在多回复时的预览体验 ([206b90d](https://github.com/msgbyte/tailchat/commit/206b90d02607efb4f6f5bd7ac4675aa8b927062a)) +* 优化自定义网页面板url生成机制, 使用blob url来生成临时地址 ([c3d5856](https://github.com/msgbyte/tailchat/commit/c3d585650c3974c19a3e55db828accdf48d63855)) +* 表情面板增加中英国际化,并优化useStorage的缓存策略 ([ef41833](https://github.com/msgbyte/tailchat/commit/ef41833519f64b8a2e37c6a80f132f741f20551b)) + +## [1.6.3](https://github.com/msgbyte/tailchat/compare/v1.6.2...v1.6.3) (2023-02-11) + + +### Bug Fixes + +* 修复在处理当前页面的完整路径时url的跳转行为 ([ca486ed](https://github.com/msgbyte/tailchat/commit/ca486ed6b09105193b52a6996f9c7308d0f14c3e)) + + +### Features + +* github 开放平台机器人增加监听消息回调到github issue comment ([2590242](https://github.com/msgbyte/tailchat/commit/2590242bd89e385ee45954721937d77bfe072c4c)) + +## [1.6.2](https://github.com/msgbyte/tailchat/compare/v1.6.1...v1.6.2) (2023-02-10) + + +### Bug Fixes + +* 修复收件箱过长导致样式问题 ([4088de9](https://github.com/msgbyte/tailchat/commit/4088de907f56af6f39ce893bd7d28449b0d64f60)) +* 修复在亮色模式下navbar-more位置处自定义面板icon颜色不匹配问题 ([6be47e1](https://github.com/msgbyte/tailchat/commit/6be47e1f57c9f5aacaafc9523267a4e0164dbba3)) + + +### Features + +* 更新创建插件客户端模板,增加翻译 ([cda54eb](https://github.com/msgbyte/tailchat/commit/cda54ebdb68f1169e1668efd7262bd27df0155a3)) +* 话题卡片增加已读未读容器 ([84584c8](https://github.com/msgbyte/tailchat/commit/84584c8bed61a44eefb8ce25b0a3dac99cd427c0)) +* 增加 inbox.append 接口,用于内部调用增加收件箱内容 ([56c9f99](https://github.com/msgbyte/tailchat/commit/56c9f99c6734a5fd1bc0af63a8ab5aa05a3b59ea)) +* 增加导航栏相关的插件面板注册 ([53b7195](https://github.com/msgbyte/tailchat/commit/53b719514122958de89502cbc05439d959426b14)) +* 增加环境变量用于禁用日志选项 ([de37f64](https://github.com/msgbyte/tailchat/commit/de37f647a0adb21c86bf6203b830cd381841c76e)) +* 增加机器人接受到新的收件箱信息时调用回调 ([7fb9ddc](https://github.com/msgbyte/tailchat/commit/7fb9ddc4b5d5477b8d17b8ab01363ff517453e99)) +* 增加内置的文件发送功能 ([469f341](https://github.com/msgbyte/tailchat/commit/469f34134c0eb88d2fdf15afd4a136705750b753)) +* 增加前端编译信息部分上下文暴露,用于提前获取应用信息 ([037e37d](https://github.com/msgbyte/tailchat/commit/037e37d51548cfe2f4568aa74bb7f7fc6f7e167d)) +* 增加前端ack面板的概念,抽象化已读未读的面板属性而不是单纯的文本面板 ([7d14641](https://github.com/msgbyte/tailchat/commit/7d1464104abb0d135763520aff564eb4efc53810)) +* 增加用户封禁标识与断开连接功能 ([e8a705d](https://github.com/msgbyte/tailchat/commit/e8a705dad74d48f7173c9ed8a578bb550f2acb70)) +* 增加在线听音乐插件 ([9090ee8](https://github.com/msgbyte/tailchat/commit/9090ee8a94ca62eeeb030ee1e9447c5904c4281a)) +* **openapi:** 增加开放平台机器人回调编辑 ([3382189](https://github.com/msgbyte/tailchat/commit/3382189dee6d0b7cf891601e6132679209bcc775)) +* **server:** 增加面板feature定义,增加subscribe用于给自定义面板增加订阅功能(之前写死文本面板会有这个效果) ([b938fcb](https://github.com/msgbyte/tailchat/commit/b938fcb12ccd38c0d8bbde0035ef68aca136891a)) + + +### Performance Improvements + +* 优化导航栏高度不够的情况下的表现 ([f6483dd](https://github.com/msgbyte/tailchat/commit/f6483dd396024b19eac28740169a5ce187a9abda)) +* 优化消息已读容器逻辑,方便第三方复用 ([66a67bf](https://github.com/msgbyte/tailchat/commit/66a67bf02bd6cebf63a5e59fc8dc8813923ce927)) +* 优化github app 并增加白名单模糊匹配 ([f77d267](https://github.com/msgbyte/tailchat/commit/f77d267f8032c4e2fe895f6d629cd8f67fa60267)) +* 增加emoji图片picker的内置打包,优化在国内网络获取图集慢的问题 ([056d185](https://github.com/msgbyte/tailchat/commit/056d185debd4a8cb49b2b67c2b7127fa7c5abaf6)) + +## [1.6.1](https://github.com/msgbyte/tailchat/compare/v1.6.0...v1.6.1) (2023-02-02) + + +### Bug Fixes + +* **cli:** v1.5.4 修复bench命令的计算问题和容错机制 ([9b7499a](https://github.com/msgbyte/tailchat/commit/9b7499a23eb6b7c1da93566db1fa02db3e335c1e)) +* 修复admin socketio平台链接协议问题 ([089dbbb](https://github.com/msgbyte/tailchat/commit/089dbbb37fa07076e36a97b85b22559fd1233699)) +* 修复admin静态资源的访问路径问题 ([3635653](https://github.com/msgbyte/tailchat/commit/3635653798160062e347b6b345ef8e33243d5096)) +* 修复pin面板后宽度异常的bug ([b44ccfd](https://github.com/msgbyte/tailchat/commit/b44ccfd76204d6d8ac1218283e68dd02739660fa)) +* 修复tailchat bench message 命令参数 ([11f28af](https://github.com/msgbyte/tailchat/commit/11f28af3bdeca6fe9c86d673d8a85094bf697996)) +* 修复修改免打扰ui不会更新的bug ([3121002](https://github.com/msgbyte/tailchat/commit/312100277c95be687dd9ea792d5145bbf43b74ab)) +* 修复国际化文案问题 ([e56eda0](https://github.com/msgbyte/tailchat/commit/e56eda0387799cdfb4adaed2247a2537758dd5c8)) +* 修复注册账号时没有增加长度限制的bug ([2ed79fb](https://github.com/msgbyte/tailchat/commit/2ed79fb5dd5a91568b9b6283cae5e2ae46a3c455)) + + +### Features + +* **admin:** 增加user资源的国际化写法 ([184daa3](https://github.com/msgbyte/tailchat/commit/184daa3e733fffe263943660675332dbd3f6d4d4)) +* **admin:** 增加用户详情页,并增加重置密码功能 ([8a8be0b](https://github.com/msgbyte/tailchat/commit/8a8be0b0856fd51aba1aa79fa59c9a0d31f35d52)) +* **admin:** 增加群组列表详情页的展示 ([6dcfd64](https://github.com/msgbyte/tailchat/commit/6dcfd647f55344f4308f9abad7030f0c61b7437c)) +* 升级emoji-mart的版本: v3 -> v5 ([749c2f7](https://github.com/msgbyte/tailchat/commit/749c2f7961f9fa8307a53f338ada77b888e71553)) +* 增加socket.io admin ([9f71fc0](https://github.com/msgbyte/tailchat/commit/9f71fc05e45fd632af60984269b2df5333897f9c)) +* 增加tailchat usage命令 ([1253101](https://github.com/msgbyte/tailchat/commit/12531017871b2573180a7f8b9ffaa56dd4185f73)) +* 增加引用时可以跳转到某个面板 ([1e00834](https://github.com/msgbyte/tailchat/commit/1e00834b1a0610ebe007c70ad9e94fbca94912df)) +* 增加成员管理面板 ([31c62b2](https://github.com/msgbyte/tailchat/commit/31c62b21a43638dd10869cf8a3e0914079f49d8c)) +* 设定静音状态下群组小红点为灰色 ([0c5e5c3](https://github.com/msgbyte/tailchat/commit/0c5e5c3cf47b570d4ec060a9ff5e7656aadfe58e)) + + +### Performance Improvements + +* **admin:** 整理admin鉴权相关的逻辑并强化对于token过期的处理 ([998e7a6](https://github.com/msgbyte/tailchat/commit/998e7a67073fa8d5db514fd213ad6acb66bfe1f1)) +* break change: socketio传输效率优化 ([424d451](https://github.com/msgbyte/tailchat/commit/424d451cd9a471314d2f620994e77b42adc5012e)) +* **cli:** 优化bench命令对于请求超时(失败)的处理 ([8aa944e](https://github.com/msgbyte/tailchat/commit/8aa944e7e513b510703cea7b25b5f8f8100f8803)) +* 优化在小屏幕移动端上的界面表现,移除不恰当的边距 ([90a30c7](https://github.com/msgbyte/tailchat/commit/90a30c7e98fdf5e0f3151e83d1090957fe5fb113)) + +# [1.6.0](https://github.com/msgbyte/tailchat/compare/v1.5.0...v1.6.0) (2023-01-25) + +### Hightlight + +- 增加了 **Admin后台管理系统** 初版代码 +- 增强了邮箱认证相关逻辑 +- 声网插件增加了屏幕共享 + +### Bug Fixes + +* 修复类型问题 ([79390d3](https://github.com/msgbyte/tailchat/commit/79390d329eac877ead7033f74f6a65e453fd44e1)) +* 修复校验失败不会跳转回登录页的bug ([79581d6](https://github.com/msgbyte/tailchat/commit/79581d6226a456e2f9fa88ec5b62e7521081aad3)) + + +### Features + +* 页面增加opengraph属性 ([64859eb](https://github.com/msgbyte/tailchat/commit/64859eb885df59de9928ac231f3b12ee036fdd6d)) +* 邮箱校验属性变更 ([ce97957](https://github.com/msgbyte/tailchat/commit/ce97957fa94dda5228c3b4d2ceb088622e8f0260)) +* 增加更多的资源(message/group/file) ([bacb5b3](https://github.com/msgbyte/tailchat/commit/bacb5b30313317097048c5f25f08ecd105dbd8a6)) +* 增加屏幕共享功能 ([2747e09](https://github.com/msgbyte/tailchat/commit/2747e0945ece59aeff979a355a8175e5b952f1f5)) +* 增加群组卡片创建者标签以及角色列表 ([f559c2b](https://github.com/msgbyte/tailchat/commit/f559c2ba96649701e392814d6e400ca27e21d651)) +* 增加文件列表 ([4f51ec4](https://github.com/msgbyte/tailchat/commit/4f51ec4aa85af2dc024683365405d6239aacae1a)) +* 增加邮箱认证功能 ([2e774d1](https://github.com/msgbyte/tailchat/commit/2e774d104f5ffb470c5a3358a289373a3eb7441a)) +* 增加注册账号/游客认领账号时进行邮箱校验(配置) ([099a906](https://github.com/msgbyte/tailchat/commit/099a906b4a55a9abbb1cb44fdc72002c35b78e12)) +* 增加admin登录鉴权逻辑 ([2c1aa02](https://github.com/msgbyte/tailchat/commit/2c1aa02428b0ea04dde1ac0cf40511c690e2e635)) +* 增加broker并增加相关接口 ([7cdb522](https://github.com/msgbyte/tailchat/commit/7cdb5220c5875a915178e283170e805606c1e4c6)) +* 增加tailchat 网络菜单 ([1151417](https://github.com/msgbyte/tailchat/commit/11514175e6ad7eeac2c7d6f5952d9b8f533eb270)) +* admin 初始化与基本界面 ([96292a2](https://github.com/msgbyte/tailchat/commit/96292a23baacc39767a598a5976b08ef7e3e270c)) +* admin 增加dashboard ([867fbd3](https://github.com/msgbyte/tailchat/commit/867fbd322318db87531a4043c8e57149d21333fc)) +* cli 增加更新提示 ([09b56b9](https://github.com/msgbyte/tailchat/commit/09b56b9c7cd4c2f79642f53b3d61ca7203e3c815)) +* cli docker init初始化增加引导 ([ee9a01d](https://github.com/msgbyte/tailchat/commit/ee9a01d552f2b55075bc52f732ee2dde7c2de35d)) +* Loadable增加配置项允许增加加载中提示 ([f13478a](https://github.com/msgbyte/tailchat/commit/f13478a98441a3a643bff8169fc62a07710aca9d)) +* tailchat docker init 命令增加自定义文件夹支持 ([9b4b375](https://github.com/msgbyte/tailchat/commit/9b4b375d08958f4a2e6dcdb73477846fde1e3007)) + + +### Performance Improvements + +* 优化获取群组设置的逻辑,增强代码可读性 ([0f5dc6a](https://github.com/msgbyte/tailchat/commit/0f5dc6aec6d8e3ca7ee85ee7ea63fc196cf5652d)) +* 优化网络请求错误抛出 ([c0ecd5e](https://github.com/msgbyte/tailchat/commit/c0ecd5e25b6b0afc905dc522a659a52abcb6f0f5)) +* 优化getUserOnlineStatus的网络请求连接,自动合并多个请求为一个后端请求 ([8f58788](https://github.com/msgbyte/tailchat/commit/8f587887eeabd96eb6c5a1c0b015279f1caf1a40)) + +# [1.5.0](https://github.com/msgbyte/tailchat/compare/v1.4.0...v1.5.0) (2023-01-21) + + +### Bug Fixes + +* 修复登录时可能会因为navRedirect的问题导致循环 ([8b95af0](https://github.com/msgbyte/tailchat/commit/8b95af0d78157ee6eeb4f233b4ea266299fe688e)) +* 修复内置用户信息无法获取到翻译的问题 ([935a26a](https://github.com/msgbyte/tailchat/commit/935a26ab095b8b2a02b21ab7691c5f10a54fca21)) +* 修复删除身份组后位置不正确的bug ([170a243](https://github.com/msgbyte/tailchat/commit/170a243a66d71b7bec30dfb29d5d5eaeeb753c6f)) +* 修复收件箱notfound的图片样式问题 ([29c7ed5](https://github.com/msgbyte/tailchat/commit/29c7ed5bbc4779a344f55cf49e223dc9030761a4)) +* 修复fetchNearbyMessage获取数据/顺序不正确的bug ([b74b956](https://github.com/msgbyte/tailchat/commit/b74b956e45c43d3fca7a96f9c786d9c0baf723a1)) +* 修复github webhook如果没有body会导致渲染异常的问题 ([71077d4](https://github.com/msgbyte/tailchat/commit/71077d4877cd5a1fec62099bbed690701bf9fe4d)) + + +### Features + +* 个人面板菜单选项增加记忆 ([fdb1830](https://github.com/msgbyte/tailchat/commit/fdb1830e923a99075543cea6fbd45b7fa09673b7)) +* 命令行应用增加tailchat docker init命令 ([f1238ba](https://github.com/msgbyte/tailchat/commit/f1238badbd44f50940cb12ae3e1a2314629f43af)) +* 收件箱侧边栏展示 ([db917d2](https://github.com/msgbyte/tailchat/commit/db917d26b9e015f245c851049e3982a5e4c53f34)) +* 收件箱增加已读未读标识 ([af03bec](https://github.com/msgbyte/tailchat/commit/af03bec1a913561acec755831d4de684eb41f774)) +* 收件箱增加message类型的消息内容渲染 ([a9f2d00](https://github.com/msgbyte/tailchat/commit/a9f2d00d9eca8882200a258f0596416ebed1e985)) +* 收件箱增加SectionHeader ([d8ac078](https://github.com/msgbyte/tailchat/commit/d8ac078461bfe3d39679ef5d558e9d12be8c31f9)) +* 消息通知插件增加开关允许禁用内置的提示音 ([c02dbed](https://github.com/msgbyte/tailchat/commit/c02dbed7e0a77300108e69f1f059b4a7aaf63fb9)) +* 优化通知功能,增加icon小红点,增加提示音,优化通知场景 ([350371d](https://github.com/msgbyte/tailchat/commit/350371d6a3f84ff485cf8f97236dc284d3161d18)) +* 增加工具蛙插件 ([8d539d2](https://github.com/msgbyte/tailchat/commit/8d539d2fa90d1e7d9f59b2ca00e9b44370104c28)) +* 增加收件箱操作: 全部已读和清空收件箱 ([677cf76](https://github.com/msgbyte/tailchat/commit/677cf7689bf151a699e79b12cdbea428fdea28c2)) +* 增加收件箱已读标识 ([badfaa0](https://github.com/msgbyte/tailchat/commit/badfaa07d343c892c1569c7598675dec554060e3)) +* 增加拖拽文件发送图片的功能 ([338af09](https://github.com/msgbyte/tailchat/commit/338af097cadbc7cb1303f0169caeeb6e20538a5a)) +* 增加未选中任何消息状态的placeholder ([c760d44](https://github.com/msgbyte/tailchat/commit/c760d44e87ece7d0b6513fe013c78bc15638fc62)) +* 增加系统设置页面的自定义设置项注册(for plugin) ([e9b96a1](https://github.com/msgbyte/tailchat/commit/e9b96a15a238904670d6bf30c177a25e43e79f4a)) +* 增加消息高亮容器用于高亮消息 ([590b572](https://github.com/msgbyte/tailchat/commit/590b572263c3752ec165941ee603c3b7163e923c)) +* 增强邀请页面的已加入检查,如果已登录则会发起请求查询是否为群组成员 ([f5b71b0](https://github.com/msgbyte/tailchat/commit/f5b71b076ec59a764075f7e3acf25308b68952bc)) +* github push event 增加提交者链接 ([bc64729](https://github.com/msgbyte/tailchat/commit/bc6472985758fc388f9a2ac4a4da11c1bf6e0be6)) +* notify增加点击输入框跳转的功能,并增加api调用页面跳转的方式 ([1290c1e](https://github.com/msgbyte/tailchat/commit/1290c1e42646ff4fbf1e36ee5a7cd19750485774)) + +# [1.4.0](https://github.com/msgbyte/tailchat/compare/v1.3.1...v1.4.0) (2023-01-07) + + +### Bug Fixes + +* 为setLastMessageMap增加数组类型校验 ([f622d6a](https://github.com/msgbyte/tailchat/commit/f622d6a37b9a3f87b26f5903504a73bc39d031d4)) +* 修复挂断通话后仍然会显示正在使用摄像头/麦克风小红点的bug ([98af149](https://github.com/msgbyte/tailchat/commit/98af14969a7ff9f826e1bf015b5d88688eb81576)) +* 修复迁移(升级)gateway api导致的静态文件服务返回错误的bug ([066eb96](https://github.com/msgbyte/tailchat/commit/066eb963694ea18a70b8af99e99b46076e7f8687)) +* 修复声网控制器逻辑操作写反的问题 ([b515623](https://github.com/msgbyte/tailchat/commit/b515623cbfd48d3944904ac220764b8c69dd6fb7)) +* 修复推送在mac os 13 以下 safari 不支持registration.showNotification的问题 ([960f6e6](https://github.com/msgbyte/tailchat/commit/960f6e6c23081585a1698f28176bd5fc3482e7f8)) +* 修复消息会话点击后会卡死的问题 ([345e315](https://github.com/msgbyte/tailchat/commit/345e31553a34e18dca9b66badb60d28c44b597a5)) +* 修复新加入成员不会更新群组列表的bug ([df3da7e](https://github.com/msgbyte/tailchat/commit/df3da7edba9a7949b84017c050470aa682a1369c)) +* 修复在某些场景下计算高度会少1px导致无法 ([7644924](https://github.com/msgbyte/tailchat/commit/7644924ae93d2e1d4e4b4057ed56308f60840994)) +* 修复在某些时候跳转引用过时导致无法跳转的bug ([5c230ca](https://github.com/msgbyte/tailchat/commit/5c230caef33378c4c0a896d2b55204a03cf74e84)) +* 修复agora插件展开 收起的热区异常并顺便增加了分割线以优化显示 ([35e557f](https://github.com/msgbyte/tailchat/commit/35e557f2869725f8b2ef41af2791bb3c12ea1af1)) +* 修复t参数如果是带参数的调用的话无法覆盖语言的bug ([eb3b5f9](https://github.com/msgbyte/tailchat/commit/eb3b5f9c00cdef22b02d5d724f02b566d61306d6)) +* 修复workbox匹配规则问题 ([5624b92](https://github.com/msgbyte/tailchat/commit/5624b92933ada7425301c847202bf70d5431989a)) +* 增加前置的beforeinstallprompt以修复加载过晚无法监听到pwa安装事件的问题 ([94fcbb7](https://github.com/msgbyte/tailchat/commit/94fcbb7445e92a0e2ea29c66e0746b18bbd0ed6d)) +* resolve Promise.allSettled compatibility in android version(which 4.4 kernel) ([e4ff18a](https://github.com/msgbyte/tailchat/commit/e4ff18aebeeb76d9f5801bf43948bf07dce92160)) +* **server:** 修复不恰当时机的logger调用 ([dd358ac](https://github.com/msgbyte/tailchat/commit/dd358ac79ba339e710ed2ebcd8e4048907494c9f)) + + +### Features + +* 服务端插件增加打包静态资源的支持,并为声网插件增加icon ([0cf8bdb](https://github.com/msgbyte/tailchat/commit/0cf8bdb4fba29c50d4e979d5baa26a95f5d2f13a)) +* 获取指定消息附近的消息 ([8e4908f](https://github.com/msgbyte/tailchat/commit/8e4908fcedd61c2b5539b602a2f7a5a25de34afc)) +* 接口加白与联通性校验特殊处理 ([f8a73d1](https://github.com/msgbyte/tailchat/commit/f8a73d1a7761525b69779fbb618c332d5c10ab76)) +* 默认无背景色导致穿透的问题 ([504060e](https://github.com/msgbyte/tailchat/commit/504060e0167f2a9ab4d8418fcf4924ef85b4bb40)) +* 声网插件 正在发言指示器 ([076c907](https://github.com/msgbyte/tailchat/commit/076c907a05de6a84e123bcb0728d98a2bfdb817e)) +* 声网插件网络质量检测与双流功能与头像 ([141db8f](https://github.com/msgbyte/tailchat/commit/141db8f1cffc1f06425ecacf9e7519c71f2d399d)) +* 声网插件增加国际化支持 ([b7feabb](https://github.com/msgbyte/tailchat/commit/b7feabbbd38d6504bba7fcd28b7a8cc3ceb93c41)) +* 声网插件增加ahooks并优化初始化逻辑 ([928f1a2](https://github.com/msgbyte/tailchat/commit/928f1a25b212e382beee948792b8a0381625a358)) +* 声网插件自由控制媒体流推送 ([356e7ed](https://github.com/msgbyte/tailchat/commit/356e7edd58a017ad7be787b79ecc54b26b2b9782)) +* 声网插件webhhok处理与消息通知方式 ([bd3f2e1](https://github.com/msgbyte/tailchat/commit/bd3f2e129c389e40271b3d9ead10f278d5275aff)) +* 声网服务增加查询频道状态的接口 ([f444fb5](https://github.com/msgbyte/tailchat/commit/f444fb51435e47e9a9421af295ab6c5255db297e)) +* 声网鉴权函数完成 ([1e67c62](https://github.com/msgbyte/tailchat/commit/1e67c62626a4393281a83565dcbe812fe40da0f5)) +* 使用邀请码加入群组提示增加邀请码创建人,并增加国际化翻译 ([0cb2a82](https://github.com/msgbyte/tailchat/commit/0cb2a8200f11eb33f4e6467d2cc29764423fc514)) +* 输入框addon增加打开动画,并移除表情面板的内边距 ([c6ac1a8](https://github.com/msgbyte/tailchat/commit/c6ac1a800de63b9ff37a5b0053c6c71ca00e4eca)) +* 提及tag增加用户名fallback ([5c07367](https://github.com/msgbyte/tailchat/commit/5c0736732fa44a7286158d5a5cdfb5ae62be046c)) +* 为每个action增加了一个after hook回调 ([13134ce](https://github.com/msgbyte/tailchat/commit/13134ce4e3914b94da410a62e6f9c33a6e0591c1)) +* 文件传输插件增加文叔叔与filesend ([d9acf3b](https://github.com/msgbyte/tailchat/commit/d9acf3b679db58063fe60b8e09d882ae4eca2490)) +* 引导插件增加国际化支持 ([0ee2855](https://github.com/msgbyte/tailchat/commit/0ee28554c2dd03f603cf18562add43a9a9b51f2e)) +* 优化pluginUserExtraInfo渲染方式,增加自定义渲染组件自定义范围 ([bc8abe5](https://github.com/msgbyte/tailchat/commit/bc8abe54b7a1051d6b9e4ab5ebc629b6e065d776)) +* 优化reaction用户名显示,显示前两个用户名以强化reaction信息量 ([3f76b9e](https://github.com/msgbyte/tailchat/commit/3f76b9ee1b940e907ef9401b1bd85daf5728aff7)) +* 优化workbox匹配规则,增加对跨域资源的sw管理 ([1f04b0c](https://github.com/msgbyte/tailchat/commit/1f04b0c47ca5e1427afe04074b439fd67c4d96e3)) +* 增加安装应用按钮 ([dcbc148](https://github.com/msgbyte/tailchat/commit/dcbc148eebbb7956cb690801d3a6581e13224aa7)) +* 增加服务端与agora后台的数据通信处理 ([f9e53d2](https://github.com/msgbyte/tailchat/commit/f9e53d205e8f5b1997b634b97a4c9e6b1e006372)) +* 增加加载到主组件时上报加载耗时 ([8b80824](https://github.com/msgbyte/tailchat/commit/8b808242df95a805411f44a27ffdaa20190613b5)) +* 增加了声网插件用户布局与基于用户维度的视图渲染 ([feab2c2](https://github.com/msgbyte/tailchat/commit/feab2c240c510ad95b0ef2b4208bc865858d14db)) +* 增加聊天列表滚动到底部按钮 ([7f1b475](https://github.com/msgbyte/tailchat/commit/7f1b475f69352f349503676e13bdf82ec3f37c79)) +* 增加群组配置权限,增加群组成员隐私控制选项 ([9b331e7](https://github.com/msgbyte/tailchat/commit/9b331e7707bc9ea9a8060e9a396190ea56e7ca6c)) +* 增加删除群组角色的接口 ([49ca9ca](https://github.com/msgbyte/tailchat/commit/49ca9ca3aef0e61b1a2402adc945167fa2353ea9)) +* 增加声网插件基本功能集成 ([63ee943](https://github.com/msgbyte/tailchat/commit/63ee943eecbb1fe834e4aea3efbd8c5eee9e128d)) +* 增加移出群组的前端操作 ([070a762](https://github.com/msgbyte/tailchat/commit/070a762e4df78ee6e680eeb5d7add498753b7b65)) +* 增加用户管理权限点 ([8e24571](https://github.com/msgbyte/tailchat/commit/8e24571462ed09ca3255802452cc4c136e5fa28d)) +* 增加alpha模式,并将虚拟列表丢到alpha模式中 ([a202419](https://github.com/msgbyte/tailchat/commit/a20241966934d68f6242413b98889acc2bebfca4)) +* 增加wormhole插件用于文件传输 ([f8765d1](https://github.com/msgbyte/tailchat/commit/f8765d18c1c0ba76eadcb6418de5a7f07f625641)) +* add {BACKEND} support for user info avatar ([9fa420e](https://github.com/msgbyte/tailchat/commit/9fa420e79d272d4934d11716da7d3524bd150cfe)) +* add w2a project ([67960ac](https://github.com/msgbyte/tailchat/commit/67960ac877101b193a13f2bc80ff81e4b832a1d3)) +* markdown渲染的图片允许被放大预览 ([c15a1a7](https://github.com/msgbyte/tailchat/commit/c15a1a7dc7bbd79cd037067fb2f309bd73ad17d8)) +* registerAuthWhitelist 强制增加插件名前缀 ([5638737](https://github.com/msgbyte/tailchat/commit/56387371ab4e40310a5915ca5d6ceee91d8ff1e9)) +* sentry增加replay集成 ([eec05c7](https://github.com/msgbyte/tailchat/commit/eec05c708969ffaab780e0b3c1c82b5b57e25380)) + + +### Performance Improvements + +* 优化登录逻辑 ([e623aa3](https://github.com/msgbyte/tailchat/commit/e623aa312bdfc033dfb24c02d47442cb2f059cb0)) +* 优化结构与导出方式 ([58dba49](https://github.com/msgbyte/tailchat/commit/58dba494a0450e09a104116e1c69a2281c908e74)) +* 优化控制器的配色方案, 增强控制器状态辨识度 ([5f5b50f](https://github.com/msgbyte/tailchat/commit/5f5b50f86e15a92293368514728319b81f7dadf5)) +* 优化在用户信息没有获取到前界面的表现 ([7ea7069](https://github.com/msgbyte/tailchat/commit/7ea706936e743d862b6fd0fd8df8683429042678)) +* 优化fetchConverseLastMessages查询语句,防止数据量过大导致请求超时 ([91fe01f](https://github.com/msgbyte/tailchat/commit/91fe01f2476a94d30026749927aafcc9f524ea53)) +* 优化notify插件代码 ([1f53781](https://github.com/msgbyte/tailchat/commit/1f537816c277ada199b2b5597f396acc4f5e7699)) +* 优化tour插件的引导,增加箭头以增强显示 ([183b777](https://github.com/msgbyte/tailchat/commit/183b777c2b049003841e3dc87682366b580f6102)) +* 增加预加载, 优化主要加载代码加载耗时 ([3cdcc0e](https://github.com/msgbyte/tailchat/commit/3cdcc0e9ecfd67144aba9b99507693b94034db13)) +* add webpack-retry-chunk-load-plugin to fix chunk load failed error ([4dc9e0b](https://github.com/msgbyte/tailchat/commit/4dc9e0ba6c2685675364923c257e88ba81802016)) +* sentry和posthog增加try...catch保护 ([1d924f1](https://github.com/msgbyte/tailchat/commit/1d924f1692b048b69aac0ad0a8cae0075a08acff)) + +## [1.3.1](https://github.com/msgbyte/tailchat/compare/v1.3.0...v1.3.1) (2022-12-18) + + +### Bug Fixes + +* 修复Markdown 引用没有样式的bug ([4e21735](https://github.com/msgbyte/tailchat/commit/4e21735d7b11906808c9010a06c45bfe9179fc94)) +* 修复markdown引用样式问题 ([1326b9d](https://github.com/msgbyte/tailchat/commit/1326b9dd055ee19719cc90bfc86ebc0e087b6079)) +* 优化withKeepAliveOverlay的参数依赖管理,修复不强制渲染时无法取消挂载的情况 ([42e004c](https://github.com/msgbyte/tailchat/commit/42e004ce206afd98f4cba5c04d28f14fd630a2fa)) + +# [1.3.0](https://github.com/msgbyte/tailchat/compare/v1.2.0...v1.3.0) (2022-12-18) + + +### Bug Fixes + +* 修复markdown组件 ul ol 样式缺失的问题 ([bcfd1db](https://github.com/msgbyte/tailchat/commit/bcfd1db90f56c029b8d438f4038392c3646a7d6f)) + + +### Features + +* 用户增加extra字段用于存储额外信息 ([b5cc18f](https://github.com/msgbyte/tailchat/commit/b5cc18fbe1dff57ecfd2c33f87c1ddad122908c5)) +* 增加成员面板数量统计 ([cca3e26](https://github.com/msgbyte/tailchat/commit/cca3e2633a5691905cc2dcee1e08b8406c6fd1b0)) +* 增加新组件 CopyableText ([6424199](https://github.com/msgbyte/tailchat/commit/6424199be2291133ef53d6d1823c476309eef190)) +* 增加自定义用户信息 ([1ad880b](https://github.com/msgbyte/tailchat/commit/1ad880b9485526b80180f9565546ad24252658cd)) +* 增加github项目可交互按钮并增加全局code样式 ([5e4ee9b](https://github.com/msgbyte/tailchat/commit/5e4ee9bd421902c9f00d07da8552858ba5758772)) +* 增加KeepAliveOverlay组件用于缓存iframe ([373e424](https://github.com/msgbyte/tailchat/commit/373e424e6ad5d56ce478f5952b9b698997c889f9)) +* 增加webview组件封装,统一webview渲染方式 ([fcc2684](https://github.com/msgbyte/tailchat/commit/fcc2684a34a5909c27bd49af5a30a331e83120c3)) + + +### Performance Improvements + +* 修改dropdown的overlay到menu, 这是因为会被逐渐弃用 ([922f0ad](https://github.com/msgbyte/tailchat/commit/922f0ad229e12d0f3cd4bf25bd7c1171cc6c459e)) +* 优化逻辑,并在常用请求增加索引以加速查找 ([0426c2b](https://github.com/msgbyte/tailchat/commit/0426c2bbeff3f1370bbb5edc1b11aa3e8cf26fde)) +* 增加更多的性能埋点与报告 ([ed06245](https://github.com/msgbyte/tailchat/commit/ed06245a6416a244efa8cc5c4b5dfed8f24e158d)) \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index edd70c504a3..fd2b8ae6891 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,47 @@ -FROM node:lts-alpine +FROM node:18.18.0-alpine + +# use with --build-arg VERSION=xxxx +ARG VERSION # Working directory -WORKDIR /app +WORKDIR /app/tailchat + +RUN ulimit -n 10240 # Install dependencies +RUN npm install -g pnpm@8.15.8 +RUN npm install -g tailchat-cli@latest + +# Add mc for minio +RUN wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc +RUN chmod +x /usr/local/bin/mc + +# Install plugins and sdk dependency +COPY ./tsconfig.json ./tsconfig.json +COPY ./packages ./packages +COPY ./server/packages ./server/packages +COPY ./server/plugins ./server/plugins +COPY ./server/package.json ./server/package.json +COPY ./server/tsconfig.json ./server/tsconfig.json +COPY ./package.json ./pnpm-lock.yaml ./pnpm-workspace.yaml ./.npmrc ./ +COPY ./patches ./patches +RUN pnpm install --frozen-lockfile + +# Copy client +COPY ./client ./client +RUN pnpm install --frozen-lockfile + +# Copy all source COPY . . -RUN npm install -g pnpm@6.24.2 http-server-spa@1.3.0 -RUN pnpm install +RUN pnpm install --frozen-lockfile -EXPOSE 11011 +# Build and cleanup (client and server) +ENV NODE_ENV=production +ENV VERSION=$VERSION +RUN pnpm build -RUN cd web && pnpm build +# web static service port +EXPOSE 3000 -CMD node web/scripts/sync-config-from-env.js && http-server-spa ./web/dist index.html 11011 +# Start server, ENV var is necessary +CMD ["pnpm", "start:service"] diff --git a/LICENSE b/LICENSE index f288702d2fa..883ab098f7f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,264 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +APACHE JACKRABBIT SUBCOMPONENTS + +Apache Jackrabbit includes parts with separate copyright notices and license +terms. Your use of these subcomponents is subject to the terms and conditions +of the following licenses: + + XPath 2.0/XQuery 1.0 Parser: + http://www.w3.org/2002/11/xquery-xpath-applets/xgrammar.zip + + Copyright (C) 2002 World Wide Web Consortium, (Massachusetts Institute of + Technology, European Research Consortium for Informatics and Mathematics, + Keio University). All Rights Reserved. + + This work is distributed under the W3C(R) Software License in the hope + that it will be useful, but WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + W3C(R) SOFTWARE NOTICE AND LICENSE + http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + + This work (and included software, documentation such as READMEs, or + other related items) is being provided by the copyright holders under + the following license. By obtaining, using and/or copying this work, + you (the licensee) agree that you have read, understood, and will comply + with the following terms and conditions. + + Permission to copy, modify, and distribute this software and its + documentation, with or without modification, for any purpose and + without fee or royalty is hereby granted, provided that you include + the following on ALL copies of the software and documentation or + portions thereof, including modifications: + + 1. The full text of this NOTICE in a location viewable to users + of the redistributed or derivative work. + + 2. Any pre-existing intellectual property disclaimers, notices, + or terms and conditions. If none exist, the W3C Software Short + Notice should be included (hypertext is preferred, text is + permitted) within the body of any redistributed or derivative code. + + 3. Notice of any changes or modifications to the files, including + the date changes were made. (We recommend you provide URIs to the + location from which the code is derived.) + + THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT + HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR + DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, + TRADEMARKS OR OTHER RIGHTS. + + COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL + OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR + DOCUMENTATION. + + The name and trademarks of copyright holders may NOT be used in + advertising or publicity pertaining to the software without specific, + written prior permission. Title to copyright in this software and + any associated documentation will at all times remain with + copyright holders. diff --git a/README.md b/README.md index 05f4b595ad4..2bd9e6f1c4d 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,98 @@ # Tailchat -Tailchat 是一款现代化开源的即时通讯聊天应用,基于 React + Typescript 开发 +[![Docker Publish](https://github.com/msgbyte/tailchat/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/msgbyte/tailchat/actions/workflows/docker-publish.yml) +![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/moonrailgun/tailchat/latest) +![Docker Pulls](https://img.shields.io/docker/pulls/moonrailgun/tailchat) +[![CI](https://github.com/msgbyte/tailchat/actions/workflows/ci.yaml/badge.svg)](https://github.com/msgbyte/tailchat/actions/workflows/ci.yaml) +[![Codemagic build status](https://api.codemagic.io/apps/63e27be62b9d4ca848b5491d/android/status_badge.svg)](https://codemagic.io/apps/63e27be62b9d4ca848b5491d/android/latest_build) +[![Desktop Build](https://github.com/msgbyte/tailchat/actions/workflows/desktop-build.yml/badge.svg)](https://github.com/msgbyte/tailchat/actions/workflows/desktop-build.yml) +[![deploy nightly](https://github.com/msgbyte/tailchat/actions/workflows/vercel-nightly.yml/badge.svg)](https://github.com/msgbyte/tailchat/actions/workflows/vercel-nightly.yml) +![Tailchat Nightly](https://tianji.moonrailgun.com/monitor/clnzoxcy10001vy2ohi4obbi0/clo1oiwbp001dof5e76cmkzj9/badge.svg) -前端微内核架构+后端微服务架构,Tailchat 已经为集群化部署做好了准备。 +![tailchat](https://socialify.git.ci/msgbyte/tailchat/image?description=1&font=Inter&forks=1&issues=1&language=1&logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F86033898%3Fs%3D200%26v%3D4&name=1&owner=1&pattern=Circuit%20Board&stargazers=1&theme=Light) -前端通过插件机制为应用赋能,对于 Tailchat 的二次开发来说非常简单且易用。 +[简体中文](./README.zh.md) -官方文档: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/) +## Next generation noIM application in your own workspace -后端仓库地址: [tailchat-server](https://github.com/msgbyte/tailchat-server) +### Not only another `Slack`, `Discord`, `Rocket.Chat`.... -Nightly版 体验地址: [https://nightly.paw.msgbyte.com/](https://nightly.paw.msgbyte.com/) +If you are interested in the concept of `noIM`, welcome to read my blog: +- [It's time to officially step into the era of noIM](https://tailchat.msgbyte.com/blog/2023/03/01/the-era-of-noIM) -> Nightly版 为自动编译版本, 即每次提交代码都会自动编译。 -> 不保证数据的可靠性与稳定性 +Official Documentation: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/) -**NOTICE: 虽然目前Tailchat的核心功能处于稳定阶段,但它对于第三方开发者暴露的接口仍在不断完善中,一般来说是向下兼容的,但保留出现 Break Change的可能性** +**Nightly version** Try it online: [https://nightly.paw.msgbyte.com/](https://nightly.paw.msgbyte.com/) + +> Nightly version is the automatic compile version, that means, every commit code will be automatically compiled. +> The reliability and stability of the data are not guaranteed, you can deploy with stable version with docker images or github release page + +## Motivation + +At present, the existing IM applications only focus on chatting itself, and IM is naturally a multi-person collaboration method. In my opinion, it should be able to take on more responsibilities, and form its own unique way of forwarding external applications through IM workflow. + +Therefore, I bring up the point of `noIM`, which means **Not only IM**. Instead, it designed a highly customized application platform for individuals/teams centered on IM, with third-party applications as enhanced functions, and a plugin system as the glue connection layer in the middle. + +To this end, the functions were abstracted, and a lot of time was spent designing the underlying mechanism. An instant messaging application such as `Tailchat` was born for expansion from the beginning of the underlying design. Through `Tailchat`'s plugin system, developers can easily use their favorite applications as part of `Tailchat` in a very natural way. Different from traditional integration methods such as `Slack`, the integration of `Tailchat` is more free, as if it is a native function. ## Feature -- 注重隐私,只有被邀请的成员才能加入群组 -- 防止陌生人,只有通过昵称+一串随机的数字才能添加好友 -- 二维的群组空间,通过频道来分割不同的话题 -- 高度自定义的群组空间, 通过分组和拖拽来创建独创的群组空间。同时可以通过更多的插件来增加更多的能力 -- 可以严谨,也可以乐趣。通过插件的组合可以创造用于不同场景的 Tailchat。可以是面向娱乐,也可以是面向企业 -- 后端微服务架构,已经为大规模部署做好了准备。不用担心用户量大了以后怎么办 +- Pay attention to privacy, only invited members can join the group +- Prevent strangers, add friends only by nickname + a random string of numbers +- Two-level group space, dividing different topics by panels +- Highly customized group space, create original group space by grouping with dragging and dropping. At the same time, more plugins can be used to add more capabilities +- It can be rigorous or fun. Through the combination of plugins, `Tailchat` can be created for different scenarios. It can be for individuals or for enterprises +- The backend microservice structure is ready for large-scale deployment. Don't worry about what to do after the number of user growth + +Learn more in our [website](https://tailchat.msgbyte.com/) + +## Performance and Expansion + +Tailchat is a modern open source IM application which based on **React** + **Typescript** + +Front-end microkernel architecture + backend microservice architecture, `Tailchat` is ready for clustering deployment. + +The front end empowers the application through the plugin system, which is very simple and easy to expand for the secondary development of `Tailchat`. + +**NOTICE: Although the core functionality of Tailchat is currently in a stable stage, its exposed interface for third-party developers is still being improved. Generally speaking, it is backward compatible, but retains the possibility of Break Change** + +## Preview + +![](./website/static/img/intro/hello.png) + +![](./website/static/img/intro/plugins.png) + +![](./website/static/img/intro/roles.png) + +Visit the official website to learn more: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/) + +## Quick Deploy +### Deploy on Sealos + +[![Deploy on Sealos](https://raw.githubusercontent.com/labring-actions/templates/main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-template%3FtemplateName%3Dtailchat) + +### Deploy on ClawCloud Run + +[![Run on ClawCloud](https://raw.githubusercontent.com/ClawCloud/Run-Template/refs/heads/main/Run-on-ClawCloud.svg)](https://template.run.claw.cloud/?referralCode=R8D5TGYVHBNJ&openapp=system-fastdeploy%3FtemplateName%3Dtailchat) + +## Communication + +If you are interested in `Tailchat`, welcome to join `Tailchat`'s seed user exchange group, your feedback can help `Tailchat` grow better +### Tailchat -## Build +[Tailchat Nightly Group](https://nightly.paw.msgbyte.com/invite/8Jfm1dWb) -#### 编译 web 前端代码 +### Producthunt -```bash -pnpm install -cd web -SERVICE_URL=http://127.0.0.1:11000 pnpm build -``` + +Tailchat - The next-generation noIM Application in your own workspace | Product Hunt + -环境变量: -- `SERVICE_URL`: 后端服务的地址 +## Project Activity -使用任意方式代理 `web/dist` 目录即可。 +![Alt](https://repobeats.axiom.co/api/embed/b85cb500d902e0ad0cecb582557c006d8b663a01.svg "Repobeats analytics image") +## License -#### expo 打开移动端app -```bash -cd app -pnpm install -pnpm start -``` +[Apache 2.0](./LICENSE) diff --git a/README.zh.md b/README.zh.md new file mode 100644 index 00000000000..b90804a4386 --- /dev/null +++ b/README.zh.md @@ -0,0 +1,96 @@ +# Tailchat + +[![Docker Publish](https://github.com/msgbyte/tailchat/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/msgbyte/tailchat/actions/workflows/docker-publish.yml) +![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/moonrailgun/tailchat/latest) +![Docker Pulls](https://img.shields.io/docker/pulls/moonrailgun/tailchat) +[![CI](https://github.com/msgbyte/tailchat/actions/workflows/ci.yaml/badge.svg)](https://github.com/msgbyte/tailchat/actions/workflows/ci.yaml) +[![Codemagic build status](https://api.codemagic.io/apps/63e27be62b9d4ca848b5491d/android/status_badge.svg)](https://codemagic.io/apps/63e27be62b9d4ca848b5491d/android/latest_build) +[![Desktop Build](https://github.com/msgbyte/tailchat/actions/workflows/desktop-build.yml/badge.svg)](https://github.com/msgbyte/tailchat/actions/workflows/desktop-build.yml) +[![deploy nightly](https://github.com/msgbyte/tailchat/actions/workflows/vercel-nightly.yml/badge.svg)](https://github.com/msgbyte/tailchat/actions/workflows/vercel-nightly.yml) + +![tailchat](https://socialify.git.ci/msgbyte/tailchat/image?description=1&font=Inter&forks=1&issues=1&language=1&logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F86033898%3Fs%3D200%26v%3D4&name=1&owner=1&pattern=Circuit%20Board&stargazers=1&theme=Light) + + +## 在您自己工作区中的下一代 noIM 应用程序 + +### 不仅仅是另一个 `Slack`, `Discord`, `Rocket.Chat`.... + +如果您对`noIM`的概念感兴趣,欢迎阅读我的博客: +- [是时候正式步入noIM的时代了](https://tailchat.msgbyte.com/zh-Hans/blog/2023/03/01/the-era-of-noIM) + +官方文档: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/) + +**Nightly版** 在线体验: [https://nightly.paw.msgbyte.com/](https://nightly.paw.msgbyte.com/) + +> Nightly版 为自动编译版本, 即每次提交代码都会自动编译。 +> 不保证数据的可靠性与稳定性 + +## 动机 + +目前现有的 IM 应用都仅仅把目光局限在聊天本身,而 IM 天然作为一个多人协作方式,在我看来应当能够承担更多的职责,将外部的应用以 IM 为转发方式形成自己独特的工作流。 + +因此,我提出了 `noIM` 的观点,意味着 **Not only IM**。而是设计了以 IM 为中心,第三方应用为增强功能,中间以插件系统作为胶水连接层的个人 / 团队高度自定义的应用平台。 + +为此,将功能进行抽象,并且花费了大量时间设计底层的机制,诞生了 `Tailchat` 这样的一个从底层设计之初就为了拓展而存在的即时通讯应用。通过 `Tailchat` 的插件系统,开发者可以很轻松的将喜欢的应用以一种非常自然的方式作为 `Tailchat` 的一部分。与传统的类似如 `Slack` 的集成方式不同的是,`Tailchat` 的集成更加自由,就仿佛天然就是一个原生的功能一般。 + +## 特性 + +- 注重隐私,只有被邀请的成员才能加入群组 +- 防止陌生人,只有通过昵称 + 一串随机的数字才能添加好友 +- 二维的群组空间,通过频道来分割不同的话题 +- 高度自定义的群组空间, 通过分组和拖拽来创建独创的群组空间。同时可以通过更多的插件来增加更多的能力 +- 可以严谨,也可以乐趣。通过插件的组合可以创造用于不同场景的 Tailchat。可以是面向娱乐,也可以是面向企业 +- 后端微服务架构,已经为大规模部署做好了准备。不用担心用户量大了以后怎么办 + +## 性能与拓展 + +`Tailchat` 是一个基于 **React** + **Typescript** 的现代开源 noIM 应用程序 + +前端微内核架构 + 后端微服务架构,`Tailchat` 已经为集群化部署做好了准备。 + +前端通过插件机制为应用赋能,对于 `Tailchat` 的二次开发来说非常简单且易用。 + +**NOTICE: 虽然目前 `Tailchat` 的核心功能处于稳定阶段,但它对于第三方开发者暴露的接口仍在不断完善中,一般来说是向下兼容的,但保留出现 `Break Change` 的可能性** + +## 预览 + +![](./website/static/img/intro/hello.png) + +![](./website/static/img/intro/plugins.png) + +![](./website/static/img/intro/roles.png) + +访问官方网站了解更多: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/) + +## 交流 + +如果对 Tailchat 感兴趣,欢迎加入 Tailchat 的种子用户交流群,您的反馈可以帮助 Tailchat 更好的成长 + +## 快速部署 +### 使用 Sealos 部署 + +[![Deploy on Sealos](https://raw.githubusercontent.com/labring-actions/templates/main/Deploy-on-Sealos.svg)](https://cloud.sealos.io/?openapp=system-template%3FtemplateName%3Dtailchat) + +### 使用 ClawCloud Run 部署 + +[![Run on ClawCloud](https://raw.githubusercontent.com/ClawCloud/Run-Template/refs/heads/main/Run-on-ClawCloud.svg)](https://template.run.claw.cloud/?referralCode=R8D5TGYVHBNJ&openapp=system-fastdeploy%3FtemplateName%3Dtailchat) + +### 使用宝塔快速部署 + +[使用宝塔部署一键部署](https://tailchat.msgbyte.com/zh-Hans/docs/deployment/other-way/bt) + +### 社区 + +[Tailchat Nightly Group](https://nightly.paw.msgbyte.com/invite/8Jfm1dWb) + +### 微信 + + + +## 项目活动 + +![Alt](https://repobeats.axiom.co/api/embed/b85cb500d902e0ad0cecb582557c006d8b663a01.svg "Repobeats analytics image") + +## 开源协议 + +[Apache 2.0](./LICENSE) diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 57a51bf1c77..00000000000 --- a/app/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -node_modules/ -.expo/ -.expo-shared/ -npm-debug.* -*.jks -*.p8 -*.p12 -*.key -*.mobileprovision -*.orig.* -web-build/ -__generated__/ - -# macOS -.DS_Store diff --git a/app/.npmrc b/app/.npmrc deleted file mode 100644 index beb96333cab..00000000000 --- a/app/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -# https://npm.taobao.org/mirrors/ -registry = https://registry.npm.taobao.org diff --git a/app/App.tsx b/app/App.tsx deleted file mode 100644 index c08286ccc07..00000000000 --- a/app/App.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { StatusBar } from 'expo-status-bar'; -import React from 'react'; -import { StyleSheet, View } from 'react-native'; -import { AppMain } from './components/AppMain'; - -/** - * 入口文件, 由 expo 管理 - */ -export default function App() { - return ( - - - - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: '#fff', - }, -}); diff --git a/app/app.json b/app/app.json deleted file mode 100644 index 81779e16c4e..00000000000 --- a/app/app.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "expo": { - "name": "Tailchat", - "slug": "tailchat", - "version": "1.0.0", - "orientation": "portrait", - "icon": "./assets/icon.png", - "splash": { - "image": "./assets/splash.png", - "resizeMode": "contain", - "backgroundColor": "#ffffff" - }, - "updates": { - "fallbackToCacheTimeout": 0 - }, - "assetBundlePatterns": [ - "**/*" - ], - "ios": { - "supportsTablet": true - }, - "android": { - "adaptiveIcon": { - "foregroundImage": "./assets/adaptive-icon.png", - "backgroundColor": "#FFFFFF" - } - }, - "web": { - "favicon": "./assets/favicon.png" - }, - "description": "A IM application which easy to use and develop", - "githubUrl": "https://github.com/msgbyte/tailchat" - } -} diff --git a/app/assets/adaptive-icon.png b/app/assets/adaptive-icon.png deleted file mode 100644 index 03d6f6b6c67..00000000000 Binary files a/app/assets/adaptive-icon.png and /dev/null differ diff --git a/app/assets/favicon.png b/app/assets/favicon.png deleted file mode 100644 index e75f697b180..00000000000 Binary files a/app/assets/favicon.png and /dev/null differ diff --git a/app/assets/icon.png b/app/assets/icon.png deleted file mode 100644 index a0b1526fc7b..00000000000 Binary files a/app/assets/icon.png and /dev/null differ diff --git a/app/assets/splash.png b/app/assets/splash.png deleted file mode 100644 index 6f47774733b..00000000000 Binary files a/app/assets/splash.png and /dev/null differ diff --git a/app/babel.config.js b/app/babel.config.js deleted file mode 100644 index 9d89e131194..00000000000 --- a/app/babel.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = function (api) { - api.cache(true); - return { - presets: ['babel-preset-expo'], - }; -}; diff --git a/app/components/AppMain.tsx b/app/components/AppMain.tsx deleted file mode 100644 index cbeb043cdf0..00000000000 --- a/app/components/AppMain.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react'; -import { StyleSheet } from 'react-native'; -import Constants from 'expo-constants'; -import { WebView } from 'react-native-webview'; - -/** - * Tailchat的主要内容 - * - * 由webview提供 - */ - -export const AppMain: React.FC = React.memo(() => { - return ( - - ); -}); -AppMain.displayName = 'AppMain'; - -const styles = StyleSheet.create({ - webview: { - flex: 1, - marginTop: Constants.statusBarHeight, - }, -}); diff --git a/app/package.json b/app/package.json deleted file mode 100644 index 7f069605bd2..00000000000 --- a/app/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "tailchat-app", - "version": "1.0.0", - "repository": "https://github.com/msgbyte/tailchat.git", - "author": "moonrailgun ", - "license": "GPLv3", - "private": true, - "main": "node_modules/expo/AppEntry.js", - "scripts": { - "start": "expo start", - "android": "expo start --android", - "ios": "expo start --ios", - "web": "expo start --web", - "eject": "expo eject" - }, - "dependencies": { - "expo": "~42.0.1", - "expo-status-bar": "~1.0.4", - "react": "16.13.1", - "react-dom": "16.13.1", - "react-native": "https://github.com/expo/react-native/archive/sdk-42.0.0.tar.gz", - "react-native-web": "~0.13.12", - "react-native-webview": "11.6.2" - }, - "devDependencies": { - "@babel/core": "^7.9.0", - "@types/react": "~16.9.35", - "@types/react-native": "~0.63.2", - "typescript": "~4.0.0" - } -} diff --git a/app/tsconfig.json b/app/tsconfig.json deleted file mode 100644 index b9567f6052d..00000000000 --- a/app/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "expo/tsconfig.base", - "compilerOptions": { - "strict": true - } -} diff --git a/app/yarn.lock b/app/yarn.lock deleted file mode 100644 index 58f1af82156..00000000000 --- a/app/yarn.lock +++ /dev/null @@ -1,5902 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8", "@babel/code-frame@^7.8.3": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" - integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/code-frame@~7.10.4": - version "7.10.4" - resolved "https://registry.npm.taobao.org/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/compat-data@^7.12.13", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.npm.taobao.org/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/core@7.9.0": - version "7.9.0" - resolved "https://registry.npm.taobao.org/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.0.0", "@babel/core@^7.9.0": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" - integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== - dependencies: - "@babel/code-frame" "^7.15.8" - "@babel/generator" "^7.15.8" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.8" - "@babel/helpers" "^7.15.4" - "@babel/parser" "^7.15.8" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.15.4", "@babel/generator@^7.15.8", "@babel/generator@^7.5.0", "@babel/generator@^7.9.0": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" - integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== - dependencies: - "@babel/types" "^7.15.6" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" - integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" - integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-compilation-targets@^7.12.17", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" - integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.12.13", "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" - integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - -"@babel/helper-create-regexp-features-plugin@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" - integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.2.2": - version "0.2.3" - resolved "https://registry.npm.taobao.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" - integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-explode-assignable-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" - integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" - integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== - dependencies: - "@babel/helper-get-function-arity" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-get-function-arity@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" - integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-hoist-variables@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" - integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8", "@babel/helper-module-transforms@^7.9.0": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" - integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== - dependencies: - "@babel/helper-module-imports" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-simple-access" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" - -"@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" - integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-wrap-function" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-simple-access@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" - integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.npm.taobao.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-wrap-function@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" - integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== - dependencies: - "@babel/helper-function-name" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helpers@^7.15.4", "@babel/helpers@^7.9.0": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== - dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8", "@babel/parser@^7.9.0": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" - integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" - integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - -"@babel/plugin-external-helpers@^7.0.0": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.14.5.tgz#920baa1569a8df5d5710abc342c7b1ac8968ed76" - integrity sha512-q/B/hLX+nDGk73Xn529d7Ar4ih17J8pNBbsXafq8oXij0XfFEA/bks+u+6q5q04zO5o/qivjzui6BqzPfYShEg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-async-generator-functions@^7.12.13", "@babel/plugin-proposal-async-generator-functions@^7.15.8": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz#a3100f785fab4357987c4223ab1b02b599048403" - integrity sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.15.4" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.12.13", "@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-class-properties@~7.12.13": - version "7.12.13" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" - integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-proposal-class-static-block@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" - integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-decorators@^7.6.0": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.15.8.tgz#eb2969abf8993f15289f09fed762bb1df1521bd5" - integrity sha512-5n8+xGK7YDrXF+WAORg3P7LlCCdiaAyKLZi22eP2BwTy4kJ0kFUMMDCj4nQ8YrKyNZgjhU/9eRVqONnjB3us8g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-decorators" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.12.17", "@babel/plugin-proposal-dynamic-import@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" - integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.14.5.tgz#8931a6560632c650f92a8e5948f6e73019d6d321" - integrity sha512-T8KZ5abXvKMjF6JcoXjgac3ElmXf0AWzJwi2O/42Jk+HmCky3D9+i1B7NPP1FblyceqTevKeV/9szeikFoaMDg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-default-from" "^7.14.5" - -"@babel/plugin-proposal-export-namespace-from@^7.12.13", "@babel/plugin-proposal-export-namespace-from@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" - integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.12.13", "@babel/plugin-proposal-json-strings@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" - integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.12.13", "@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" - integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13", "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.12.13", "@babel/plugin-proposal-numeric-separator@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" - integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.13", "@babel/plugin-proposal-object-rest-spread@^7.15.6": - version "7.15.6" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" - integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.15.4" - -"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.12.13", "@babel/plugin-proposal-optional-catch-binding@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" - integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.12.17", "@babel/plugin-proposal-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.12.13", "@babel/plugin-proposal-private-methods@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" - integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" - integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" - integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" - integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.14.5.tgz#cdfa9d43d2b2c89b6f1af3e83518e8c8b9ed0dbc" - integrity sha512-snWDxjuaPEobRBnhpqEfZ8RMxDbHt8+87fiEioGuE+Uc0xAKgSD8QiuL3lF93hPVQfZFAcYwrrf+H5qUhike3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.2.0": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180" - integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" - integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.12.13", "@babel/plugin-transform-arrow-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" - integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-async-to-generator@^7.12.13", "@babel/plugin-transform-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" - integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" - -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.12.13", "@babel/plugin-transform-block-scoped-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" - integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.15.3": - version "7.15.3" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" - integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.12.13", "@babel/plugin-transform-classes@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" - integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.12.13", "@babel/plugin-transform-computed-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" - integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.12.13", "@babel/plugin-transform-destructuring@^7.14.7": - version "7.14.7" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" - integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" - integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-duplicate-keys@^7.12.13", "@babel/plugin-transform-duplicate-keys@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" - integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.12.13", "@babel/plugin-transform-exponentiation-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" - integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz#0dc9c1d11dcdc873417903d6df4bed019ef0f85e" - integrity sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-flow" "^7.14.5" - -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.12.13", "@babel/plugin-transform-for-of@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" - integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.12.13", "@babel/plugin-transform-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" - integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== - dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.12.13", "@babel/plugin-transform-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" - integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.12.13", "@babel/plugin-transform-member-expression-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" - integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-modules-amd@^7.12.13", "@babel/plugin-transform-modules-amd@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" - integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.12.13", "@babel/plugin-transform-modules-commonjs@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" - integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== - dependencies: - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.15.4" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.12.13", "@babel/plugin-transform-modules-systemjs@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" - integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== - dependencies: - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.12.13", "@babel/plugin-transform-modules-umd@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" - integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13", "@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": - version "7.14.9" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" - integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - -"@babel/plugin-transform-new-target@^7.12.13", "@babel/plugin-transform-new-target@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" - integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-object-assign@^7.0.0": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.14.5.tgz#62537d54b6d85de04f4df48bfdba2eebff17b760" - integrity sha512-lvhjk4UN9xJJYB1mI5KC0/o1D5EcJXdbhVe+4fSk08D6ZN+iuAIs7LJC+71h8av9Ew4+uRq9452v9R93SFmQlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.12.13", "@babel/plugin-transform-object-super@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" - integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.12.13", "@babel/plugin-transform-parameters@^7.15.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" - integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.12.13", "@babel/plugin-transform-property-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" - integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.15.1" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" - integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.14.9" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz#33041e665453391eb6ee54a2ecf3ba1d46bd30f4" - integrity sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz#79f728e60e6dbd31a2b860b0bf6c9765918acf1d" - integrity sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.14.9" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" - integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-jsx" "^7.14.5" - "@babel/types" "^7.14.9" - -"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.12.13", "@babel/plugin-transform-regenerator@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.12.13", "@babel/plugin-transform-reserved-words@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" - integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-runtime@^7.0.0": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz#9d15b1e94e1c7f6344f65a8d573597d93c6cd886" - integrity sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw== - dependencies: - "@babel/helper-module-imports" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.5" - babel-plugin-polyfill-regenerator "^0.2.2" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.12.13", "@babel/plugin-transform-shorthand-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" - integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.12.13", "@babel/plugin-transform-spread@^7.15.8": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz#79d5aa27f68d700449b2da07691dfa32d2f6d468" - integrity sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" - -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.12.13", "@babel/plugin-transform-sticky-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" - integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.12.13", "@babel/plugin-transform-template-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" - integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.12.13", "@babel/plugin-transform-typeof-symbol@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" - integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typescript@^7.12.17", "@babel/plugin-transform-typescript@^7.5.0": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz#ff0e6a47de9b2d58652123ab5a879b2ff20665d8" - integrity sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.14.5" - -"@babel/plugin-transform-unicode-escapes@^7.12.13", "@babel/plugin-transform-unicode-escapes@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" - integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.12.13", "@babel/plugin-transform-unicode-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" - integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/preset-env@^7.6.3": - version "7.15.8" - resolved "https://registry.npm.taobao.org/@babel/preset-env/-/preset-env-7.15.8.tgz#f527ce5bcb121cd199f6b502bf23e420b3ff8dba" - integrity sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" - "@babel/plugin-proposal-async-generator-functions" "^7.15.8" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.15.4" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.15.6" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.15.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.15.3" - "@babel/plugin-transform-classes" "^7.15.4" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.15.4" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.4" - "@babel/plugin-transform-modules-systemjs" "^7.15.4" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.15.4" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.15.8" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.15.6" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.5" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.16.0" - semver "^6.3.0" - -"@babel/preset-env@~7.12.13": - version "7.12.17" - resolved "https://registry.npm.taobao.org/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa" - integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg== - dependencies: - "@babel/compat-data" "^7.12.13" - "@babel/helper-compilation-targets" "^7.12.17" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-proposal-async-generator-functions" "^7.12.13" - "@babel/plugin-proposal-class-properties" "^7.12.13" - "@babel/plugin-proposal-dynamic-import" "^7.12.17" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.12.13" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.12.13" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" - "@babel/plugin-proposal-optional-chaining" "^7.12.17" - "@babel/plugin-proposal-private-methods" "^7.12.13" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.12.13" - "@babel/plugin-transform-async-to-generator" "^7.12.13" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.12.13" - "@babel/plugin-transform-computed-properties" "^7.12.13" - "@babel/plugin-transform-destructuring" "^7.12.13" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.12.13" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.12.13" - "@babel/plugin-transform-modules-commonjs" "^7.12.13" - "@babel/plugin-transform-modules-systemjs" "^7.12.13" - "@babel/plugin-transform-modules-umd" "^7.12.13" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.12.13" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.12.13" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.12.13" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.12.13" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.17" - core-js-compat "^3.8.0" - semver "^5.5.0" - -"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.npm.taobao.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-typescript@~7.12.13": - version "7.12.17" - resolved "https://registry.npm.taobao.org/@babel/preset-typescript/-/preset-typescript-7.12.17.tgz#8ecf04618956c268359dd9feab775dc14a666eb5" - integrity sha512-T513uT4VSThRcmWeqcLkITKJ1oGQho9wfWuhQm10paClQkp1qyd0Wf8mvC8Se7UYssMyRSj4tZYpVTkCmAK/mA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-transform-typescript" "^7.12.17" - -"@babel/register@^7.0.0": - version "7.15.3" - resolved "https://registry.npm.taobao.org/@babel/register/-/register-7.15.3.tgz#6b40a549e06ec06c885b2ec42c3dd711f55fe752" - integrity sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw== - dependencies: - clone-deep "^4.0.1" - find-cache-dir "^2.0.0" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.8.4": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" - integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.0.0", "@babel/template@^7.15.4", "@babel/template@^7.8.6": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.9.0": - version "7.15.4" - resolved "https://registry.npm.taobao.org/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" - integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.17", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.4.4", "@babel/types@^7.9.0": - version "7.15.6" - resolved "https://registry.npm.taobao.org/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" - integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.npm.taobao.org/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha1-+GSuhQBND8q29QvpFBxNo2jRZWo= - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@expo/config-plugins@2.0.4": - version "2.0.4" - resolved "https://registry.npm.taobao.org/@expo/config-plugins/-/config-plugins-2.0.4.tgz#955fd70a2aeefbe99ec71cecb1d7ea7b626dc79e" - integrity sha512-JGt/X2tFr7H8KBQrKfbGo9hmCubQraMxq5sj3bqDdKmDOLcE1a/EDCP9g0U4GHsa425J8VDIkQUHYz3h3ndEXQ== - dependencies: - "@expo/config-types" "^41.0.0" - "@expo/json-file" "8.2.30" - "@expo/plist" "0.0.13" - debug "^4.3.1" - find-up "~5.0.0" - fs-extra "9.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - slash "^3.0.0" - xcode "^3.0.1" - xml2js "^0.4.23" - -"@expo/config-plugins@3.1.0", "@expo/config-plugins@^3.0.0": - version "3.1.0" - resolved "https://registry.npm.taobao.org/@expo/config-plugins/-/config-plugins-3.1.0.tgz#0752ff33c5eab21cf42034a44e79df97f0f867f8" - integrity sha512-V5qxaxCAExBM0TXmbU1QKiZcAGP3ecu7KXede8vByT15cro5PkcWu2sSdJCYbHQ/gw6Vf/i8sr8gKlN8V8TSLg== - dependencies: - "@expo/config-types" "^42.0.0" - "@expo/json-file" "8.2.33" - "@expo/plist" "0.0.14" - chalk "^4.1.2" - debug "^4.3.1" - find-up "~5.0.0" - fs-extra "9.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - semver "^7.3.5" - slash "^3.0.0" - xcode "^3.0.1" - xml2js "^0.4.23" - -"@expo/config-types@^41.0.0": - version "41.0.0" - resolved "https://registry.npm.taobao.org/@expo/config-types/-/config-types-41.0.0.tgz#ffe1444c6c26e0e3a8f7149b4afe486e357536d1" - integrity sha512-Ax0pHuY5OQaSrzplOkT9DdpdmNzaVDnq9VySb4Ujq7UJ4U4jriLy8u93W98zunOXpcu0iiKubPsqD6lCiq0pig== - -"@expo/config-types@^42.0.0": - version "42.0.0" - resolved "https://registry.npm.taobao.org/@expo/config-types/-/config-types-42.0.0.tgz#3e3e125ec092c0c34dbfaf19be5480402de3d677" - integrity sha512-Rj02OMZke2MrGa/1Y/EScmR7VuWbDEHPJyvfFyyLbadUt+Yv6isCdeFzDt71I7gJlPR9T4fzixeYLrtXXOTq0w== - -"@expo/config@5.0.9": - version "5.0.9" - resolved "https://registry.npm.taobao.org/@expo/config/-/config-5.0.9.tgz#5221af5394599d861515ef8513731f21fbb322db" - integrity sha512-eZj+cf03wkQQdHSpYvrmiqAsn2dJV10uhHIwXyeFBaFvhds0NgThOldJZfOppQ4QUaGobB/vaJ7UqUa3B0PCMw== - dependencies: - "@babel/code-frame" "~7.10.4" - "@expo/config-plugins" "3.1.0" - "@expo/config-types" "^42.0.0" - "@expo/json-file" "8.2.33" - getenv "^1.0.0" - glob "7.1.6" - require-from-string "^2.0.2" - resolve-from "^5.0.0" - semver "7.3.2" - slugify "^1.3.4" - sucrase "^3.20.0" - -"@expo/config@^4.0.0": - version "4.0.4" - resolved "https://registry.npm.taobao.org/@expo/config/-/config-4.0.4.tgz#48686c2b83bc00db469e01592e396e973e91e11d" - integrity sha512-O3xRlwMCidOgk1WHIy6eOjh2yp0h/kgBDRNKqPe21+YDiOufyTGGNvbWgHwoax8goa1iMg443WQO7GhvaH286g== - dependencies: - "@babel/core" "7.9.0" - "@babel/plugin-proposal-class-properties" "~7.12.13" - "@babel/preset-env" "~7.12.13" - "@babel/preset-typescript" "~7.12.13" - "@expo/config-plugins" "2.0.4" - "@expo/config-types" "^41.0.0" - "@expo/json-file" "8.2.30" - fs-extra "9.0.0" - getenv "^1.0.0" - glob "7.1.6" - require-from-string "^2.0.2" - resolve-from "^5.0.0" - semver "7.3.2" - slugify "^1.3.4" - -"@expo/json-file@8.2.30": - version "8.2.30" - resolved "https://registry.npm.taobao.org/@expo/json-file/-/json-file-8.2.30.tgz#bd855b6416b5c3af7e55b43f6761c1e7d2b755b0" - integrity sha512-vrgGyPEXBoFI5NY70IegusCSoSVIFV3T3ry4tjJg1MFQKTUlR7E0r+8g8XR6qC705rc2PawaZQjqXMAVtV6s2A== - dependencies: - "@babel/code-frame" "~7.10.4" - fs-extra "9.0.0" - json5 "^1.0.1" - write-file-atomic "^2.3.0" - -"@expo/json-file@8.2.33": - version "8.2.33" - resolved "https://registry.npm.taobao.org/@expo/json-file/-/json-file-8.2.33.tgz#78f56f33a2cfb807b23c81e00237a33159aa1f32" - integrity sha512-CDnhjdirUs6OdN5hOSTJ2y3i9EiJMk7Z5iDljC5xyCHCrUex7oyI8vbRsZEojAahxZccgL/PrO+CjakiFFWurg== - dependencies: - "@babel/code-frame" "~7.10.4" - json5 "^1.0.1" - write-file-atomic "^2.3.0" - -"@expo/metro-config@^0.1.70": - version "0.1.84" - resolved "https://registry.npm.taobao.org/@expo/metro-config/-/metro-config-0.1.84.tgz#ddcc7b4f1087c29f86bc9d916933d29bacd2c726" - integrity sha512-xWSfM0+AxcKw0H8mc1RuKs4Yy4JT4SJfn4yDnGLAlKkHlEC+D2seZvb/Tdd173e/LANmcarNd+OcDYu03AmVWA== - dependencies: - "@expo/config" "5.0.9" - chalk "^4.1.0" - getenv "^1.0.0" - metro-react-native-babel-transformer "^0.59.0" - -"@expo/plist@0.0.13": - version "0.0.13" - resolved "https://registry.npm.taobao.org/@expo/plist/-/plist-0.0.13.tgz#700a48d9927aa2b0257c613e13454164e7371a96" - integrity sha512-zGPSq9OrCn7lWvwLLHLpHUUq2E40KptUFXn53xyZXPViI0k9lbApcR9KlonQZ95C+ELsf0BQ3gRficwK92Ivcw== - dependencies: - base64-js "^1.2.3" - xmlbuilder "^14.0.0" - xmldom "~0.5.0" - -"@expo/plist@0.0.14": - version "0.0.14" - resolved "https://registry.npm.taobao.org/@expo/plist/-/plist-0.0.14.tgz#a756903bd28aabe0a961222df2e7858a39a218c9" - integrity sha512-bb4Ua1M/OdNgS8KiGdSDUjZ/bbPfv3xdPY/lz8Ctp/adlj/QgB8xA7tVPeqSSfJPZqFRwU0qLCnRhpUOnP51VQ== - dependencies: - "@xmldom/xmldom" "~0.7.0" - base64-js "^1.2.3" - xmlbuilder "^14.0.0" - -"@expo/vector-icons@^12.0.4": - version "12.0.5" - resolved "https://registry.npm.taobao.org/@expo/vector-icons/-/vector-icons-12.0.5.tgz#bc508ad05fb7e9a3e008704977cfec6c18aa7728" - integrity sha512-zWvHBmkpbi1KrPma6Y+r/bsGI6MjbM1MBSe6W9A4uYMLhNI5NR4JtTnqxhf7g1XdpaDtBdv5aOWKEx4d5rxnhg== - dependencies: - lodash.frompairs "^4.0.1" - lodash.isequal "^4.5.0" - lodash.isstring "^4.0.1" - lodash.omit "^4.5.0" - lodash.pick "^4.4.0" - lodash.template "^4.5.0" - -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.npm.taobao.org/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.npm.taobao.org/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha1-CnCVreoGckPOMoPhtWuKj0U7JCo= - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.npm.taobao.org/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== - -"@hapi/joi@^15.0.3": - version "15.1.1" - resolved "https://registry.npm.taobao.org/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== - dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" - -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.npm.taobao.org/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.0" - -"@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.npm.taobao.org/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.npm.taobao.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - -"@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.npm.taobao.org/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.npm.taobao.org/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.npm.taobao.org/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.npm.taobao.org/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.npm.taobao.org/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npm.taobao.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npm.taobao.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npm.taobao.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@react-native-community/cli-debugger-ui@^4.13.1": - version "4.13.1" - resolved "https://registry.npm.taobao.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz#07de6d4dab80ec49231de1f1fbf658b4ad39b32c" - integrity sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg== - dependencies: - serve-static "^1.13.1" - -"@react-native-community/cli-hermes@^4.13.0": - version "4.13.0" - resolved "https://registry.npm.taobao.org/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz#6243ed9c709dad5e523f1ccd7d21066b32f2899d" - integrity sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ== - dependencies: - "@react-native-community/cli-platform-android" "^4.13.0" - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" - -"@react-native-community/cli-platform-android@^4.13.0": - version "4.13.0" - resolved "https://registry.npm.taobao.org/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz#922681ec82ee1aadd993598b814df1152118be02" - integrity sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA== - dependencies: - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" - execa "^1.0.0" - fs-extra "^8.1.0" - glob "^7.1.3" - jetifier "^1.6.2" - lodash "^4.17.15" - logkitty "^0.7.1" - slash "^3.0.0" - xmldoc "^1.1.2" - -"@react-native-community/cli-platform-ios@^4.13.0": - version "4.13.0" - resolved "https://registry.npm.taobao.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz#a738915c68cac86df54e578b59a1311ea62b1aef" - integrity sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA== - dependencies: - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" - glob "^7.1.3" - js-yaml "^3.13.1" - lodash "^4.17.15" - plist "^3.0.1" - xcode "^2.0.0" - -"@react-native-community/cli-server-api@^4.13.1": - version "4.13.1" - resolved "https://registry.npm.taobao.org/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz#bee7ee9702afce848e9d6ca3dcd5669b99b125bd" - integrity sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ== - dependencies: - "@react-native-community/cli-debugger-ui" "^4.13.1" - "@react-native-community/cli-tools" "^4.13.0" - compression "^1.7.1" - connect "^3.6.5" - errorhandler "^1.5.0" - nocache "^2.1.0" - pretty-format "^25.1.0" - serve-static "^1.13.1" - ws "^1.1.0" - -"@react-native-community/cli-tools@^4.13.0": - version "4.13.0" - resolved "https://registry.npm.taobao.org/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz#b406463d33af16cedc4305a9a9257ed32845cf1b" - integrity sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg== - dependencies: - chalk "^3.0.0" - lodash "^4.17.15" - mime "^2.4.1" - node-fetch "^2.6.0" - open "^6.2.0" - shell-quote "1.6.1" - -"@react-native-community/cli-types@^4.10.1": - version "4.10.1" - resolved "https://registry.npm.taobao.org/@react-native-community/cli-types/-/cli-types-4.10.1.tgz#d68a2dcd1649d3b3774823c64e5e9ce55bfbe1c9" - integrity sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ== - -"@react-native-community/cli@^4.14.0": - version "4.14.0" - resolved "https://registry.npm.taobao.org/@react-native-community/cli/-/cli-4.14.0.tgz#bb106a98341bfa2db36060091ff90bfe82ea4f55" - integrity sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q== - dependencies: - "@hapi/joi" "^15.0.3" - "@react-native-community/cli-debugger-ui" "^4.13.1" - "@react-native-community/cli-hermes" "^4.13.0" - "@react-native-community/cli-server-api" "^4.13.1" - "@react-native-community/cli-tools" "^4.13.0" - "@react-native-community/cli-types" "^4.10.1" - chalk "^3.0.0" - command-exists "^1.2.8" - commander "^2.19.0" - cosmiconfig "^5.1.0" - deepmerge "^3.2.0" - envinfo "^7.7.2" - execa "^1.0.0" - find-up "^4.1.0" - fs-extra "^8.1.0" - glob "^7.1.3" - graceful-fs "^4.1.3" - inquirer "^3.0.6" - leven "^3.1.0" - lodash "^4.17.15" - metro "^0.59.0" - metro-config "^0.59.0" - metro-core "^0.59.0" - metro-react-native-babel-transformer "^0.59.0" - metro-resolver "^0.59.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - node-stream-zip "^1.9.1" - ora "^3.4.0" - pretty-format "^25.2.0" - semver "^6.3.0" - serve-static "^1.13.1" - strip-ansi "^5.2.0" - sudo-prompt "^9.0.0" - wcwidth "^1.0.1" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.3" - resolved "https://registry.npm.taobao.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npm.taobao.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.npm.taobao.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npm.taobao.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/node@*": - version "16.10.9" - resolved "https://registry.npm.taobao.org/@types/node/-/node-16.10.9.tgz#8f1cdd517972f76a3b928298f4c0747cd6fef25a" - integrity sha512-H9ReOt+yqIJPCutkTYjFjlyK6WEMQYT9hLZMlWtOjFQY2ItppsWZ6RJf8Aw+jz5qTYceuHvFgPIaKOHtLAEWBw== - -"@types/prop-types@*": - version "15.7.4" - resolved "https://registry.npm.taobao.org/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== - -"@types/react-native@~0.63.2": - version "0.63.53" - resolved "https://registry.npm.taobao.org/@types/react-native/-/react-native-0.63.53.tgz#776dc1b05d649cb41b05fdff06e41ab9066538ca" - integrity sha512-hfUYHlfuy436viNct5uYNh2y40iWl1+iWhAQ18vzoKtyeW4WLNyccZf6OfkJdkqkHyH+bgvHLhbmnocpnQeKXg== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "17.0.29" - resolved "https://registry.npm.taobao.org/@types/react/-/react-17.0.29.tgz#9535f3fc01a4981ce9cadcf0daa2593c0c2f2251" - integrity sha512-HSenIfBEBZ70BLrrVhtEtHpqaP79waauPtA8XKlczTxL3hXrW/ElGNLTpD1TmqkykgGlOAK55+D3SmUHEirpFw== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@~16.9.35": - version "16.9.56" - resolved "https://registry.npm.taobao.org/@types/react/-/react-16.9.56.tgz#ea25847b53c5bec064933095fc366b1462e2adf0" - integrity sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.npm.taobao.org/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.npm.taobao.org/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.npm.taobao.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== - -"@types/yargs@^13.0.0": - version "13.0.12" - resolved "https://registry.npm.taobao.org/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" - integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.npm.taobao.org/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== - dependencies: - "@types/yargs-parser" "*" - -"@unimodules/core@~7.1.2": - version "7.1.2" - resolved "https://registry.npm.taobao.org/@unimodules/core/-/core-7.1.2.tgz#5181b99586476a5d87afd0958f26a04714c47fa1" - integrity sha512-lY+e2TAFuebD3vshHMIRqru3X4+k7Xkba4Wa7QsDBd+ex4c4N2dHAO61E2SrGD9+TRBD8w/o7mzK6ljbqRnbyg== - dependencies: - compare-versions "^3.4.0" - -"@unimodules/react-native-adapter@~6.3.7": - version "6.3.9" - resolved "https://registry.npm.taobao.org/@unimodules/react-native-adapter/-/react-native-adapter-6.3.9.tgz#2f4bef6b7532dce5bf9f236e69f96403d0243c30" - integrity sha512-i9/9Si4AQ8awls+YGAKkByFbeAsOPgUNeLoYeh2SQ3ddjxJ5ZJDtq/I74clDnpDcn8zS9pYlcDJ9fgVJa39Glw== - dependencies: - expo-modules-autolinking "^0.0.3" - invariant "^2.2.4" - -"@xmldom/xmldom@~0.7.0": - version "0.7.5" - resolved "https://registry.npm.taobao.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d" - integrity sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha1-6vVNU7YrrkE46AnKIlyEOabvs5I= - dependencies: - event-target-shim "^5.0.0" - -absolute-path@^0.0.0: - version "0.0.0" - resolved "https://registry.npm.taobao.org/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" - integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c= - -accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.npm.taobao.org/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -anser@^1.4.9: - version "1.4.10" - resolved "https://registry.npm.taobao.org/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" - integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== - -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.npm.taobao.org/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== - dependencies: - ansi-wrap "^0.1.0" - -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= - dependencies: - ansi-wrap "0.1.0" - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.npm.taobao.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-fragments@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" - integrity sha1-JECcVsTMN4F8PXyqmdiWni3loF4= - dependencies: - colorette "^1.0.7" - slice-ansi "^2.0.0" - strip-ansi "^5.0.0" - -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npm.taobao.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npm.taobao.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npm.taobao.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npm.taobao.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.npm.taobao.org/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= - -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.npm.taobao.org/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.npm.taobao.org/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= - -array-find-index@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.npm.taobao.org/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.npm.taobao.org/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= - -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.npm.taobao.org/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.npm.taobao.org/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asap@~2.0.3, asap@~2.0.6: - version "2.0.6" - resolved "https://registry.npm.taobao.org/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= - -async@^2.4.0: - version "2.6.3" - resolved "https://registry.npm.taobao.org/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha1-YCzUtG6EStTv/JKoARo8RuAjjcI= - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.npm.taobao.org/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha1-hP2hnJduxcbe/vV/lCez3vZuF6M= - dependencies: - object.assign "^4.1.0" - -babel-plugin-module-resolver@^3.2.0: - version "3.2.0" - resolved "https://registry.npm.taobao.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" - integrity sha1-3fpeMB47mqEthSqZefGLN4gf9ac= - dependencies: - find-babel-config "^1.1.0" - glob "^7.1.2" - pkg-up "^2.0.0" - reselect "^3.0.1" - resolve "^1.4.0" - -babel-plugin-polyfill-corejs2@^0.2.2: - version "0.2.2" - resolved "https://registry.npm.taobao.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" - integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.2.5: - version "0.2.5" - resolved "https://registry.npm.taobao.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" - integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.16.2" - -babel-plugin-polyfill-regenerator@^0.2.2: - version "0.2.2" - resolved "https://registry.npm.taobao.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" - integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - -babel-plugin-react-native-web@~0.13.6: - version "0.13.18" - resolved "https://registry.npm.taobao.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.13.18.tgz#f0b640412b81acd02d8036b7a935ffb3ab446e4e" - integrity sha512-f8pAxyKqXBNRIh8l4Sqju055BNec+DQlItdtutByYxULU0iJ1F7evIYE3skPKAkTB/xJH17l+n3Z8dVabGIIGg== - -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.npm.taobao.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha1-qiE8FDXiv/62/KhCKH71NK0F1c8= - -babel-preset-expo@~8.4.1: - version "8.4.1" - resolved "https://registry.npm.taobao.org/babel-preset-expo/-/babel-preset-expo-8.4.1.tgz#fbe6a2439fe73bb6ec1eff8742310312f8d8c9b2" - integrity sha512-bfNX+GWhBCC8SzOzuF5VI5rKftv+E+Leyq83R9h3S+nTzDEtGSnMsRoPCqGHXDbleJApBVKXGZpxWXR5B91HlQ== - dependencies: - "@babel/plugin-proposal-decorators" "^7.6.0" - "@babel/preset-env" "^7.6.3" - babel-plugin-module-resolver "^3.2.0" - babel-plugin-react-native-web "~0.13.6" - metro-react-native-babel-preset "~0.59.0" - -babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: - version "3.4.0" - resolved "https://registry.npm.taobao.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" - integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.npm.taobao.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.npm.taobao.org/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -big-integer@^1.6.44: - version "1.6.50" - resolved "https://registry.npm.taobao.org/big-integer/-/big-integer-1.6.50.tgz#299a4be8bd441c73dcc492ed46b7169c34e92e70" - integrity sha512-+O2uoQWFRo8ysZNo/rjtri2jIwjr3XfeAgRjAUADRqGG+ZITvyn8J1kvXLTaKVr3hhGXk+f23tKfdzmklVM9vQ== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.npm.taobao.org/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= - dependencies: - file-uri-to-path "1.0.0" - -blueimp-md5@^2.10.0: - version "2.19.0" - resolved "https://registry.npm.taobao.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" - integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== - -bplist-creator@0.0.8: - version "0.0.8" - resolved "https://registry.npm.taobao.org/bplist-creator/-/bplist-creator-0.0.8.tgz#56b2a6e79e9aec3fc33bf831d09347d73794e79c" - integrity sha1-VrKm556a7D/DO/gx0JNH1zeU55w= - dependencies: - stream-buffers "~2.2.0" - -bplist-parser@0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha1-Q6nRg+W/nVRSAM6sPnEveeu+jQ4= - dependencies: - big-integer "^1.6.44" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npm.taobao.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.npm.taobao.org/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - 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.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1: - version "3.0.2" - resolved "https://registry.npm.taobao.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.16.6, browserslist@^4.17.3: - version "4.17.4" - resolved "https://registry.npm.taobao.org/browserslist/-/browserslist-4.17.4.tgz#72e2508af2a403aec0a49847ef31bd823c57ead4" - integrity sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ== - dependencies: - caniuse-lite "^1.0.30001265" - electron-to-chromium "^1.3.867" - escalade "^3.1.1" - node-releases "^2.0.0" - picocolors "^1.0.0" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU= - dependencies: - node-int64 "^0.4.0" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.1.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow= - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@^0.2.13: - version "0.2.13" - resolved "https://registry.npm.taobao.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npm.taobao.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npm.taobao.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001265: - version "1.0.30001267" - resolved "https://registry.npm.taobao.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz#b1cf2937175afc0570e4615fc2d2f9069fa0ed30" - integrity sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha1-+5U7+uvreB9iiYI52rtCbQilCaQ= - dependencies: - rsvp "^4.8.4" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npm.taobao.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npm.taobao.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.npm.taobao.org/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.npm.taobao.org/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-spinners@^2.0.0: - version "2.6.1" - resolved "https://registry.npm.taobao.org/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.npm.taobao.org/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.npm.taobao.org/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.npm.taobao.org/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npm.taobao.org/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c= - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.npm.taobao.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npm.taobao.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npm.taobao.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npm.taobao.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.npm.taobao.org/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -colorette@^1.0.7: - version "1.4.0" - resolved "https://registry.npm.taobao.org/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.npm.taobao.org/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha1-xQclrzgIyKsCYP1gsB+/oluVT2k= - -commander@^2.19.0: - version "2.20.3" - resolved "https://registry.npm.taobao.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.npm.taobao.org/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npm.taobao.org/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.npm.taobao.org/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -compare-versions@^3.4.0: - version "3.6.0" - resolved "https://registry.npm.taobao.org/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" - integrity sha1-GlaJkTaF5ah2N7jT/8p1UU7EHWI= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.npm.taobao.org/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npm.taobao.org/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o= - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.1: - version "1.7.4" - resolved "https://registry.npm.taobao.org/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npm.taobao.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.npm.taobao.org/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -connect@^3.6.5: - version "3.7.0" - resolved "https://registry.npm.taobao.org/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg= - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npm.taobao.org/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.16.0, core-js-compat@^3.16.2, core-js-compat@^3.8.0: - version "3.18.3" - resolved "https://registry.npm.taobao.org/core-js-compat/-/core-js-compat-3.18.3.tgz#e0e7e87abc55efb547e7fa19169e45fa9df27a67" - integrity sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw== - dependencies: - browserslist "^4.17.3" - semver "7.0.0" - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.npm.taobao.org/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.4.1: - version "2.6.12" - resolved "https://registry.npm.taobao.org/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npm.taobao.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: - version "5.2.1" - resolved "https://registry.npm.taobao.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -create-react-class@^15.6.2: - version "15.7.0" - resolved "https://registry.npm.taobao.org/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" - integrity sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng== - dependencies: - loose-envify "^1.3.1" - object-assign "^4.1.1" - -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.npm.taobao.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -css-in-js-utils@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" - integrity sha1-O0crOYeHKRtHz+PkT+z92ekUupk= - dependencies: - hyphenate-style-name "^1.0.2" - isobject "^3.0.1" - -csstype@^3.0.2: - version "3.0.9" - resolved "https://registry.npm.taobao.org/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" - integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== - -dayjs@^1.8.15: - version "1.10.7" - resolved "https://registry.npm.taobao.org/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" - integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.npm.taobao.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.2" - resolved "https://registry.npm.taobao.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/deep-assign/-/deep-assign-3.0.0.tgz#c8e4c4d401cba25550a2f0f486a2e75bc5f219a2" - integrity sha1-yOTE1AHLolVQovD0hqLnW8XyGaI= - dependencies: - is-obj "^1.0.0" - -deepmerge@^3.2.0: - version "3.3.0" - resolved "https://registry.npm.taobao.org/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.npm.taobao.org/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.npm.taobao.org/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.npm.taobao.org/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.npm.taobao.org/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.npm.taobao.org/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.867: - version "1.3.867" - resolved "https://registry.npm.taobao.org/electron-to-chromium/-/electron-to-chromium-1.3.867.tgz#7cb484db4b57c28da0b65c51e434c3a1f3f9aa0d" - integrity sha512-WbTXOv7hsLhjJyl7jBfDkioaY++iVVZomZ4dU6TMe/SzucV6mUAs2VZn/AehBwuZMiNEQDaPuTGn22YK5o+aDw== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.npm.taobao.org/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npm.taobao.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.npm.taobao.org/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npm.taobao.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= - dependencies: - once "^1.4.0" - -envinfo@^7.7.2: - version "7.8.1" - resolved "https://registry.npm.taobao.org/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npm.taobao.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.6: - version "2.0.6" - resolved "https://registry.npm.taobao.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha1-WpmnB716TFinl5AtSNgoA+3mqtg= - dependencies: - stackframe "^1.1.1" - -errorhandler@^1.5.0: - version "1.5.1" - resolved "https://registry.npm.taobao.org/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" - integrity sha1-ubpdF8+QdEzR6FE1em51v4BqmpE= - dependencies: - accepts "~1.3.7" - escape-html "~1.0.3" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npm.taobao.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npm.taobao.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npm.taobao.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npm.taobao.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npm.taobao.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -event-target-shim@^5.0.0, event-target-shim@^5.0.1: - version "5.0.1" - resolved "https://registry.npm.taobao.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha1-XU0+vflYPWOlMzzi3rdICrKwV4k= - -eventemitter3@^3.0.0: - version "3.1.2" - resolved "https://registry.npm.taobao.org/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha1-LT1I+cNGaY/Og6hdfWZOmFNd9uc= - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.npm.taobao.org/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha1-/yZPnjJVGaYMteJzaSlDSDzKY7w= - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.npm.taobao.org/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expo-application@~3.2.0: - version "3.2.0" - resolved "https://registry.npm.taobao.org/expo-application/-/expo-application-3.2.0.tgz#d029445cbc486b66f31ec3b8d556334119cebf48" - integrity sha512-NDPQAtB05Jeiw771bDYsecbLrLA39X33Jk8uP1VUVdHMy6cCfJrL8PSDssgMLElAzR94K8toeqdGsGx9mVv8zw== - -expo-asset@~8.3.3: - version "8.3.3" - resolved "https://registry.npm.taobao.org/expo-asset/-/expo-asset-8.3.3.tgz#b54ab9999efb3d2086329fc5b1bed04fede8f682" - integrity sha512-qCm5d14tzswY8DcmRJ+0WkY9tc3OiVikBAiw2hCMC+bFpK/bEdqy4Zwfd69MFIAJ0taJpHWhdUoBRO0byQLlfg== - dependencies: - blueimp-md5 "^2.10.0" - invariant "^2.2.4" - md5-file "^3.2.3" - path-browserify "^1.0.0" - url-parse "^1.4.4" - -expo-constants@~11.0.2: - version "11.0.2" - resolved "https://registry.npm.taobao.org/expo-constants/-/expo-constants-11.0.2.tgz#069930145908fef7d76bf72a1a874a1d4621af82" - integrity sha512-CVjM+FbOMe/nFOSly5lnj0seMAYsjjc6+q3X8nIXG+gtw9iNBLwMX3Fz308rxiaPRJw+TBdd5/mcGJdNfoS+ew== - dependencies: - "@expo/config" "^4.0.0" - expo-modules-core "~0.2.0" - uuid "^3.3.2" - -expo-error-recovery@~2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/expo-error-recovery/-/expo-error-recovery-2.2.0.tgz#89e5494d97347530dd53cd817d7ac63f07bf8de0" - integrity sha512-HKbu6VHAlfhoP7y+HaGJwJizoUTY2eBTBHAi1RE7l/r4sc+cAegTmwwqf/3AOR8C7VntDvuQKtW7NZIyA+62KQ== - -expo-file-system@~11.1.3: - version "11.1.3" - resolved "https://registry.npm.taobao.org/expo-file-system/-/expo-file-system-11.1.3.tgz#f344bd175a5f65e2a97d2d6a1fd4c8da06386639" - integrity sha512-FBRcD6ojrkrZiTZ8O7Fbo833HhZtkhKtLDj4RNZIMpF1i+ZBD2bmeMcfLMeRHNYcBeJno9C4AVXoNQFqDCGQDg== - dependencies: - "@expo/config-plugins" "^3.0.0" - expo-modules-core "~0.2.0" - uuid "^3.4.0" - -expo-font@~9.2.1: - version "9.2.1" - resolved "https://registry.npm.taobao.org/expo-font/-/expo-font-9.2.1.tgz#c7586b009bf3c4c2427d33c360015d354960bd70" - integrity sha512-sT9nm2Dt1nTLz+Ir1fSpyzqH40eJX324Wu5sPyvT2Ivnmu2rw2rxt3gNa8Kvdb8BPRz4qrRvHR/E+YKMqa6ZgQ== - dependencies: - expo-modules-core "~0.2.0" - fontfaceobserver "^2.1.0" - -expo-keep-awake@~9.2.0: - version "9.2.0" - resolved "https://registry.npm.taobao.org/expo-keep-awake/-/expo-keep-awake-9.2.0.tgz#9cbdcc8264c943ef29a58326236cd34267e98f43" - integrity sha512-R5jAx5j3MqrhKFB307FBpaHtYSYeVIFX/rVforBF5inKonYjXRWVhjGoBjolF4geAryNamC3NKhMfxyaaB0W6Q== - -expo-modules-autolinking@^0.0.3: - version "0.0.3" - resolved "https://registry.npm.taobao.org/expo-modules-autolinking/-/expo-modules-autolinking-0.0.3.tgz#45ba8cb1798f9339347ae35e96e9cc70eafb3727" - integrity sha512-azkCRYj/DxbK4udDuDxA9beYzQTwpJ5a9QA0bBgha2jHtWdFGF4ZZWSY+zNA5mtU3KqzYt8jWHfoqgSvKyu1Aw== - dependencies: - chalk "^4.1.0" - commander "^7.2.0" - fast-glob "^3.2.5" - find-up "~5.0.0" - fs-extra "^9.1.0" - -expo-modules-core@~0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/expo-modules-core/-/expo-modules-core-0.2.0.tgz#68e5b6e53d0afbf8d131578831aed657589a2d42" - integrity sha512-inpfZ5X/BaTtbj2wG9PA9AC0MN8VyId6KSRlVuEg7+ziurHBy/kKDFxpOddUokhwiln2uhoYPSStJjR/tKypdw== - -expo-status-bar@~1.0.4: - version "1.0.4" - resolved "https://registry.npm.taobao.org/expo-status-bar/-/expo-status-bar-1.0.4.tgz#d8a4c4418b5868c1606969b12bdee85b6fa7d8a4" - integrity sha512-s7nc496D/Zn1NGiMJ5wu6HyIdXxbgGtmZZtbHm7rpbcmLdf28GmMSNHDx7M0t00BMhky7VAurTCUo+BJs8ugsw== - -expo@~42.0.1: - version "42.0.4" - resolved "https://registry.npm.taobao.org/expo/-/expo-42.0.4.tgz#07b0e044e43f7cb366e2082850b41b8bb5117a21" - integrity sha512-i1QvMb3cIXdsx7OQh0/N0KJHkPwFlBGEGsXRr/IF2DJFHMWd/J4DR8IaAnTAhx0ifborWHmENgXj5hgWJgirog== - dependencies: - "@babel/runtime" "^7.1.2" - "@expo/metro-config" "^0.1.70" - "@expo/vector-icons" "^12.0.4" - "@unimodules/core" "~7.1.2" - "@unimodules/react-native-adapter" "~6.3.7" - babel-preset-expo "~8.4.1" - cross-spawn "^6.0.5" - expo-application "~3.2.0" - expo-asset "~8.3.3" - expo-constants "~11.0.2" - expo-error-recovery "~2.2.0" - expo-file-system "~11.1.3" - expo-font "~9.2.1" - expo-keep-awake "~9.2.0" - fbemitter "^2.1.1" - invariant "^2.2.2" - md5-file "^3.2.3" - pretty-format "^26.4.0" - react-native-safe-area-context "3.2.0" - serialize-error "^2.1.0" - uuid "^3.4.0" - -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.npm.taobao.org/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= - dependencies: - kind-of "^1.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.npm.taobao.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.npm.taobao.org/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.npm.taobao.org/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha1-28GRVPVYaQFQojlToK29A1vkX8c= - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - -fast-glob@^3.2.5: - version "3.2.7" - resolved "https://registry.npm.taobao.org/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.npm.taobao.org/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha1-/IT7OdJwnPP/bXQ3BhV7tXCKioU= - dependencies: - bser "2.1.1" - -fbemitter@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/fbemitter/-/fbemitter-2.1.1.tgz#523e14fdaf5248805bb02f62efc33be703f51865" - integrity sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU= - dependencies: - fbjs "^0.8.4" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha1-IWVRE2rgL+JVkyw+yHdfGOLAeLg= - -fbjs-scripts@^1.1.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" - integrity sha1-BpoMBjQkLRADHGRg7x/M782uiyc= - dependencies: - "@babel/core" "^7.0.0" - ansi-colors "^1.0.1" - babel-preset-fbjs "^3.2.0" - core-js "^2.4.1" - cross-spawn "^5.1.0" - fancy-log "^1.3.2" - object-assign "^4.0.1" - plugin-error "^0.1.2" - semver "^5.1.0" - through2 "^2.0.0" - -fbjs@^0.8.4: - version "0.8.17" - resolved "https://registry.npm.taobao.org/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - -fbjs@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" - integrity sha1-UsIV4Ig6PIavKnp3btUVJa6OClo= - dependencies: - core-js "^2.4.1" - fbjs-css-vars "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npm.taobao.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-babel-config@^1.1.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" - integrity sha1-qbezF+tbmGDNqdVHQKjIM3oig6I= - dependencies: - json5 "^0.5.1" - path-exists "^3.0.0" - -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@~5.0.0: - version "5.0.0" - resolved "https://registry.npm.taobao.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -fontfaceobserver@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/fontfaceobserver/-/fontfaceobserver-2.1.0.tgz#e2705d293e2c585a6531c2a722905657317a2991" - integrity sha1-4nBdKT4sWFplMcKnIpBWVzF6KZE= - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npm.taobao.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fs-extra@9.0.0: - version "9.0.0" - resolved "https://registry.npm.taobao.org/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.npm.taobao.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.npm.taobao.org/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.npm.taobao.org/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npm.taobao.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.npm.taobao.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= - -get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.npm.taobao.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.npm.taobao.org/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getenv@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" - integrity sha1-h08udUT7ylPHpHOPN96GBcP8/DE= - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.npm.taobao.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npm.taobao.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.2, glob@^7.1.3: - version "7.2.0" - resolved "https://registry.npm.taobao.org/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npm.taobao.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.8" - resolved "https://registry.npm.taobao.org/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.npm.taobao.org/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= - dependencies: - function-bind "^1.1.1" - -hermes-engine@~0.5.0: - version "0.5.1" - resolved "https://registry.npm.taobao.org/hermes-engine/-/hermes-engine-0.5.1.tgz#601115e4b1e0a17d9aa91243b96277de4e926e09" - integrity sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg== - -hermes-profile-transformer@^0.0.6: - version "0.0.6" - resolved "https://registry.npm.taobao.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" - integrity sha1-vQ9ezO2oDdDdquRDRpqyb7OPwns= - dependencies: - source-map "^0.7.3" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.npm.taobao.org/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.npm.taobao.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha1-aRh5r44iCupXUOiCfbTvYqVONh0= - -iconv-lite@^0.4.17: - version "0.4.24" - resolved "https://registry.npm.taobao.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.npm.taobao.org/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -image-size@^0.6.0: - version "0.6.3" - resolved "https://registry.npm.taobao.org/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" - integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npm.taobao.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npm.taobao.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-prefixer@^5.1.0: - version "5.1.2" - resolved "https://registry.npm.taobao.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz#e5a5a3515e25600e016b71e39138971228486c33" - integrity sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA== - dependencies: - css-in-js-utils "^2.0.0" - -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.npm.taobao.org/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -invariant@2.2.4, invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npm.taobao.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= - dependencies: - loose-envify "^1.0.0" - -ip@^1.1.5: - version "1.1.5" - resolved "https://registry.npm.taobao.org/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.npm.taobao.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.npm.taobao.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha1-76ouqdqg16suoTqXsritUf776L4= - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw= - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.2.0: - version "2.7.0" - resolved "https://registry.npm.taobao.org/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" - integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.npm.taobao.org/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.npm.taobao.org/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1: - version "4.0.3" - resolved "https://registry.npm.taobao.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npm.taobao.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npm.taobao.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.npm.taobao.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jetifier@^1.6.2: - version "1.6.8" - resolved "https://registry.npm.taobao.org/jetifier/-/jetifier-1.6.8.tgz#e88068697875cbda98c32472902c4d3756247798" - integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npm.taobao.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsc-android@^245459.0.0: - version "245459.0.0" - resolved "https://registry.npm.taobao.org/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" - integrity sha1-5YQljdCwTJFZon+xBM1dSR/SAsk= - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npm.taobao.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npm.taobao.org/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.npm.taobao.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.npm.taobao.org/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.npm.taobao.org/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npm.taobao.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.npm.taobao.org/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.npm.taobao.org/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npm.taobao.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.npm.taobao.org/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I= - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.npm.taobao.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npm.taobao.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npm.taobao.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npm.taobao.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.frompairs@^4.0.1: - version "4.0.1" - resolved "https://registry.npm.taobao.org/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz#bc4e5207fa2757c136e573614e9664506b2b1bd2" - integrity sha1-vE5SB/onV8E25XNhTpZkUGsrG9I= - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.npm.taobao.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.npm.taobao.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - -lodash.omit@^4.5.0: - version "4.5.0" - resolved "https://registry.npm.taobao.org/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= - -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.npm.taobao.org/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.npm.taobao.org/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.npm.taobao.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha1-5IExDwSdPPbUfpEq0JMTsVTw+zM= - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.throttle@^4.1.1: - version "4.1.1" - resolved "https://registry.npm.taobao.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= - -lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.3.0: - version "4.17.21" - resolved "https://registry.npm.taobao.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -logkitty@^0.7.1: - version "0.7.1" - resolved "https://registry.npm.taobao.org/logkitty/-/logkitty-0.7.1.tgz#8e8d62f4085a826e8d38987722570234e33c6aa7" - integrity sha1-jo1i9Ahagm6NOJh3IlcCNOM8aqc= - dependencies: - ansi-fragments "^0.2.1" - dayjs "^1.8.15" - yargs "^15.1.0" - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.npm.taobao.org/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npm.taobao.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU= - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.npm.taobao.org/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.npm.taobao.org/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5-file@^3.2.3: - version "3.2.3" - resolved "https://registry.npm.taobao.org/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" - integrity sha1-+bzrlB7KIhSkwHJ/XnADFOdw8G8= - dependencies: - buffer-alloc "^1.1.0" - -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.npm.taobao.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4= - -metro-babel-register@0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-babel-register/-/metro-babel-register-0.59.0.tgz#2bcff65641b36794cf083ba732fbc46cf870fb43" - integrity sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/register" "^7.0.0" - escape-string-regexp "^1.0.5" - -metro-babel-transformer@0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz#dda99c75d831b00142c42c020c51c103b29f199d" - integrity sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w== - dependencies: - "@babel/core" "^7.0.0" - metro-source-map "0.59.0" - -metro-cache@0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-cache/-/metro-cache-0.59.0.tgz#ef3c055f276933979b731455dc8317d7a66f0f2d" - integrity sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA== - dependencies: - jest-serializer "^24.9.0" - metro-core "0.59.0" - mkdirp "^0.5.1" - rimraf "^2.5.4" - -metro-config@0.59.0, metro-config@^0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-config/-/metro-config-0.59.0.tgz#9844e388069321dd7403e49f0d495a81f9aa0fef" - integrity sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA== - dependencies: - cosmiconfig "^5.0.5" - jest-validate "^24.9.0" - metro "0.59.0" - metro-cache "0.59.0" - metro-core "0.59.0" - -metro-core@0.59.0, metro-core@^0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-core/-/metro-core-0.59.0.tgz#958cde3fe5c8cd84a78e1899af801ad69e9c83b1" - integrity sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ== - dependencies: - jest-haste-map "^24.9.0" - lodash.throttle "^4.1.1" - metro-resolver "0.59.0" - wordwrap "^1.0.0" - -metro-inspector-proxy@0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz#39d1390772d13767fc595be9a1a7074e2425cf8e" - integrity sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ== - dependencies: - connect "^3.6.5" - debug "^2.2.0" - ws "^1.1.5" - yargs "^14.2.0" - -metro-minify-uglify@0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz#6491876308d878742f7b894d7fca4af356886dd5" - integrity sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw== - dependencies: - uglify-es "^3.1.9" - -metro-react-native-babel-preset@0.59.0, metro-react-native-babel-preset@~0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz#20e020bc6ac9849e1477de1333d303ed42aba225" - integrity sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-assign" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - react-refresh "^0.4.0" - -metro-react-native-babel-transformer@0.59.0, metro-react-native-babel-transformer@^0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz#9b3dfd6ad35c6ef37fc4ce4d20a2eb67fabbb4be" - integrity sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ== - dependencies: - "@babel/core" "^7.0.0" - babel-preset-fbjs "^3.3.0" - metro-babel-transformer "0.59.0" - metro-react-native-babel-preset "0.59.0" - metro-source-map "0.59.0" - -metro-resolver@0.59.0, metro-resolver@^0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-resolver/-/metro-resolver-0.59.0.tgz#fbc9d7c95f094c52807877d0011feffb9e896fad" - integrity sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w== - dependencies: - absolute-path "^0.0.0" - -metro-source-map@0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-source-map/-/metro-source-map-0.59.0.tgz#e9beb9fc51bfb4e060f95820cf1508fc122d23f7" - integrity sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ== - dependencies: - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - invariant "^2.2.4" - metro-symbolicate "0.59.0" - ob1 "0.59.0" - source-map "^0.5.6" - vlq "^1.0.0" - -metro-symbolicate@0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz#fc7f93957a42b02c2bfc57ed1e8f393f5f636a54" - integrity sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw== - dependencies: - invariant "^2.2.4" - metro-source-map "0.59.0" - source-map "^0.5.6" - through2 "^2.0.1" - vlq "^1.0.0" - -metro@0.59.0, metro@^0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/metro/-/metro-0.59.0.tgz#64a87cd61357814a4f279518e0781b1eab5934b8" - integrity sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/parser" "^7.0.0" - "@babel/plugin-external-helpers" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - absolute-path "^0.0.0" - async "^2.4.0" - babel-preset-fbjs "^3.3.0" - buffer-crc32 "^0.2.13" - chalk "^2.4.1" - ci-info "^2.0.0" - concat-stream "^1.6.0" - connect "^3.6.5" - debug "^2.2.0" - denodeify "^1.2.1" - error-stack-parser "^2.0.6" - eventemitter3 "^3.0.0" - fbjs "^1.0.0" - fs-extra "^1.0.0" - graceful-fs "^4.1.3" - image-size "^0.6.0" - invariant "^2.2.4" - jest-haste-map "^24.9.0" - jest-worker "^24.9.0" - json-stable-stringify "^1.0.1" - lodash.throttle "^4.1.1" - merge-stream "^1.0.1" - metro-babel-register "0.59.0" - metro-babel-transformer "0.59.0" - metro-cache "0.59.0" - metro-config "0.59.0" - metro-core "0.59.0" - metro-inspector-proxy "0.59.0" - metro-minify-uglify "0.59.0" - metro-react-native-babel-preset "0.59.0" - metro-resolver "0.59.0" - metro-source-map "0.59.0" - metro-symbolicate "0.59.0" - mime-types "2.1.11" - mkdirp "^0.5.1" - node-fetch "^2.2.0" - nullthrows "^1.1.1" - resolve "^1.5.0" - rimraf "^2.5.4" - serialize-error "^2.1.0" - source-map "^0.5.6" - strip-ansi "^4.0.0" - temp "0.8.3" - throat "^4.1.0" - wordwrap "^1.0.0" - ws "^1.1.5" - xpipe "^1.0.5" - yargs "^14.2.0" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.npm.taobao.org/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.npm.taobao.org/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": - version "1.50.0" - resolved "https://registry.npm.taobao.org/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" - integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== - -mime-db@~1.23.0: - version "1.23.0" - resolved "https://registry.npm.taobao.org/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" - integrity sha1-oxtAcK2uon1zLqMzdApk0OyaZlk= - -mime-types@2.1.11: - version "2.1.11" - resolved "https://registry.npm.taobao.org/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" - integrity sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw= - dependencies: - mime-db "~1.23.0" - -mime-types@~2.1.24: - version "2.1.33" - resolved "https://registry.npm.taobao.org/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" - integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== - dependencies: - mime-db "1.50.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npm.taobao.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.1: - version "2.5.2" - resolved "https://registry.npm.taobao.org/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" - integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npm.taobao.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.npm.taobao.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.npm.taobao.org/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.npm.taobao.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npm.taobao.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.npm.taobao.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.npm.taobao.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI= - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nan@^2.12.1: - version "2.15.0" - resolved "https://registry.npm.taobao.org/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.npm.taobao.org/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - 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.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.npm.taobao.org/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.npm.taobao.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -nocache@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" - integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.npm.taobao.org/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fetch@^2.2.0, node-fetch@^2.6.0: - version "2.6.5" - resolved "https://registry.npm.taobao.org/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npm.taobao.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-releases@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/node-releases/-/node-releases-2.0.0.tgz#67dc74903100a7deb044037b8a2e5f453bb05400" - integrity sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA== - -node-stream-zip@^1.9.1: - version "1.15.0" - resolved "https://registry.npm.taobao.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" - integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== - -normalize-css-color@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz#02991e97cccec6623fe573afbbf0de6a1f3e9f8d" - integrity sha1-Apkel8zOxmI/5XOvu/Deah8+n40= - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.npm.taobao.org/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -nullthrows@^1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" - integrity sha1-eBgliEOFaulx6uQgitfX6xmkMbE= - -ob1@0.59.0: - version "0.59.0" - resolved "https://registry.npm.taobao.org/ob1/-/ob1-0.59.0.tgz#ee103619ef5cb697f2866e3577da6f0ecd565a36" - integrity sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npm.taobao.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.2" - resolved "https://registry.npm.taobao.org/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA= - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npm.taobao.org/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -open@^6.2.0: - version "6.4.0" - resolved "https://registry.npm.taobao.org/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" - integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== - dependencies: - is-wsl "^1.1.0" - -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.npm.taobao.org/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= - -ora@^3.4.0: - version "3.4.0" - resolved "https://registry.npm.taobao.org/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== - dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npm.taobao.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npm.taobao.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npm.taobao.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs= - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npm.taobao.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha1-2YRUqcN1PVeQhg8W9ohnueRr4f0= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.npm.taobao.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.npm.taobao.org/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npm.taobao.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.0, pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.npm.taobao.org/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha1-ZDqSyviUVm+RsrmG0sZpUKji+4c= - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= - dependencies: - find-up "^2.1.0" - -plist@^3.0.1: - version "3.0.4" - resolved "https://registry.npm.taobao.org/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe" - integrity sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg== - dependencies: - base64-js "^1.5.1" - xmlbuilder "^9.0.7" - -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.npm.taobao.org/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= - dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.npm.taobao.org/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^25.1.0, pretty-format@^25.2.0: - version "25.5.0" - resolved "https://registry.npm.taobao.org/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - -pretty-format@^26.4.0: - version "26.6.2" - resolved "https://registry.npm.taobao.org/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.npm.taobao.org/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078= - dependencies: - asap "~2.0.3" - -promise@^8.0.3: - version "8.1.0" - resolved "https://registry.npm.taobao.org/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" - integrity sha1-aXwlw9/nQ13Xn81Yw4oTWIjq8F4= - dependencies: - asap "~2.0.6" - -prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.npm.taobao.org/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha1-UsQedbjIfnK52TYOAga5ncv/psU= - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npm.taobao.org/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y= - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npm.taobao.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npm.taobao.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= - -react-devtools-core@^4.6.0: - version "4.19.2" - resolved "https://registry.npm.taobao.org/react-devtools-core/-/react-devtools-core-4.19.2.tgz#57f5d19b67e8658323474ab51c6c1292bf8243c9" - integrity sha512-Z9K+h9gjEwimZtZB1NsWm5hQsxAcElW0GI2KXLQDpk2o1YIZQ+lOSesUr0npUyLeb37k2hTtyxp8wumeRJpG5Q== - dependencies: - shell-quote "^1.6.1" - ws "^7" - -react-dom@16.13.1: - version "16.13.1" - resolved "https://registry.npm.taobao.org/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" - integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" - -react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: - version "16.13.1" - resolved "https://registry.npm.taobao.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.npm.taobao.org/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-native-safe-area-context@3.2.0: - version "3.2.0" - resolved "https://registry.npm.taobao.org/react-native-safe-area-context/-/react-native-safe-area-context-3.2.0.tgz#06113c6b208f982d68ab5c3cebd199ca93db6941" - integrity sha512-k2Nty4PwSnrg9HwrYeeE+EYqViYJoOFwEy9LxL5RIRfoqxAq/uQXNGwpUg2/u4gnKpBbEPa9eRh15KKMe/VHkA== - -react-native-web@~0.13.12: - version "0.13.18" - resolved "https://registry.npm.taobao.org/react-native-web/-/react-native-web-0.13.18.tgz#964f058a16521a3b9a31b091415edfef5b6ef305" - integrity sha512-WR/0ECAmwLQ2+2cL2Ur+0/swXFAtcSM0URoADJmG6D4MnY+wGc91JO8LoOTlgY0USBOY+qG/beRrjFa+RAuOiA== - dependencies: - array-find-index "^1.0.2" - create-react-class "^15.6.2" - deep-assign "^3.0.0" - fbjs "^1.0.0" - hyphenate-style-name "^1.0.3" - inline-style-prefixer "^5.1.0" - normalize-css-color "^1.0.2" - prop-types "^15.6.0" - react-timer-mixin "^0.13.4" - -react-native-webview@11.6.2: - version "11.6.2" - resolved "https://registry.npm.taobao.org/react-native-webview/-/react-native-webview-11.6.2.tgz#e19b3325d6777caee29d04eb2edf9b70f0b29915" - integrity sha512-7e5ltLBgqt1mX0gdTTS2nFPIjfS6y300wqJ4rLWqU71lDO+8ZeayfsF5qo83qxo2Go74CtLnSeWae4pdGwUqYw== - dependencies: - escape-string-regexp "2.0.0" - invariant "2.2.4" - -"react-native@https://github.com/expo/react-native/archive/sdk-42.0.0.tar.gz": - version "0.63.2" - resolved "https://github.com/expo/react-native/archive/sdk-42.0.0.tar.gz#1dae4e81714085100888571012f18b6b142b4773" - dependencies: - "@babel/runtime" "^7.0.0" - "@react-native-community/cli" "^4.14.0" - "@react-native-community/cli-platform-android" "^4.13.0" - "@react-native-community/cli-platform-ios" "^4.13.0" - abort-controller "^3.0.0" - anser "^1.4.9" - base64-js "^1.1.2" - event-target-shim "^5.0.1" - fbjs "^1.0.0" - fbjs-scripts "^1.1.0" - hermes-engine "~0.5.0" - invariant "^2.2.4" - jsc-android "^245459.0.0" - metro-babel-register "0.59.0" - metro-react-native-babel-transformer "0.59.0" - metro-source-map "0.59.0" - nullthrows "^1.1.1" - pretty-format "^24.9.0" - promise "^8.0.3" - prop-types "^15.7.2" - react-devtools-core "^4.6.0" - react-refresh "^0.4.0" - regenerator-runtime "^0.13.2" - scheduler "0.19.1" - stacktrace-parser "^0.1.3" - use-subscription "^1.0.0" - whatwg-fetch "^3.0.0" - -react-refresh@^0.4.0: - version "0.4.3" - resolved "https://registry.npm.taobao.org/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" - integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== - -react-timer-mixin@^0.13.4: - version "0.13.4" - resolved "https://registry.npm.taobao.org/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3" - integrity sha1-daAMPJTBOr4ptD1jtMZaiPyCZNM= - -react@16.13.1: - version "16.13.1" - resolved "https://registry.npm.taobao.org/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.npm.taobao.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.npm.taobao.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npm.taobao.org/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo= - -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.npm.taobao.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.npm.taobao.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.npm.taobao.org/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.npm.taobao.org/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.npm.taobao.org/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.npm.taobao.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.npm.taobao.org/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.npm.taobao.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npm.taobao.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -reselect@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" - integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npm.taobao.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha1-w1IlhD3493bfIcV1V7wIfp39/Gk= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.14.2, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0: - version "1.20.0" - resolved "https://registry.npm.taobao.org/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npm.taobao.org/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npm.taobao.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY= - -rimraf@^2.5.4: - version "2.7.1" - resolved "https://registry.npm.taobao.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.npm.taobao.org/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.npm.taobao.org/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha1-yPFVMR0Wf2jyHhaN9x7FsIMRNzQ= - -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.npm.taobao.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npm.taobao.org/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4= - dependencies: - queue-microtask "^1.2.2" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.npm.taobao.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.npm.taobao.org/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npm.taobao.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npm.taobao.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.npm.taobao.org/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sax@>=0.6.0, sax@^1.2.1: - version "1.2.4" - resolved "https://registry.npm.taobao.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= - -scheduler@0.19.1, scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.npm.taobao.org/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.npm.taobao.org/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@7.3.2: - version "7.3.2" - resolved "https://registry.npm.taobao.org/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npm.taobao.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npm.taobao.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.5: - version "7.3.5" - resolved "https://registry.npm.taobao.org/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -send@0.17.1: - version "0.17.1" - resolved "https://registry.npm.taobao.org/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= - -serve-static@^1.13.1: - version "1.14.1" - resolved "https://registry.npm.taobao.org/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk= - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npm.taobao.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npm.taobao.org/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha1-jymBrZJTH1UDWwH7IwdppA4C76M= - dependencies: - kind-of "^6.0.2" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shell-quote@1.6.1: - version "1.6.1" - resolved "https://registry.npm.taobao.org/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -shell-quote@^1.6.1: - version "1.7.2" - resolved "https://registry.npm.taobao.org/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha1-Z6fQLHbJ2iT5nSCAj8re0ODgS+I= - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.5" - resolved "https://registry.npm.taobao.org/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" - integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== - -simple-plist@^1.0.0, simple-plist@^1.1.0: - version "1.1.1" - resolved "https://registry.npm.taobao.org/simple-plist/-/simple-plist-1.1.1.tgz#54367ca28bc5996a982c325c1c4a4c1a05f4047c" - integrity sha1-VDZ8oovFmWqYLDJcHEpMGgX0BHw= - dependencies: - bplist-creator "0.0.8" - bplist-parser "0.2.0" - plist "^3.0.1" - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slugify@^1.3.4: - version "1.6.1" - resolved "https://registry.npm.taobao.org/slugify/-/slugify-1.6.1.tgz#a5fcaef29f4e57c6e932ce7044b6ffd9cf81b641" - integrity sha512-5ofqMTbetNhxlzjYYLBaZFQd6oiTuSkQlyfPEFIMwgUABlZQ0hbk5xIV9Ydd5jghWeRoO7GkiJliUvTpLOjNRA== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.npm.taobao.org/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.npm.taobao.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho= - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.16: - version "0.5.20" - resolved "https://registry.npm.taobao.org/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.npm.taobao.org/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.npm.taobao.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npm.taobao.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.npm.taobao.org/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.npm.taobao.org/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npm.taobao.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -stack-utils@^1.0.1: - version "1.0.5" - resolved "https://registry.npm.taobao.org/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" - integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== - dependencies: - escape-string-regexp "^2.0.0" - -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.npm.taobao.org/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== - -stacktrace-parser@^0.1.3: - version "0.1.10" - resolved "https://registry.npm.taobao.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha1-KfsMrk4NC4UVWHlAKFehY562BRo= - dependencies: - type-fest "^0.7.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.npm.taobao.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.npm.taobao.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-buffers@~2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" - integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= - -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.npm.taobao.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npm.taobao.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.npm.taobao.org/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npm.taobao.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -sucrase@^3.20.0: - version "3.20.2" - resolved "https://registry.npm.taobao.org/sucrase/-/sucrase-3.20.2.tgz#28a28dc58a55be0d6916d5c9b2440d203e9ffe62" - integrity sha512-EdJ5M6VEvToIZwIWiZ71cxe4CklDRG8PdSjUSst+BZCUGlaEhnrdQo/LOXsuq3MjWRbfepg1XTffClK0Tmo0HQ== - dependencies: - commander "^4.0.0" - glob "7.1.6" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -sudo-prompt@^9.0.0: - version "9.2.1" - resolved "https://registry.npm.taobao.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" - integrity sha1-d++4QwnJykiVJ6TnSfKH5r3VKv0= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npm.taobao.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.npm.taobao.org/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npm.taobao.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -temp@0.8.3: - version "0.8.3" - resolved "https://registry.npm.taobao.org/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npm.taobao.org/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npm.taobao.org/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8= - dependencies: - any-promise "^1.0.0" - -throat@^4.1.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -through2@^2.0.0, through2@^2.0.1: - version "2.0.5" - resolved "https://registry.npm.taobao.org/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0= - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.npm.taobao.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npm.taobao.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.5" - resolved "https://registry.npm.taobao.org/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.npm.taobao.org/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.npm.taobao.org/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npm.taobao.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npm.taobao.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.npm.taobao.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.npm.taobao.org/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.npm.taobao.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@~4.0.0: - version "4.0.8" - resolved "https://registry.npm.taobao.org/typescript/-/typescript-4.0.8.tgz#5739105541db80a971fdbd0d56511d1a6f17d37f" - integrity sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg== - -ua-parser-js@^0.7.18: - version "0.7.28" - resolved "https://registry.npm.taobao.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" - integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== - -uglify-es@^3.1.9: - version "3.3.9" - resolved "https://registry.npm.taobao.org/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha1-DBxPBwC+2NvBJM2zBNJZLKID5nc= - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.npm.taobao.org/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npm.taobao.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse@^1.4.4: - version "1.5.3" - resolved "https://registry.npm.taobao.org/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -use-subscription@^1.0.0: - version "1.5.1" - resolved "https://registry.npm.taobao.org/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" - integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== - dependencies: - object-assign "^4.1.1" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.npm.taobao.org/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.2, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.npm.taobao.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= - -uuid@^7.0.3: - version "7.0.3" - resolved "https://registry.npm.taobao.org/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha1-xcnyyM8l3Ao3LE3xRBxB9b0MaAs= - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vlq@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" - integrity sha1-wAP258C0we3WI/1u5Qu8DWod5Gg= - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.npm.taobao.org/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npm.taobao.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: - version "3.6.2" - resolved "https://registry.npm.taobao.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha1-3O0k838mJO0CgXJdUdDi4/5nf4w= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npm.taobao.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.npm.taobao.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npm.taobao.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^2.3.0: - version "2.4.3" - resolved "https://registry.npm.taobao.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -ws@^1.1.0, ws@^1.1.5: - version "1.1.5" - resolved "https://registry.npm.taobao.org/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" - integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -ws@^7: - version "7.5.5" - resolved "https://registry.npm.taobao.org/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== - -xcode@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" - integrity sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ== - dependencies: - simple-plist "^1.0.0" - uuid "^3.3.2" - -xcode@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" - integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== - dependencies: - simple-plist "^1.1.0" - uuid "^7.0.3" - -xml2js@^0.4.23: - version "0.4.23" - resolved "https://registry.npm.taobao.org/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha1-oMaVFnUkIesqx1juTUzPWIQ+rGY= - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@^14.0.0: - version "14.0.0" - resolved "https://registry.npm.taobao.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c" - integrity sha1-h2ta7E8F/9X+uXsKhxyFXRb764w= - -xmlbuilder@^9.0.7: - version "9.0.7" - resolved "https://registry.npm.taobao.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.npm.taobao.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha1-vpuuHIoEbnazESdyY0fQrXACvrM= - -xmldoc@^1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/xmldoc/-/xmldoc-1.1.2.tgz#6666e029fe25470d599cd30e23ff0d1ed50466d7" - integrity sha1-ZmbgKf4lRw1ZnNMOI/8NHtUEZtc= - dependencies: - sax "^1.2.1" - -xmldom@~0.5.0: - version "0.5.0" - resolved "https://registry.npm.taobao.org/xmldom/-/xmldom-0.5.0.tgz#193cb96b84aa3486127ea6272c4596354cb4962e" - integrity sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA== - -xpipe@^1.0.5: - version "1.0.5" - resolved "https://registry.npm.taobao.org/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" - integrity sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98= - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npm.taobao.org/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.npm.taobao.org/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.npm.taobao.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= - -yargs-parser@^15.0.1: - version "15.0.3" - resolved "https://registry.npm.taobao.org/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" - integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.npm.taobao.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^14.2.0: - version "14.2.3" - resolved "https://registry.npm.taobao.org/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" - integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== - dependencies: - cliui "^5.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^15.0.1" - -yargs@^15.1.0: - version "15.4.1" - resolved "https://registry.npm.taobao.org/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/apps/README.md b/apps/README.md new file mode 100644 index 00000000000..91a781370b3 --- /dev/null +++ b/apps/README.md @@ -0,0 +1 @@ +用于存放非Tailchat核心功能的应用 diff --git a/apps/cli/.gitignore b/apps/cli/.gitignore new file mode 100644 index 00000000000..2b10736c68e --- /dev/null +++ b/apps/cli/.gitignore @@ -0,0 +1,106 @@ +lib + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port diff --git a/desktop-old/.npmrc b/apps/cli/.npmrc similarity index 100% rename from desktop-old/.npmrc rename to apps/cli/.npmrc diff --git a/apps/cli/LICENSE b/apps/cli/LICENSE new file mode 100644 index 00000000000..04d75adde10 --- /dev/null +++ b/apps/cli/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 MsgByte + +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. diff --git a/apps/cli/README.md b/apps/cli/README.md new file mode 100644 index 00000000000..0fb13e4b9ac --- /dev/null +++ b/apps/cli/README.md @@ -0,0 +1,16 @@ +# tailchat-cli +A Command line interface of tailchat + +```bash +tailchat + +Commands: + tailchat create [template] 创建 Tailchat 项目代码 + tailchat connect 连接到 Tailchat 节点网络 + tailchat bench 压力测试 + tailchat declaration Tailchat 插件类型声明 + +Options: + --version Show version number [boolean] + -h, --help Show help [boolean] +``` diff --git a/apps/cli/bin/cli b/apps/cli/bin/cli new file mode 100755 index 00000000000..1987c553948 --- /dev/null +++ b/apps/cli/bin/cli @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('../lib') diff --git a/apps/cli/package.json b/apps/cli/package.json new file mode 100644 index 00000000000..7153a57af78 --- /dev/null +++ b/apps/cli/package.json @@ -0,0 +1,87 @@ +{ + "name": "tailchat-cli", + "version": "1.5.14", + "description": "A Command line interface of tailchat", + "bin": { + "tailchat": "./bin/cli" + }, + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "files": [ + "lib", + "bin", + "templates" + ], + "scripts": { + "dev": "cross-env NODE_ENV=development ts-node ./src/index.ts", + "build": "rimraf -rf lib && tsc", + "prepare": "npm run build", + "release": "npm publish --registry https://registry.npmjs.com/", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/msgbyte/tailchat-cli.git" + }, + "keywords": [ + "tailchat" + ], + "author": "moonrailgun", + "license": "MIT", + "bugs": { + "url": "https://github.com/msgbyte/tailchat-cli/issues" + }, + "homepage": "https://github.com/msgbyte/tailchat-cli#readme", + "dependencies": { + "@types/dockerode": "^3.3.10", + "@types/pidusage": "^2.0.2", + "as-table": "^1.0.55", + "chalk": "4.1.2", + "crypto-random-string": "3.3.1", + "dockerode": "^3.3.4", + "dotenv": "^16.0.0", + "filesize": "^8.0.7", + "find-process": "^1.4.7", + "fs-extra": "^10.1.0", + "glob": "^8.1.0", + "got": "11.8.5", + "ink": "^3.2.0", + "ink-tab": "^4.2.0", + "ink-text-input": "^4.0.3", + "inquirer": "^8.2.2", + "lodash": "^4.17.21", + "node-plop": "^0.26.3", + "nodemailer": "^6.7.2", + "ora": "5.4.1", + "p-all": "2.1.0", + "p-map": "^4.0.0", + "p-series": "2.1.0", + "pidusage": "^3.0.2", + "plop": "^3.0.5", + "pretty-ms": "7.0.1", + "react": "18.2.0", + "rimraf": "^3.0.2", + "socket.io-client": "^4.6.2", + "socket.io-msgpack-parser": "^3.0.2", + "spinnies": "^0.5.1", + "tailchat-server-sdk": "^0.0.12", + "update-notifier": "5.1.0", + "yargs": "^17.4.0" + }, + "devDependencies": { + "@types/fs-extra": "^9.0.13", + "@types/glob": "^8.0.0", + "@types/inquirer": "^8.2.1", + "@types/lodash": "^4.14.170", + "@types/node": "^18.13.0", + "@types/nodemailer": "^6.4.4", + "@types/react": "18.0.20", + "@types/spinnies": "^0.5.0", + "@types/update-notifier": "^6.0.1", + "@types/yargs": "^17.0.10", + "cross-env": "^7.0.3", + "tailchat-shared": "workspace:*", + "ts-node": "^10.7.0", + "typescript": "^4.6.3" + } +} diff --git a/apps/cli/src/app/App.tsx b/apps/cli/src/app/App.tsx new file mode 100644 index 00000000000..451c6062d13 --- /dev/null +++ b/apps/cli/src/app/App.tsx @@ -0,0 +1,46 @@ +import React, { useLayoutEffect, useState } from 'react'; +import { Box, Text, useStdout } from 'ink'; +import { Tabs, Tab } from 'ink-tab'; +import TextInput from 'ink-text-input'; +import { useScreenSize } from './hooks/useScreenSize'; + +export const App: React.FC = React.memo(() => { + const [text, setText] = useState(''); + const { height, width } = useScreenSize(); + const { stdout } = useStdout(); + + useLayoutEffect(() => { + stdout?.write('\x1b[?1049h'); + + return () => { + stdout?.write('\x1b[?1049l'); + }; + }, [stdout]); + + return ( + + + + + + + {}}> + {/* Temporary comments due to react version issues */} + {/* + Foo + + + Bar + */} + + + + ); +}); +App.displayName = 'App'; diff --git a/apps/cli/src/app/hooks/useScreenSize.ts b/apps/cli/src/app/hooks/useScreenSize.ts new file mode 100644 index 00000000000..bb83e29a39c --- /dev/null +++ b/apps/cli/src/app/hooks/useScreenSize.ts @@ -0,0 +1,25 @@ +import { useCallback, useEffect, useState } from 'react'; +import { useStdout } from 'ink'; + +export function useScreenSize() { + const { stdout } = useStdout(); + const getSize = useCallback( + () => ({ + height: stdout?.rows ?? 0, + width: stdout?.columns ?? 0, + }), + [stdout] + ); + const [size, setSize] = useState(getSize); + + useEffect(() => { + const onResize = () => setSize(getSize()); + stdout?.on('resize', onResize); + + return () => { + stdout?.off('resize', onResize); + }; + }, [stdout, getSize]); + + return size; +} diff --git a/apps/cli/src/app/index.tsx b/apps/cli/src/app/index.tsx new file mode 100644 index 00000000000..d06ed2c49b5 --- /dev/null +++ b/apps/cli/src/app/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { App } from './App'; +import { render } from 'ink'; + +export function run() { + const ins = render(); + + return ins; +} diff --git a/apps/cli/src/commands/app.ts b/apps/cli/src/commands/app.ts new file mode 100644 index 00000000000..9616ab5f032 --- /dev/null +++ b/apps/cli/src/commands/app.ts @@ -0,0 +1,12 @@ +import { CommandModule } from 'yargs'; +import { run } from '../app'; +import { isDev } from '../utils'; + +export const appCommand: CommandModule = { + command: 'app', + describe: isDev() ? false : 'Tailchat cli(WIP)', + builder: undefined, + async handler() { + await run(); + }, +}; diff --git a/apps/cli/src/commands/benchmark/connections.ts b/apps/cli/src/commands/benchmark/connections.ts new file mode 100644 index 00000000000..785bfc3cda4 --- /dev/null +++ b/apps/cli/src/commands/benchmark/connections.ts @@ -0,0 +1,173 @@ +import { CommandModule } from 'yargs'; +import { io, Socket } from 'socket.io-client'; +import msgpackParser from 'socket.io-msgpack-parser'; +import fs from 'fs-extra'; +import ora from 'ora'; +import randomString from 'crypto-random-string'; +import pMap from 'p-map'; + +const CLIENT_CREATION_INTERVAL_IN_MS = 5; + +export const benchmarkConnectionsCommand: CommandModule = { + command: 'connections ', + describe: 'Test Tailchat Connections', + builder: (yargs) => + yargs + .demandOption('url', 'Backend Url') + .option('file', { + describe: 'Account Token Path', + demandOption: true, + type: 'string', + default: './accounts', + }) + .option('concurrency', { + describe: 'Concurrency when create connection', + type: 'number', + default: 1, + }) + .option('groupId', { + describe: 'Group Id which send Message', + type: 'string', + }) + .option('converseId', { + describe: 'Converse Id which send Message', + type: 'string', + }) + .option('messageNum', { + describe: 'Times which send Message', + type: 'number', + default: 1, + }), + async handler(args) { + const url = args.url as string; + const file = args.file as string; + const groupId = args.groupId as string; + const converseId = args.converseId as string; + const messageNum = args.messageNum as number; + const concurrency = args.concurrency as number; + + console.log('Reading account tokens from', file); + const account = await fs.readFile(file as string, { + encoding: 'utf8', + }); + const sockets = await createClients( + url as string, + account.split('\n').map((s) => s.trim()), + concurrency + ); + + if (groupId && converseId) { + // send message test + for (let i = 0; i < messageNum; i++) { + console.log('Start send message test:', i + 1); + await sendMessage(sockets, groupId, converseId); + } + } + }, +}; + +async function createClients( + url: string, + accountTokens: string[], + concurrency: number +): Promise { + const maxCount = accountTokens.length; + const spinner = ora().info(`Create Client Connection to ${url}`).start(); + + let i = 0; + const sockets: Socket[] = []; + await pMap( + accountTokens, + async (token) => { + await sleep(CLIENT_CREATION_INTERVAL_IN_MS); + const socket = await createClient(url, token); + spinner.text = `Progress: ${++i}/${maxCount}`; + sockets.push(socket); + }, + { + concurrency, + } + ); + + spinner.succeed(`${maxCount} clients has been create.`); + + return sockets; +} + +function createClient(url: string, token: string): Promise { + return new Promise((resolve, reject) => { + const socket = io(url, { + transports: ['websocket'], + auth: { + token, + }, + forceNew: true, + parser: msgpackParser, + }); + socket.once('connect', () => { + // 连接成功 + resolve(socket); + }); + socket.once('error', () => { + reject(); + }); + + socket.on('disconnect', (reason) => { + console.log(`disconnect due to ${reason}`); + }); + }).then(async (socket) => { + await socket.emitWithAck('chat.converse.findAndJoinRoom', {}); + + return socket; + }); +} + +async function sendMessage( + sockets: Socket[], + groupId: string, + converseId: string +) { + return new Promise((resolve) => { + const randomMessage = randomString({ length: 16 }); + const spinner = ora() + .info(`Start message receive test, message: ${randomMessage}`) + .start(); + const start = Date.now(); + let receiveCount = 0; + const len = sockets.length; + + function receivedCallback() { + receiveCount += 1; + spinner.text = `Receive: ${receiveCount}/${len}`; + + if (receiveCount === len) { + spinner.succeed(`All client received, usage: ${Date.now() - start}ms`); + resolve(); + } + } + + sockets.forEach((socket) => { + socket.on('notify:chat.message.add', (message) => { + const content = message.content; + + if (message.converseId === converseId && randomMessage === content) { + socket.off('notify:chat.message.add'); + + receivedCallback(); + } + }); + }); + + sockets[0].emit('chat.message.sendMessage', { + groupId, + converseId, + content: randomMessage, + }); + }); +} + +function sleep(milliseconds: number): Promise { + return new Promise((resolve) => { + setTimeout(resolve, milliseconds); + }); +} diff --git a/apps/cli/src/commands/benchmark/index.ts b/apps/cli/src/commands/benchmark/index.ts new file mode 100644 index 00000000000..77f0ef95496 --- /dev/null +++ b/apps/cli/src/commands/benchmark/index.ts @@ -0,0 +1,18 @@ +import { CommandModule } from 'yargs'; +import { benchmarkConnectionsCommand } from './connections'; +import { benchmarkMessageCommand } from './message'; +import { benchmarkRegisterCommand } from './register'; + +// https://docs.docker.com/engine/api/v1.41/ + +export const benchmarkCommand: CommandModule = { + command: 'benchmark', + describe: 'Tailchat Benchmark Test', + builder: (yargs) => + yargs + .command(benchmarkMessageCommand) + .command(benchmarkConnectionsCommand) + .command(benchmarkRegisterCommand) + .demandCommand(), + handler(args) {}, +}; diff --git a/apps/cli/src/commands/benchmark/message.ts b/apps/cli/src/commands/benchmark/message.ts new file mode 100644 index 00000000000..ed653879131 --- /dev/null +++ b/apps/cli/src/commands/benchmark/message.ts @@ -0,0 +1,178 @@ +import { CommandModule } from 'yargs'; +import { TcBroker } from 'tailchat-server-sdk'; +import defaultBrokerConfig from 'tailchat-server-sdk/dist/runner/moleculer.config'; +import { config } from 'dotenv'; +import _ from 'lodash'; +import os from 'os'; +import pAll from 'p-all'; +import pSeries from 'p-series'; +import ora from 'ora'; +import prettyMs from 'pretty-ms'; +import filesize from 'filesize'; + +export const benchmarkMessageCommand: CommandModule = { + command: 'message', + describe: + 'Stress testing through Tailchat network requests (suitable for pure business testing)', + builder: (yargs) => + yargs + .option('groupId', { + describe: 'Group ID', + demandOption: true, + type: 'string', + }) + .option('converseId', { + describe: 'Converse ID', + demandOption: true, + type: 'string', + }) + .option('userId', { + describe: 'User ID', + demandOption: true, + type: 'string', + }) + .option('num', { + describe: 'Test Num', + type: 'number', + default: 100, + }) + .option('parallel', { + describe: 'Is Parallel', + type: 'boolean', + default: false, + }) + .option('parallelLimit', { + describe: 'Parallel Limit', + type: 'number', + default: Infinity, + }), + async handler(args) { + config(); // 加载环境变量 + + const broker = new TcBroker({ + ...defaultBrokerConfig, + transporter: process.env.TRANSPORTER, + logger: false, + }); + await broker.start(); + + printSystemInfo(); + + console.log('==============='); + + await startBenchmark({ + parallel: args.parallel as boolean, + parallelLimit: args.parallelLimit as number, + number: args.num as number, + task: async (i) => { + const start = process.hrtime(); + await broker.call( + 'chat.message.sendMessage', + { + converseId: args.converseId, + groupId: args.groupId, + content: `benchmessage ${i + 1}`, + }, + { + meta: { + userId: args.userId, + }, + } + ); + const usage = calcUsage(start); + + return usage; + }, + onCompleted: (res) => { + console.log(`Test Num: \t${res.length}`); + console.log(`Max Usage: \t${prettyMs(Math.max(...res, 0))}`); + console.log(`Min Usage: \t${prettyMs(Math.min(...res, 0))}`); + console.log(`Average time: \t${prettyMs(_.mean(res))}`); + }, + }); + + await broker.stop(); + }, +}; + +/** + * 打印系统信息 + */ +function printSystemInfo() { + console.log(`Host: \t${os.hostname()}`); + console.log(`System: \t${os.type()} - ${os.release()}`); + console.log(`Architecture: \t${os.arch()} - ${os.version()}`); + console.log(`CPU: \t${os.cpus().length}`); + console.log(`Memory: \t${filesize(os.totalmem(), { base: 2 })}`); +} + +function calcUsage(startTime: [number, number]) { + const diff = process.hrtime(startTime); + const usage = (diff[0] + diff[1] / 1e9) * 1000; + + return usage; +} + +interface BenchmarkOptions { + parallel: boolean; // 是否并发 + parallelLimit?: number; // 并发上限, 默认不限制(Infinity) + task: (index: number) => Promise; + number?: number; + onCompleted: (res: T[]) => void; +} +/** + * 开始一次基准测试 + */ +async function startBenchmark(options: BenchmarkOptions) { + const { + parallel, + parallelLimit = Infinity, + task, + number = 100, + onCompleted, + } = options; + + const spinner = ora(); + + spinner.info( + `Test mode: ${ + parallel ? `parallel, parallel limit ${parallelLimit}` : `serial` + }` + ); + spinner.info(`Number of tasks to execute: ${number}`); + spinner.start('Benchmark in progress...'); + try { + const startTime = process.hrtime(); + let res: (T | false)[] = []; + if (parallel) { + res = await pAll( + [ + ...Array.from({ length: number }).map( + (_, i) => () => task(i).catch(() => false as const) + ), + ], + { + concurrency: parallelLimit, + } + ); + } else { + res = await pSeries([ + ...Array.from({ length: number }).map( + (_, i) => () => task(i).catch(() => false as const) + ), + ]); + } + + const allUsage = calcUsage(startTime); + const succeed = res.filter((i): i is T => Boolean(i)); + const failed = res.filter((i) => !Boolean(i)); + spinner.succeed(`Benchmarking is complete, usage: ${prettyMs(allUsage)}`); + console.log(`Success/Failed: ${succeed.length}/${failed.length}`); + console.log(`TPS: ${res.length / (allUsage / 1000)}`); + + onCompleted(succeed); + } catch (err) { + console.error(err); + spinner.fail(`A problem with benchmarking`).stop(); + } +} diff --git a/apps/cli/src/commands/benchmark/register.ts b/apps/cli/src/commands/benchmark/register.ts new file mode 100644 index 00000000000..1f0d4b35b5b --- /dev/null +++ b/apps/cli/src/commands/benchmark/register.ts @@ -0,0 +1,116 @@ +import { CommandModule } from 'yargs'; +import fs from 'fs-extra'; +import got from 'got'; +import ora from 'ora'; +import pMap from 'p-map'; + +export const benchmarkRegisterCommand: CommandModule = { + command: 'register ', + describe: 'Create Tailchat temporary account and output token', + builder: (yargs) => + yargs + .example( + '$0 benchmark register http://127.0.0.1:11000', + 'Register account in local server' + ) + .demandOption('url', 'Backend Url') + .option('file', { + describe: 'Account Token Path', + demandOption: true, + type: 'string', + default: './accounts', + }) + .option('count', { + describe: 'Register Count', + demandOption: true, + type: 'number', + default: 100, + }) + .option('concurrency', { + describe: 'Concurrency when send request', + type: 'number', + default: 1, + }) + .option('invite', { + describe: 'Invite Code', + type: 'string', + }) + .option('append', { + describe: 'Append mode', + type: 'boolean', + }), + async handler(args) { + const url = args.url as string; + const file = args.file as string; + const count = args.count as number; + const concurrency = args.concurrency as number; + const invite = args.invite as string | undefined; + const append = (args.append ?? false) as boolean; + const tokens: string[] = []; + const start = Date.now(); + + const spinner = ora().info(`Register temporary account`).start(); + + let i = 0; + spinner.text = `Progress: ${i}/${count}`; + await pMap( + Array.from({ length: count }), + async () => { + const token = await registerTemporaryAccount(url, `benchUser-${i}`); + if (invite) { + // Apply group invite + await applyGroupInviteCode(url, token, invite); + } + if (append) { + await fs.appendFile(file, `\n${token}`); + } + + spinner.text = `Progress: ${++i}/${count}`; + tokens.push(token); + }, + { + concurrency, + } + ); + + if (!append) { + spinner.info(`Writing tokens into path: ${file}`); + + await fs.writeFile(file, tokens.join('\n')); + } + + spinner.succeed(`Register completed! Usage: ${Date.now() - start}ms`); + }, +}; + +async function registerTemporaryAccount( + url: string, + nickname: string +): Promise { + const res = await got + .post(`${url}/api/user/createTemporaryUser`, { + json: { + nickname, + }, + retry: 5, + }) + .json<{ data: { token: string } }>(); + + return res.data.token; +} + +async function applyGroupInviteCode( + url: string, + token: string, + inviteCode: string +) { + await got.post(`${url}/api/group/invite/applyInvite`, { + json: { + code: inviteCode, + }, + retry: 5, + headers: { + 'X-Token': token, + }, + }); +} diff --git a/apps/cli/src/commands/connect.ts b/apps/cli/src/commands/connect.ts new file mode 100644 index 00000000000..94ac4c9916d --- /dev/null +++ b/apps/cli/src/commands/connect.ts @@ -0,0 +1,20 @@ +import { CommandModule } from 'yargs'; +import { TcBroker } from 'tailchat-server-sdk'; +import defaultBrokerConfig from 'tailchat-server-sdk/dist/runner/moleculer.config'; +import { config } from 'dotenv'; + +export const connectCommand: CommandModule = { + command: 'connect', + describe: 'Connect to Tailchat network', + builder: undefined, + async handler(args) { + config(); + + const broker = new TcBroker({ + ...defaultBrokerConfig, + transporter: process.env.TRANSPORTER, + }); + await broker.start(); + broker.repl(); + }, +}; diff --git a/apps/cli/src/commands/create.ts b/apps/cli/src/commands/create.ts new file mode 100644 index 00000000000..41adfbe997c --- /dev/null +++ b/apps/cli/src/commands/create.ts @@ -0,0 +1,51 @@ +import { CommandModule } from 'yargs'; +import nodePlop from 'node-plop'; +import path from 'path'; +import inquirer from 'inquirer'; + +const plop = nodePlop(path.resolve(__dirname, '../../templates/plopfile.js')); + +export const createCommand: CommandModule = { + command: 'create [template]', + describe: 'Create Tailchat repo code', + builder: (yargs) => + yargs.positional('template', { + demandOption: true, + description: 'Template Name', + type: 'string', + choices: plop.getGeneratorList().map((v) => v.name), + }), + async handler(args) { + let template: string; + + if (!args.template) { + const res = await inquirer.prompt([ + { + type: 'list', + name: 'template', + message: 'Choose Template', + choices: plop.getGeneratorList().map((v) => ({ + name: `${v.name} (${v.description})`, + value: v.name, + })), + }, + ]); + template = String(res.template); + } else { + template = String(args.template); + } + + const basic = plop.getGenerator(template); + + const answers = await basic.runPrompts(); + const results = await basic.runActions(answers); + + console.log('Changes:'); + console.log(results.changes.map((change) => change.path).join('\n')); + + if (results.failures.length > 0) { + console.log('Operation failed:'); + console.log(results.failures); + } + }, +}; diff --git a/apps/cli/src/commands/declaration.ts b/apps/cli/src/commands/declaration.ts new file mode 100644 index 00000000000..eac848a7471 --- /dev/null +++ b/apps/cli/src/commands/declaration.ts @@ -0,0 +1,67 @@ +import inquirer from 'inquirer'; +import { CommandModule } from 'yargs'; +import fs, { mkdirp } from 'fs-extra'; +import path from 'path'; +import ora from 'ora'; +import got from 'got'; + +const onlineDeclarationUrl = + 'https://raw.githubusercontent.com/msgbyte/tailchat/master/client/web/tailchat.d.ts'; +export const declarationCommand: CommandModule = { + command: 'declaration ', + describe: 'Tailchat plugin type declaration', + builder: (yargs) => + yargs.positional('source', { + demandOption: true, + description: 'Declaration Type Source', + type: 'string', + choices: ['empty', 'github'], + }), + async handler(args) { + let source = String(args.source); + + if (!source) { + const res = await inquirer.prompt([ + { + type: 'list', + name: 'source', + message: 'Select type source', + choices: [ + { + name: 'Empty', + value: 'empty', + }, + { + name: 'Download the full statement from Github', + value: 'github', + }, + ], + }, + ]); + source = String(res.source); + } + + let content = ''; + if (source === 'empty') { + content = + "declare module '@capital/common';\ndeclare module '@capital/component';\n"; + } else if (source === 'github') { + const url = onlineDeclarationUrl; + + const spinner = ora( + `Downloading plugin type declarations from Github: ${url}` + ).start(); + + content = await got.get(url).then((res) => res.body); + + spinner.succeed('The declaration file has been downloaded'); + } + + if (content !== '') { + const target = path.resolve(process.cwd(), './types/tailchat.d.ts'); + await mkdirp(path.dirname(target)); + await fs.writeFile(target, content); + console.log('Writing type file complete:', target); + } + }, +}; diff --git a/apps/cli/src/commands/docker/doctor.ts b/apps/cli/src/commands/docker/doctor.ts new file mode 100644 index 00000000000..6c2f4fd6d80 --- /dev/null +++ b/apps/cli/src/commands/docker/doctor.ts @@ -0,0 +1,32 @@ +import { CommandModule } from 'yargs'; +import Docker from 'dockerode'; +import asTable from 'as-table'; +import filesize from 'filesize'; + +export const dockerDoctorCommand: CommandModule = { + command: 'doctor', + describe: 'docker environment check', + builder: undefined, + async handler(args) { + const docker = new Docker(); + + const images = await docker.listImages(); + const tailchatImages = images.filter((image) => + (image.RepoTags ?? []).some((tag) => tag.includes('tailchat')) + ); + + console.log('Tailchat image list:'); + console.log( + asTable.configure({ delimiter: ' | ' })( + tailchatImages.map((image) => ({ + tag: (image.RepoTags ?? []).join(','), + id: image.Id.substring(0, 12), + size: filesize(image.Size), + })) + ) + ); + + const info = await docker.info(); + console.log('info', info); + }, +}; diff --git a/apps/cli/src/commands/docker/index.ts b/apps/cli/src/commands/docker/index.ts new file mode 100644 index 00000000000..7b46c3f849c --- /dev/null +++ b/apps/cli/src/commands/docker/index.ts @@ -0,0 +1,18 @@ +import { CommandModule } from 'yargs'; +import { dockerInitCommand } from './init'; +import { dockerUpdateCommand } from './update'; +import { dockerDoctorCommand } from './doctor'; + +// https://docs.docker.com/engine/api/v1.41/ + +export const dockerCommand: CommandModule = { + command: 'docker', + describe: 'Tailchat image management', + builder: (yargs) => + yargs + .command(dockerInitCommand) + .command(dockerDoctorCommand) + .command(dockerUpdateCommand) + .demandCommand(), + handler(args) {}, +}; diff --git a/apps/cli/src/commands/docker/init.ts b/apps/cli/src/commands/docker/init.ts new file mode 100644 index 00000000000..7d7b9b8dca7 --- /dev/null +++ b/apps/cli/src/commands/docker/init.ts @@ -0,0 +1,185 @@ +import { CommandModule } from 'yargs'; +import ora from 'ora'; +import fs from 'fs-extra'; +import got from 'got'; +import path from 'path'; +import chalk from 'chalk'; +import inquirer from 'inquirer'; +import randomString from 'crypto-random-string'; +import { withGhProxy } from '../../utils'; + +// https://docs.docker.com/engine/api/v1.41/ + +const initWelcome = `================ +Initializing Tailchat configuration and environment variables for you +A complete list of environment variables can be accessed at: ${chalk.underline( + 'https://tailchat.msgbyte.com/docs/deployment/environment' +)} to learn more +================`; + +const initCompleted = (dir: string) => + chalk.green(`================ +Congratulations, you have successfully completed the configuration initialization, your configuration file is ready, and you are one step away from a successful deployment! + +Your tailchat configuration files are stored in: ${chalk.underline( + path.resolve(process.cwd(), dir) + )} + +Run the following command to complete the image download and start: +- ${chalk.bold(`cd ${dir}`)} ${chalk.gray( + '# Move to the installation directory' + )} +- ${chalk.bold('tailchat docker update')} ${chalk.gray( + '# Download/update the official mirror' + )} +- ${chalk.bold('docker compose up -d')} ${chalk.gray('# Start service')} +================`); + +const envUrl = + 'https://raw.githubusercontent.com/msgbyte/tailchat/master/docker-compose.env'; +const configUrl = + 'https://raw.githubusercontent.com/msgbyte/tailchat/master/docker-compose.yml'; + +export const dockerInitCommand: CommandModule = { + command: 'init', + describe: 'Initialize Tailchat with docker configuration', + builder: undefined, + async handler(args) { + const spinner = ora(); + try { + console.log(initWelcome); + const { dir, secret, apiUrl, fileLimit } = await inquirer.prompt([ + { + name: 'dir', + type: 'input', + default: './tailchat', + message: 'Configurate storage directory', + }, + { + name: 'secret', + type: 'input', + default: randomString({ length: 16 }), + message: + '(SECRET)Please enter any string, which will be used as the secret key for Tailchat to sign the user identity. Leaking this string will cause the risk of identity forgery. By default, a 16-digit string is randomly generated', + }, + { + name: 'apiUrl', + type: 'input', + message: + '(API_URL)Please configure an address that can be accessed by the external network, which will affect the storage path and access address of the file, example: https://tailchat.example.com', + }, + { + name: 'fileLimit', + type: 'number', + default: 1048576, + message: + '(FILE_LIMIT)File upload volume limit, the default is 1048576(1m)', + }, + ]); + + spinner.start('Start downloading the latest configuration file'); + // eslint-disable-next-line prefer-const + let [rawEnv, rawConfig] = await Promise.all([ + got(envUrl).then((res) => res.body), + got(configUrl).then((res) => res.body), + ]); + spinner.info('The configuration file is downloaded'); + + if (secret) { + rawEnv = setEnvValue(rawEnv, 'SECRET', secret); + } + + if (apiUrl) { + rawEnv = setEnvValue(rawEnv, 'API_URL', apiUrl); + } + + if (fileLimit) { + rawEnv = setEnvValue(rawEnv, 'FILE_LIMIT', fileLimit); + } + + if ( + await promptConfirm( + 'Do you need to configure the email service? The email service can be used for functions such as password retrieval and email notification.' + ) + ) { + const { stmpURI, stmpSender } = await inquirer.prompt([ + { + name: 'stmpURI', + type: 'input', + message: + '(SMTP_URI) Please configure the SMTP connection address of the mail service, for example: smtps://username:password@example.mailserver.com/?pool=true', + }, + { + name: 'stmpSender', + type: 'input', + message: + '(SMTP_SENDER) Email sender, example: "Tailchat" tailchat@example.mailserver.com', + }, + ]); + + if (stmpURI) { + rawEnv = setEnvValue(rawEnv, 'SMTP_URI', stmpURI); + } + if (stmpSender) { + rawEnv = setEnvValue(rawEnv, 'SMTP_SENDER', stmpSender); + } + + if (stmpURI && stmpSender) { + if ( + await promptConfirm( + 'Do you need to enable email verification? After it is enabled, when the user registers, it is necessary to verify the email address and pass it before continuing to register' + ) + ) { + rawEnv = setEnvValue(rawEnv, 'EMAIL_VERIFY', 'true'); + } + } + } + + spinner.info(`Creating directory ${dir} ...`); + await fs.mkdirp(dir); + + spinner.info('Writing configuration file ...'); + + await Promise.all([ + fs.writeFile(path.join(dir, 'docker-compose.env'), rawEnv), + fs.writeFile(path.join(dir, 'docker-compose.yml'), rawConfig), + ]); + spinner.succeed('The configuration is initialized'); + + console.log(initCompleted(dir)); + } catch (err) { + spinner.fail('Unexpected initialization of Tailchat with docker'); + console.error(err); + } + }, +}; + +/** + * 设置环境变量值 + */ +function setEnvValue(text: string, key: string, value: string): string { + const re = new RegExp(`${key}=(.*?)\n`); + if (re.test(text)) { + // 配置文件已经有了 + return text.replace(re, `${key}=${value}\n`); + } + + // 配置文件还没有 + return text + `\n${key}=${value}\n`; +} + +/** + * 设置更多配置的确认项 + */ +async function promptConfirm(message: string): Promise { + const { res } = await inquirer.prompt([ + { + name: 'res', + type: 'confirm', + message, + default: false, + }, + ]); + + return res; +} diff --git a/apps/cli/src/commands/docker/update.ts b/apps/cli/src/commands/docker/update.ts new file mode 100644 index 00000000000..fbf89f3e783 --- /dev/null +++ b/apps/cli/src/commands/docker/update.ts @@ -0,0 +1,108 @@ +import { CommandModule } from 'yargs'; +import ora from 'ora'; +import Docker from 'dockerode'; +import Spinnies from 'spinnies'; + +const remoteImageName = 'moonrailgun/tailchat:latest'; +const targetImage = { + repo: 'tailchat', + tag: 'latest', +}; +const targetImageName = targetImage.repo + targetImage.tag; + +export const dockerUpdateCommand: CommandModule = { + command: 'update', + describe: 'Update Tailchat image version', + builder: undefined, + async handler(args) { + const docker = new Docker(); + + const spinner = ora().start('Start updating the image'); + + try { + const pullSpinnies = new Spinnies(); + + await new Promise((resolve, reject) => { + const taskMap = new Map(); + + // 这里有个类型问题,不会返回任何值 + docker.pull(remoteImageName, {}, (err, stream) => { + if (err) { + reject(err); + return; + } + + spinner.info('The remote image has been found, start downloading'); + + docker.modem.followProgress( + stream, + (err, output) => { + // onFinish + // console.log('finish', err, output); + + if (err) { + pullSpinnies.stopAll('stopped'); + reject(err); + } else { + pullSpinnies.stopAll('succeed'); + + spinner.succeed(output[1]?.status); + spinner.succeed(output[2]?.status); + resolve(); + } + }, + (event) => { + if (!event.id) { + console.log(event.status); // 可能是完成后的信息打印,直接输出 + return; + } + const text = `[${event.id}] ${event.status}${ + event.progress ? ':' : '' + } ${event.progress ?? ''}`; + + // onProcess + if (taskMap.has(event.id)) { + pullSpinnies.update(event.id, { + text, + }); + + if (event.status === 'Pull complete') { + pullSpinnies.succeed(event.id); + } + } else { + taskMap.set( + event.id, + pullSpinnies.add(event.id, { + text, + }) + ); + } + } + ); + }); + }); + + spinner.succeed('Download image complete'); + + const image = docker.getImage(remoteImageName); + + if (!image) { + spinner.fail( + 'An exception occurred, the downloaded image was not found' + ); + return; + } + + spinner.info('Updating image tags'); + + await image.tag(targetImage); + + spinner.succeed('The image tag has been updated'); + } catch (err) { + spinner.fail( + 'An update error occurred, please check the network configuration' + ); + console.error(err); + } + }, +}; diff --git a/apps/cli/src/commands/registry/config.ts b/apps/cli/src/commands/registry/config.ts new file mode 100644 index 00000000000..88a6dd76749 --- /dev/null +++ b/apps/cli/src/commands/registry/config.ts @@ -0,0 +1,62 @@ +import { CommandModule } from 'yargs'; +import path from 'path'; +import glob from 'glob'; +import inquirer from 'inquirer'; +import fs from 'fs-extra'; + +const feRegistryPath = path.join(process.cwd(), './client/web/registry.json'); + +export const registryConfigCommand: CommandModule = { + command: 'config', + describe: + 'config tailchat registry which can display in Tailchat, run it in tailchat root path', + builder: (yargs) => + yargs + .option('fe', { + describe: 'Config FE Plugin List', + type: 'boolean', + }) + .option('verbose', { + describe: 'Show plugin manifest path list', + type: 'boolean', + }), + async handler(args) { + const feplugins = glob.sync( + path.join(process.cwd(), './client/web/plugins/*/manifest.json') + ); + const beplugins = glob.sync( + path.join(process.cwd(), './server/plugins/*/web/plugins/*/manifest.json') + ); + + if (args.verbose) { + console.log('feplugins', feplugins); + console.log('beplugins', beplugins); + } + + console.log( + `Scan plugins: fe(count: ${feplugins.length}) be(count: ${beplugins.length})` + ); + + if (args.fe) { + const alreadySelected = await fs.readJSON(feRegistryPath); + const feInfos = await Promise.all(feplugins.map((p) => fs.readJSON(p))); + const { selected: selectedInfo } = await inquirer.prompt([ + { + name: 'selected', + type: 'checkbox', + default: alreadySelected + .map((item: any) => feInfos.find((info) => info.name === item.name)) + .filter(Boolean), + choices: feInfos.map((info) => ({ + name: `${info.name}(${info.version})`, + value: info, + })), + }, + ]); + + console.log(`Selected ${selectedInfo.length} plugin.`); + + await fs.writeJSON(feRegistryPath, selectedInfo, { spaces: 2 }); + } + }, +}; diff --git a/apps/cli/src/commands/registry/index.ts b/apps/cli/src/commands/registry/index.ts new file mode 100644 index 00000000000..069799abfbb --- /dev/null +++ b/apps/cli/src/commands/registry/index.ts @@ -0,0 +1,11 @@ +import { CommandModule } from 'yargs'; +import { registryConfigCommand } from './config'; + +// https://docs.docker.com/engine/api/v1.41/ + +export const registryCommand: CommandModule = { + command: 'registry', + describe: 'Tailchat registry config', + builder: (yargs) => yargs.command(registryConfigCommand).demandCommand(), + handler(args) {}, +}; diff --git a/apps/cli/src/commands/smtp.ts b/apps/cli/src/commands/smtp.ts new file mode 100644 index 00000000000..47927acd143 --- /dev/null +++ b/apps/cli/src/commands/smtp.ts @@ -0,0 +1,103 @@ +import { CommandModule } from 'yargs'; +import { config } from 'dotenv'; +import inquirer from 'inquirer'; +import nodemailer from 'nodemailer'; +import { parseConnectionUrl } from 'nodemailer/lib/shared'; + +export const smtpCommand: CommandModule = { + command: 'smtp', + describe: 'SMTP Service', + builder: (yargs) => + yargs + .command( + 'verify', + 'Verify smtp sender service', + (yargs) => {}, + async (args) => { + config(); // 加载环境变量 + + console.log( + 'This command will verify SMTP URI which use in tailchat, please put your URI which same like in tailchat env' + ); + const { uri } = await inquirer.prompt([ + { + type: 'input', + name: 'uri', + message: 'SMTP_URI', + default: process.env.SMTP_URI, + validate: isValidStr, + }, + ]); + + const transporter = nodemailer.createTransport( + parseConnectionUrl(uri) + ); + + try { + const verify = await transporter.verify(); + console.log('Verify Result:', verify); + } catch (err) { + console.log('Verify Failed:', String(err)); + } + } + ) + .command( + 'test', + 'Send test email with smtp service', + (yargs) => {}, + async (args) => { + config(); // 加载环境变量 + + console.log( + 'This command will send test email to your own email, please put your info which same like in tailchat env' + ); + + const { sender, uri, target } = await inquirer.prompt([ + { + type: 'input', + name: 'sender', + message: 'SMTP_SENDER', + default: process.env.SMTP_SENDER, + validate: isValidStr, + }, + { + type: 'input', + name: 'uri', + message: 'SMTP_URI', + default: process.env.SMTP_URI, + validate: isValidStr, + }, + { + type: 'input', + name: 'target', + message: 'Email address which wanna send', + validate: isValidStr, + }, + ]); + + const transporter = nodemailer.createTransport( + parseConnectionUrl(uri) + ); + + try { + const res = await transporter.sendMail({ + from: sender, + to: target, + subject: `Test email send in ${new Date().toLocaleDateString()}`, + text: `This is a test email send by tailchat-cli at ${new Date().toLocaleString()}`, + }); + console.log('Send Result:', res); + } catch (err) { + console.log('Send Failed:', String(err)); + } finally { + transporter.close(); + } + } + ) + .demandCommand(), + handler() {}, +}; + +function isValidStr(input: any): boolean { + return typeof input === 'string' && input.length > 0; +} diff --git a/apps/cli/src/commands/usage.ts b/apps/cli/src/commands/usage.ts new file mode 100644 index 00000000000..c673e4575ee --- /dev/null +++ b/apps/cli/src/commands/usage.ts @@ -0,0 +1,52 @@ +import { CommandModule } from 'yargs'; +import inquirer from 'inquirer'; +import find from 'find-process'; +import pidusage from 'pidusage'; + +export const usageCommand: CommandModule = { + command: 'usage [pid]', + describe: 'View Tailchat process usage', + builder: (yargs) => + yargs.positional('pid', { + demandOption: false, + description: 'process id', + type: 'number', + }), + async handler(args) { + let pidList: number[] = []; + + if (!args.pid) { + const list = await find('name', 'tailchat'); + + const processList = list.filter((item) => item.pid !== process.pid); + + const res = await inquirer.prompt([ + { + type: 'checkbox', + name: 'process', + message: 'Select the process to view', + choices: processList.map((item) => ({ + name: `(${item.pid})${item.cmd}`, + value: item.pid, + })), + }, + ]); + + pidList = res.process; + } else { + if (Array.isArray(args.pid)) { + pidList = args.pid; + } else { + pidList = [args.pid as number]; + } + } + + const stats = await pidusage(pidList); + const res = Object.entries(stats).map(([pid, info]) => ({ + pid, + cpu: info.cpu, + memory: `${info.memory / 1024 / 1024} MB`, + })); + console.table(res); + }, +}; diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts new file mode 100644 index 00000000000..fb19ca17e50 --- /dev/null +++ b/apps/cli/src/index.ts @@ -0,0 +1,26 @@ +import './update'; +import yargs from 'yargs'; +import { createCommand } from './commands/create'; +import { connectCommand } from './commands/connect'; +import { appCommand } from './commands/app'; +import { declarationCommand } from './commands/declaration'; +import { benchmarkCommand } from './commands/benchmark'; +import { dockerCommand } from './commands/docker'; +import { usageCommand } from './commands/usage'; +import { registryCommand } from './commands/registry'; +import { smtpCommand } from './commands/smtp'; + +yargs + .demandCommand() + .command(createCommand) + .command(connectCommand) + .command(appCommand) + .command(benchmarkCommand) + .command(declarationCommand) + .command(dockerCommand) + .command(registryCommand) + .command(smtpCommand) + .command(usageCommand) + .alias('h', 'help') + .scriptName('tailchat') + .parse(); diff --git a/apps/cli/src/update.ts b/apps/cli/src/update.ts new file mode 100644 index 00000000000..0d193087003 --- /dev/null +++ b/apps/cli/src/update.ts @@ -0,0 +1,7 @@ +import updateNotifier from 'update-notifier'; +const packageJson = require('../package.json'); + +updateNotifier({ + pkg: packageJson, + shouldNotifyInNpmScript: true, +}).notify(); diff --git a/apps/cli/src/utils.ts b/apps/cli/src/utils.ts new file mode 100644 index 00000000000..47cc5c93f84 --- /dev/null +++ b/apps/cli/src/utils.ts @@ -0,0 +1,15 @@ +/** + * Determine whether it is a development environment + */ +export function isDev(): boolean { + return process.env.NODE_ENV === 'development'; +} + +/** + * Add github resource proxy to optimize chinese access speed + * + * @deprecated this website is down + */ +export function withGhProxy(url: string): string { + return `https://ghproxy.com/${url}`; +} diff --git a/apps/cli/templates/client-plugin/{{id}}/manifest.json b/apps/cli/templates/client-plugin/{{id}}/manifest.json new file mode 100644 index 00000000000..264a156e948 --- /dev/null +++ b/apps/cli/templates/client-plugin/{{id}}/manifest.json @@ -0,0 +1,9 @@ +{ + "label": "{{name}}", + "name": "{{id}}", + "url": "/plugins/{{id}}/index.js", + "version": "0.0.0", + "author": "{{author}}", + "description": "{{desc}}", + "requireRestart": true +} diff --git a/apps/cli/templates/client-plugin/{{id}}/package.json b/apps/cli/templates/client-plugin/{{id}}/package.json new file mode 100644 index 00000000000..a2fa2038caf --- /dev/null +++ b/apps/cli/templates/client-plugin/{{id}}/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/{{id}}", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "{{desc}}", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/apps/cli/templates/client-plugin/{{id}}/src/index.tsx b/apps/cli/templates/client-plugin/{{id}}/src/index.tsx new file mode 100644 index 00000000000..ca5e1c459ca --- /dev/null +++ b/apps/cli/templates/client-plugin/{{id}}/src/index.tsx @@ -0,0 +1,4 @@ +const PLUGIN_ID = '{{id}}'; +const PLUGIN_NAME = '{{name}}'; + +console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`); diff --git a/apps/cli/templates/client-plugin/{{id}}/src/translate.ts b/apps/cli/templates/client-plugin/{{id}}/src/translate.ts new file mode 100644 index 00000000000..96b0360b4d6 --- /dev/null +++ b/apps/cli/templates/client-plugin/{{id}}/src/translate.ts @@ -0,0 +1,8 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + name: localTrans({ + 'zh-CN': '{{name}}', + 'en-US': '{{name}}', + }), +}; diff --git a/apps/cli/templates/client-plugin/{{id}}/tsconfig.json b/apps/cli/templates/client-plugin/{{id}}/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/apps/cli/templates/client-plugin/{{id}}/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/apps/cli/templates/client-plugin/{{id}}/types/tailchat.d.ts b/apps/cli/templates/client-plugin/{{id}}/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/apps/cli/templates/client-plugin/{{id}}/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/apps/cli/templates/plopfile.js b/apps/cli/templates/plopfile.js new file mode 100644 index 00000000000..4daf0e6d78a --- /dev/null +++ b/apps/cli/templates/plopfile.js @@ -0,0 +1,132 @@ +const path = require('path'); +const _ = require('lodash') + +function pickPluginName(text) { + const [_1, _2, ...others] = text.split('.'); + return others.join('-'); +} +function upperFirst(text) { + return _.upperFirst(_.camelCase(text)); +} + +module.exports = function ( + /** @type {import('plop').NodePlopAPI} */ + plop +) { + plop.setHelper('pickPluginName', pickPluginName); + plop.setHelper('pickPluginNameUp', (text) => { + return upperFirst(pickPluginName(text)); + }); + + const namePrompts = [ + { + type: 'input', + name: 'name', + require: true, + message: 'Plugin Name', + } + ] + + const serverPrompts = [ + { + type: 'input', + name: 'id', + require: true, + default: 'com.msgbyte.example', + message: 'Plugin unique id, a unique string in reverse domain name format', + }, + { + type: 'input', + name: 'author', + message: 'Plugin Author', + default: 'anonymous', + }, + { + type: 'input', + name: 'desc', + message: 'Plugin description', + default: '', + }, + ]; + + // 服务端插件的前端模板代码 + plop.setGenerator('client-plugin', { + description: 'Pure frontend plugin template', + prompts: [ + ...namePrompts, + ...serverPrompts, + ], + actions: [ + { + type: 'addMany', + destination: path.resolve(process.cwd(), './plugins'), + base: './client-plugin', + templateFiles: [ + './client-plugin/**/*', + ], + skipIfExists: true, + globOptions: {}, + }, + ], + }); + + // 服务端插件的前端模板代码 + plop.setGenerator('server-plugin', { + description: 'Pure backtend plugin template', + prompts: serverPrompts, + actions: [ + { + type: 'addMany', + destination: path.resolve(process.cwd(), './plugins'), + base: './server-plugin', + templateFiles: ['./server-plugin/**/*'], + skipIfExists: true, + globOptions: {}, + }, + ], + }); + + // 服务端插件的前端模板代码 + plop.setGenerator('server-plugin-web', { + description: 'web plugin in backtend plugin template', + prompts: [ + ...namePrompts, + ...serverPrompts, + ], + actions: [ + { + type: 'addMany', + destination: path.resolve(process.cwd(), './plugins'), + base: './server-plugin-web', + templateFiles: [ + './server-plugin-web/**/*', + './server-plugin-web/*/.ministarrc.js', + ], + skipIfExists: true, + globOptions: {}, + }, + ], + }); + + // 服务端插件的前端模板代码 + plop.setGenerator('server-plugin-full', { + description: 'Full backend plugin template', + prompts: [ + ...namePrompts, + ...serverPrompts, + ], + actions: [ + { + type: 'addMany', + destination: path.resolve(process.cwd(), './plugins'), + base: './server-plugin-full', + templateFiles: [ + './server-plugin-full/**/*', + './server-plugin-full/*/.ministarrc.js', + ], + skipIfExists: true, + globOptions: {}, + }, + ], + }); +}; diff --git a/apps/cli/templates/server-plugin-full/{{id}}/.ministarrc.js b/apps/cli/templates/server-plugin-full/{{id}}/.ministarrc.js new file mode 100644 index 00000000000..88b52deba9a --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/.ministarrc.js @@ -0,0 +1,17 @@ +const path = require('path'); + +const pluginRoot = path.resolve(__dirname, './web'); +const outDir = path.resolve(__dirname, '../../public'); + +module.exports = { + externalDeps: [ + 'react', + 'react-router', + 'axios', + 'styled-components', + 'zustand', + 'zustand/middleware/immer' + ], + pluginRoot, + outDir, +}; diff --git a/apps/cli/templates/server-plugin-full/{{id}}/models/{{pickPluginName id}}.ts b/apps/cli/templates/server-plugin-full/{{id}}/models/{{pickPluginName id}}.ts new file mode 100644 index 00000000000..75159f78a01 --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/models/{{pickPluginName id}}.ts @@ -0,0 +1,20 @@ +import { db } from 'tailchat-server-sdk'; +const { getModelForClass, prop, modelOptions, TimeStamps } = db; + +@modelOptions({ + options: { + customName: 'p_{{pickPluginName id}}', + }, +}) +export class {{pickPluginNameUp id}} extends TimeStamps implements db.Base { + _id: db.Types.ObjectId; + id: string; +} + +export type {{pickPluginNameUp id}}Document = db.DocumentType<{{pickPluginNameUp id}}>; + +const model = getModelForClass({{pickPluginNameUp id}}); + +export type {{pickPluginNameUp id}}Model = typeof model; + +export default model; diff --git a/apps/cli/templates/server-plugin-full/{{id}}/package.json b/apps/cli/templates/server-plugin-full/{{id}}/package.json new file mode 100644 index 00000000000..cc798376fa2 --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/package.json @@ -0,0 +1,20 @@ +{ + "name": "tailchat-plugin-{{pickPluginName id}}", + "version": "1.0.0", + "main": "index.js", + "author": "{{author}}", + "description": "{{desc}}", + "license": "MIT", + "private": true, + "scripts": { + "build:web": "ministar buildPlugin all", + "build:web:watch": "ministar watchPlugin all" + }, + "devDependencies": { + "@types/react": "18.0.20", + "mini-star": "*" + }, + "dependencies": { + "tailchat-server-sdk": "*" + } +} diff --git a/apps/cli/templates/server-plugin-full/{{id}}/services/{{pickPluginName id}}.service.ts b/apps/cli/templates/server-plugin-full/{{id}}/services/{{pickPluginName id}}.service.ts new file mode 100644 index 00000000000..71b2404d6cb --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/services/{{pickPluginName id}}.service.ts @@ -0,0 +1,22 @@ +import { TcService, TcDbService } from 'tailchat-server-sdk'; +import type { {{pickPluginNameUp id}}Document, {{pickPluginNameUp id}}Model } from '../models/{{pickPluginName id}}'; + +/** + * {{name}} + * + * {{desc}} + */ +interface {{pickPluginNameUp id}}Service + extends TcService, + TcDbService<{{pickPluginNameUp id}}Document, {{pickPluginNameUp id}}Model> {} +class {{pickPluginNameUp id}}Service extends TcService { + get serviceName() { + return 'plugin:{{id}}'; + } + + onInit() { + this.registerLocalDb(require('../models/{{pickPluginName id}}').default); + } +} + +export default {{pickPluginNameUp id}}Service; diff --git a/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/manifest.json b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/manifest.json new file mode 100644 index 00000000000..7c49892345a --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/manifest.json @@ -0,0 +1,9 @@ +{ + "label": "{{name}}", + "name": "{{id}}", + "url": "{BACKEND}/plugins/{{id}}/index.js", + "version": "0.0.0", + "author": "{{author}}", + "description": "{{desc}}", + "requireRestart": true +} diff --git a/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/package.json b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/package.json new file mode 100644 index 00000000000..a2fa2038caf --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/{{id}}", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "{{desc}}", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/src/index.tsx b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/src/index.tsx new file mode 100644 index 00000000000..ca5e1c459ca --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/src/index.tsx @@ -0,0 +1,4 @@ +const PLUGIN_ID = '{{id}}'; +const PLUGIN_NAME = '{{name}}'; + +console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`); diff --git a/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/tsconfig.json b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/types/tailchat.d.ts b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/apps/cli/templates/server-plugin-full/{{id}}/web/plugins/{{id}}/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/apps/cli/templates/server-plugin-web/{{id}}/.ministarrc.js b/apps/cli/templates/server-plugin-web/{{id}}/.ministarrc.js new file mode 100644 index 00000000000..88b52deba9a --- /dev/null +++ b/apps/cli/templates/server-plugin-web/{{id}}/.ministarrc.js @@ -0,0 +1,17 @@ +const path = require('path'); + +const pluginRoot = path.resolve(__dirname, './web'); +const outDir = path.resolve(__dirname, '../../public'); + +module.exports = { + externalDeps: [ + 'react', + 'react-router', + 'axios', + 'styled-components', + 'zustand', + 'zustand/middleware/immer' + ], + pluginRoot, + outDir, +}; diff --git a/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/manifest.json b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/manifest.json new file mode 100644 index 00000000000..7c49892345a --- /dev/null +++ b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/manifest.json @@ -0,0 +1,9 @@ +{ + "label": "{{name}}", + "name": "{{id}}", + "url": "{BACKEND}/plugins/{{id}}/index.js", + "version": "0.0.0", + "author": "{{author}}", + "description": "{{desc}}", + "requireRestart": true +} diff --git a/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/package.json b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/package.json new file mode 100644 index 00000000000..a2fa2038caf --- /dev/null +++ b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/{{id}}", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "{{desc}}", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/src/index.tsx b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/src/index.tsx new file mode 100644 index 00000000000..ca5e1c459ca --- /dev/null +++ b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/src/index.tsx @@ -0,0 +1,4 @@ +const PLUGIN_ID = '{{id}}'; +const PLUGIN_NAME = '{{name}}'; + +console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`); diff --git a/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/src/translate.ts b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/src/translate.ts new file mode 100644 index 00000000000..96b0360b4d6 --- /dev/null +++ b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/src/translate.ts @@ -0,0 +1,8 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + name: localTrans({ + 'zh-CN': '{{name}}', + 'en-US': '{{name}}', + }), +}; diff --git a/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/tsconfig.json b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/types/tailchat.d.ts b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/apps/cli/templates/server-plugin-web/{{id}}/web/plugins/{{id}}/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/apps/cli/templates/server-plugin/{{id}}/models/{{pickPluginName id}}.ts b/apps/cli/templates/server-plugin/{{id}}/models/{{pickPluginName id}}.ts new file mode 100644 index 00000000000..75159f78a01 --- /dev/null +++ b/apps/cli/templates/server-plugin/{{id}}/models/{{pickPluginName id}}.ts @@ -0,0 +1,20 @@ +import { db } from 'tailchat-server-sdk'; +const { getModelForClass, prop, modelOptions, TimeStamps } = db; + +@modelOptions({ + options: { + customName: 'p_{{pickPluginName id}}', + }, +}) +export class {{pickPluginNameUp id}} extends TimeStamps implements db.Base { + _id: db.Types.ObjectId; + id: string; +} + +export type {{pickPluginNameUp id}}Document = db.DocumentType<{{pickPluginNameUp id}}>; + +const model = getModelForClass({{pickPluginNameUp id}}); + +export type {{pickPluginNameUp id}}Model = typeof model; + +export default model; diff --git a/apps/cli/templates/server-plugin/{{id}}/package.json b/apps/cli/templates/server-plugin/{{id}}/package.json new file mode 100644 index 00000000000..d4156f19271 --- /dev/null +++ b/apps/cli/templates/server-plugin/{{id}}/package.json @@ -0,0 +1,14 @@ +{ + "name": "tailchat-plugin-{{pickPluginName id}}", + "version": "1.0.0", + "main": "index.js", + "author": "{{author}}", + "description": "{{desc}}", + "license": "MIT", + "private": true, + "scripts": {}, + "devDependencies": {}, + "dependencies": { + "tailchat-server-sdk": "*" + } +} diff --git a/apps/cli/templates/server-plugin/{{id}}/services/{{pickPluginName id}}.service.ts b/apps/cli/templates/server-plugin/{{id}}/services/{{pickPluginName id}}.service.ts new file mode 100644 index 00000000000..6e7dc140c70 --- /dev/null +++ b/apps/cli/templates/server-plugin/{{id}}/services/{{pickPluginName id}}.service.ts @@ -0,0 +1,20 @@ +import { TcService, TcDbService } from 'tailchat-server-sdk'; +import type { {{pickPluginNameUp id}}Document, {{pickPluginNameUp id}}Model } from '../models/{{pickPluginName id}}'; + +/** + * {{desc}} + */ +interface {{pickPluginNameUp id}}Service + extends TcService, + TcDbService<{{pickPluginNameUp id}}Document, {{pickPluginNameUp id}}Model> {} +class {{pickPluginNameUp id}}Service extends TcService { + get serviceName() { + return 'plugin:{{id}}'; + } + + onInit() { + this.registerLocalDb(require('../models/{{pickPluginName id}}').default); + } +} + +export default {{pickPluginNameUp id}}Service; diff --git a/apps/cli/tsconfig.json b/apps/cli/tsconfig.json new file mode 100644 index 00000000000..b0425a317ac --- /dev/null +++ b/apps/cli/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "rootDir": "src", + "outDir": "lib", + "jsx": "react", + "allowSyntheticDefaultImports": true, + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "skipLibCheck": true, + "noEmit": false + }, + "exclude": ["./templates"] +} diff --git a/apps/github-app/.dockerignore b/apps/github-app/.dockerignore new file mode 100644 index 00000000000..c961acb5059 --- /dev/null +++ b/apps/github-app/.dockerignore @@ -0,0 +1,12 @@ +**/node_modules/ +**/.git +**/README.md +**/LICENSE +**/.vscode +**/npm-debug.log +**/coverage +**/.env +**/.editorconfig +**/dist +**/*.pem +Dockerfile diff --git a/apps/github-app/.env.example b/apps/github-app/.env.example new file mode 100644 index 00000000000..1bfd78026b6 --- /dev/null +++ b/apps/github-app/.env.example @@ -0,0 +1,16 @@ +# The ID of your GitHub App +APP_ID= +WEBHOOK_SECRET=development +PRIVATE_KEY= + +# Use `trace` to get verbose logging or `info` to show less +LOG_LEVEL=debug + +# Go to https://smee.io/new set this to the URL that you are redirected to. +WEBHOOK_PROXY_URL= + +# Tailchat +TAILCHAT_WEB_URL=https://nightly.paw.msgbyte.com +TAILCHAT_API_URL=https://tailchat-nightly.moonrailgun.com +TAILCHAT_APP_ID= +TAILCHAT_APP_SECRET= diff --git a/apps/github-app/.gitignore b/apps/github-app/.gitignore new file mode 100644 index 00000000000..b3d906d5285 --- /dev/null +++ b/apps/github-app/.gitignore @@ -0,0 +1,7 @@ +node_modules +npm-debug.log +*.pem +!mock-cert.pem +.env +coverage +lib diff --git a/apps/github-app/CODE_OF_CONDUCT.md b/apps/github-app/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..203ff8f1343 --- /dev/null +++ b/apps/github-app/CODE_OF_CONDUCT.md @@ -0,0 +1,73 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +education, socio-economic status, nationality, personal appearance, race, +religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at . All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org diff --git a/apps/github-app/CONTRIBUTING.md b/apps/github-app/CONTRIBUTING.md new file mode 100644 index 00000000000..f6ebb8125f0 --- /dev/null +++ b/apps/github-app/CONTRIBUTING.md @@ -0,0 +1,39 @@ +## Contributing + +[fork]: /fork +[pr]: /compare +[code-of-conduct]: CODE_OF_CONDUCT.md + +Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. + +Please note that this project is released with a [Contributor Code of Conduct][code-of-conduct]. By participating in this project you agree to abide by its terms. + +## Issues and PRs + +If you have suggestions for how this project could be improved, or want to report a bug, open an issue! We'd love all and any contributions. If you have questions, too, we'd love to hear them. + +We'd also love PRs. If you're thinking of a large PR, we advise opening up an issue first to talk about it, though! Look at the links below if you're not sure how to open a PR. + +## Submitting a pull request + +1. [Fork][fork] and clone the repository. +1. Configure and install the dependencies: `npm install`. +1. Make sure the tests pass on your machine: `npm test`, note: these tests also apply the linter, so there's no need to lint separately. +1. Create a new branch: `git checkout -b my-branch-name`. +1. Make your change, add tests, and make sure the tests still pass. +1. Push to your fork and [submit a pull request][pr]. +1. Pat your self on the back and wait for your pull request to be reviewed and merged. + +Here are a few things you can do that will increase the likelihood of your pull request being accepted: + +- Write and update tests. +- Keep your changes as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests. +- Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + +Work in Progress pull requests are also welcome to get feedback early on, or if there is something blocked you. + +## Resources + +- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) +- [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) +- [GitHub Help](https://help.github.com) diff --git a/apps/github-app/Dockerfile b/apps/github-app/Dockerfile new file mode 100644 index 00000000000..df02fe4831b --- /dev/null +++ b/apps/github-app/Dockerfile @@ -0,0 +1,8 @@ +FROM node:12-slim +WORKDIR /usr/src/app +COPY package.json package-lock.json ./ +RUN npm ci --production +RUN npm cache clean --force +ENV NODE_ENV="production" +COPY . . +CMD [ "npm", "start" ] diff --git a/apps/github-app/LICENSE b/apps/github-app/LICENSE new file mode 100644 index 00000000000..7281f3ba09a --- /dev/null +++ b/apps/github-app/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2022, moonrailgun + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/apps/github-app/README.md b/apps/github-app/README.md new file mode 100644 index 00000000000..146dbae5128 --- /dev/null +++ b/apps/github-app/README.md @@ -0,0 +1,33 @@ +# github-app + +> A GitHub App built with [Probot](https://github.com/probot/probot) that Tailchat github integrations + +## Setup + +```sh +# Install dependencies +npm install + +# Run the bot +npm start +``` + +## Docker + +```sh +# 1. Build container +docker build -t github-app . + +# 2. Start container +docker run -e APP_ID= -e PRIVATE_KEY= github-app +``` + +## Contributing + +If you have suggestions for how github-app could be improved, or want to report a bug, open an issue! We'd love all and any contributions. + +For more, check out the [Contributing Guide](CONTRIBUTING.md). + +## License + +[ISC](LICENSE) © 2022 moonrailgun diff --git a/apps/github-app/api/github/webhooks/index.js b/apps/github-app/api/github/webhooks/index.js new file mode 100644 index 00000000000..2e108ded73d --- /dev/null +++ b/apps/github-app/api/github/webhooks/index.js @@ -0,0 +1,10 @@ +// For vercel +// Reference: https://probot.github.io/docs/deployment/#vercel + +const { createNodeMiddleware, createProbot } = require('probot'); +const appFn = require('../../../src/app').appFn; + +module.exports = createNodeMiddleware(appFn, { + probot: createProbot(), + webhooksPath: '/api/github/webhooks', +}); diff --git a/apps/github-app/api/index.js b/apps/github-app/api/index.js new file mode 100644 index 00000000000..fd60a3b646d --- /dev/null +++ b/apps/github-app/api/index.js @@ -0,0 +1,11 @@ +const app = require('express')(); +const { v4 } = require('uuid'); +const { createProbot } = require('probot'); +const { appFn, buildRouter } = require('../src/app'); + +const probot = createProbot(); +probot.load(appFn, { + getRouter: (path) => app, +}); + +module.exports = app; diff --git a/apps/github-app/app.yml b/apps/github-app/app.yml new file mode 100644 index 00000000000..d5a22f82598 --- /dev/null +++ b/apps/github-app/app.yml @@ -0,0 +1,137 @@ +# This is a GitHub App Manifest. These settings will be used by default when +# initially configuring your GitHub App. +# +# NOTE: changing this file will not update your GitHub App settings. +# You must visit github.com/settings/apps/your-app-name to edit them. +# +# Read more about configuring your GitHub App: +# https://probot.github.io/docs/development/#configuring-a-github-app +# +# Read more about GitHub App Manifests: +# https://developer.github.com/apps/building-github-apps/creating-github-apps-from-a-manifest/ + +# The list of events the GitHub App subscribes to. +# Uncomment the event names below to enable them. +default_events: + # - check_run + # - check_suite + # - commit_comment + # - create + # - delete + # - deployment + # - deployment_status + # - fork + # - gollum + # - issue_comment + - issues +# - label +# - milestone +# - member +# - membership +# - org_block +# - organization +# - page_build +# - project +# - project_card +# - project_column +# - public +# - pull_request +# - pull_request_review +# - pull_request_review_comment +# - push +# - release +# - repository +# - repository_import +# - status +# - team +# - team_add +# - watch + +# The set of permissions needed by the GitHub App. The format of the object uses +# the permission name for the key (for example, issues) and the access type for +# the value (for example, write). +# Valid values are `read`, `write`, and `none` +default_permissions: + # Repository creation, deletion, settings, teams, and collaborators. + # https://developer.github.com/v3/apps/permissions/#permission-on-administration + # administration: read + + # Checks on code. + # https://developer.github.com/v3/apps/permissions/#permission-on-checks + # checks: read + + # Repository contents, commits, branches, downloads, releases, and merges. + # https://developer.github.com/v3/apps/permissions/#permission-on-contents + # contents: read + + # Deployments and deployment statuses. + # https://developer.github.com/v3/apps/permissions/#permission-on-deployments + # deployments: read + + # Issues and related comments, assignees, labels, and milestones. + # https://developer.github.com/v3/apps/permissions/#permission-on-issues + issues: write + + # Search repositories, list collaborators, and access repository metadata. + # https://developer.github.com/v3/apps/permissions/#metadata-permissions + metadata: read + + # Retrieve Pages statuses, configuration, and builds, as well as create new builds. + # https://developer.github.com/v3/apps/permissions/#permission-on-pages + # pages: read + + # Pull requests and related comments, assignees, labels, milestones, and merges. + # https://developer.github.com/v3/apps/permissions/#permission-on-pull-requests + # pull_requests: read + + # Manage the post-receive hooks for a repository. + # https://developer.github.com/v3/apps/permissions/#permission-on-repository-hooks + # repository_hooks: read + + # Manage repository projects, columns, and cards. + # https://developer.github.com/v3/apps/permissions/#permission-on-repository-projects + # repository_projects: read + + # Retrieve security vulnerability alerts. + # https://developer.github.com/v4/object/repositoryvulnerabilityalert/ + # vulnerability_alerts: read + + # Commit statuses. + # https://developer.github.com/v3/apps/permissions/#permission-on-statuses + # statuses: read + + # Organization members and teams. + # https://developer.github.com/v3/apps/permissions/#permission-on-members + # members: read + + # View and manage users blocked by the organization. + # https://developer.github.com/v3/apps/permissions/#permission-on-organization-user-blocking + # organization_user_blocking: read + + # Manage organization projects, columns, and cards. + # https://developer.github.com/v3/apps/permissions/#permission-on-organization-projects + # organization_projects: read + + # Manage team discussions and related comments. + # https://developer.github.com/v3/apps/permissions/#permission-on-team-discussions + # team_discussions: read + + # Manage the post-receive hooks for an organization. + # https://developer.github.com/v3/apps/permissions/#permission-on-organization-hooks + # organization_hooks: read + + # Get notified of, and update, content references. + # https://developer.github.com/v3/apps/permissions/ + # organization_administration: read +# The name of the GitHub App. Defaults to the name specified in package.json +# name: My Probot App + +# The homepage of your GitHub App. +# url: https://example.com/ + +# A description of the GitHub App. +# description: A description of my awesome app + +# Set to true when your GitHub App is available to the public or false when it is only accessible to the owner of the app. +# Default: true +# public: false diff --git a/apps/github-app/jest.config.js b/apps/github-app/jest.config.js new file mode 100644 index 00000000000..c3b7688b037 --- /dev/null +++ b/apps/github-app/jest.config.js @@ -0,0 +1,9 @@ +module.exports = { + roots: ['/src/', '/test/'], + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + testRegex: '(/__tests__/.*|\\.(test|spec))\\.[tj]sx?$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + testEnvironment: 'node', +}; diff --git a/apps/github-app/package.json b/apps/github-app/package.json new file mode 100644 index 00000000000..87d8e7bbeac --- /dev/null +++ b/apps/github-app/package.json @@ -0,0 +1,45 @@ +{ + "name": "tailchat-github-app", + "version": "1.0.0", + "private": true, + "description": "Tailchat github integrations", + "author": "moonrailgun", + "license": "ISC", + "homepage": "https://github.com/msgbyte/tailchat", + "keywords": [ + "probot", + "github", + "probot-app" + ], + "scripts": { + "dev": "nodemon --watch \"src/**\" --ext \"ts\" --ignore \"src/**/*.spec.ts\" --exec \"ts-node --transpile-only src/index.ts\"", + "build": "tsc", + "prepare": "tsc", + "test": "jest" + }, + "dependencies": { + "axios": "^0.21.1", + "body-parser": "^1.20.1", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "lodash": "^4.17.21", + "probot": "^12.3.0", + "probot-metadata": "^2.1.0" + }, + "devDependencies": { + "@types/body-parser": "^1.19.2", + "@types/jest": "27.5.2", + "@types/lodash": "^4.14.191", + "@types/node": "^18.13.0", + "jest": "27.5.1", + "nock": "^13.0.5", + "nodemon": "^2.0.18", + "smee-client": "^1.2.2", + "ts-jest": "27.1.4", + "ts-node": "^10.9.1", + "typescript": "^4.8.2" + }, + "engines": { + "node": ">= 10.13.0" + } +} diff --git a/desktop-old/build/icon.ico b/apps/github-app/public/favicon.ico similarity index 100% rename from desktop-old/build/icon.ico rename to apps/github-app/public/favicon.ico diff --git a/apps/github-app/src/app.ts b/apps/github-app/src/app.ts new file mode 100644 index 00000000000..4b8fbc29491 --- /dev/null +++ b/apps/github-app/src/app.ts @@ -0,0 +1,281 @@ +import { ApplicationFunction, Probot } from 'probot'; +import metadata from 'probot-metadata'; +import { TailchatClient } from './client'; +import { + configPath, + generateErrorBlock, + generateTopicCommentCreateContent, + generateTopicCreateContent, +} from './utils'; +import bodyParser from 'body-parser'; +import _ from 'lodash'; +import * as dotenv from 'dotenv'; // see https://github.com/motdotla/dotenv#how-do-i-use-dotenv-with-import +dotenv.config(); + +const LABEL = 'tailchat-topic'; +const TOPIC_KEY = 'tailchatTopicId'; + +if ( + !process.env.TAILCHAT_API_URL || + !process.env.TAILCHAT_APP_ID || + !process.env.TAILCHAT_APP_SECRET +) { + throw new Error( + 'Require env: TAILCHAT_API_URL, TAILCHAT_APP_ID, TAILCHAT_APP_SECRET' + ); +} + +const defaultTailchatApiUrl = process.env.TAILCHAT_API_URL; +const tailchatAppId = process.env.TAILCHAT_APP_ID; +const tailchatAppSecret = process.env.TAILCHAT_APP_SECRET; +const tailchatWebUrl = + process.env.TAILCHAT_WEB_URL || process.env.TAILCHAT_API_URL; + +export const appFn: ApplicationFunction = (app, { getRouter }) => { + app.on('issues.opened', async (ctx) => { + if (ctx.isBot) { + return; + } + + try { + const { data } = await ctx.octokit.repos.getContent( + ctx.repo({ + path: configPath, + }) + ); + + if (!(!Array.isArray(data) && 'content' in data)) { + throw new Error('config file type error'); + } + + // 是配置文件 + + const { tailchatClient, groupId, panelId } = + createTailchatContextWithConfig(data.content); + + console.log('配置信息', { tailchatClient, groupId, panelId }); + + // 发送到tailchat + const { data: topic } = await tailchatClient.call( + 'plugin:com.msgbyte.topic.create', + { + groupId, + panelId, + content: generateTopicCreateContent( + ctx.payload.issue.user.login, + ctx.payload.issue.title, + ctx.payload.issue.body ?? '', + ctx.payload.issue.html_url + ), + meta: { + tailchatHost: tailchatClient.url, + installationId: ctx.payload.installation?.id, + githubRepoOwner: ctx.payload.repository.owner.login, + githubRepoName: ctx.payload.repository.name, + githubIssueNumber: ctx.payload.issue.number, + }, + } + ); + + console.log('Tailchat Topic 创建成功', topic); + + await Promise.all([ + ctx.octokit.issues.createComment( + ctx.issue({ + body: `Thanks for opening this issue! Tailchat topic is created in ${tailchatWebUrl}/main/group/${groupId}/${panelId}!`, + }) + ), + ctx.octokit.issues.addLabels( + ctx.repo({ + issue_number: ctx.payload.issue.number, + labels: [LABEL], + }) + ), + metadata(ctx).set(TOPIC_KEY, topic._id), + ]); + + console.log('发送相关信息到 Github 完毕'); + } catch (err) { + console.error(err); + + await ctx.octokit.issues.createComment( + ctx.issue({ + body: generateErrorBlock(err), + }) + ); + } + }); + + app.on('issue_comment.created', async (ctx) => { + if (ctx.isBot) { + console.error('This comment created by Bot, Skip!'); + return; + } + // 发送到tailchat + + try { + const topicId = await metadata(ctx).get(TOPIC_KEY); + if (!topicId) { + console.error('Not found topic id, Skip!'); + return; + } + + const { data } = await ctx.octokit.repos.getContent( + ctx.repo({ + path: configPath, + }) + ); + + if (!(!Array.isArray(data) && 'content' in data)) { + throw new Error('Config file type error'); + } + + // 是配置文件 + + const { tailchatClient, groupId, panelId } = + createTailchatContextWithConfig(data.content); + + // 发送到tailchat + await tailchatClient.call('plugin:com.msgbyte.topic.createComment', { + groupId, + panelId, + topicId, + content: generateTopicCommentCreateContent( + ctx.payload.comment.user.login, + ctx.payload.comment.body ?? '', + ctx.payload.comment.html_url + ), + }); + } catch (err) { + console.error(err); + + await ctx.octokit.issues.createComment( + ctx.issue({ + body: generateErrorBlock(err), + }) + ); + } + }); + + // app.on('installation.created', async (ctx) => { + // const installationId = ctx.payload.installation.id; + // const installationTargetName = ctx.payload.installation.account.login; + // const installationTargetRepositories = ctx.payload.repositories; + + // console.log('installation.created', { + // installationId, + // installationTargetName, + // installationTargetRepositories, + // }); + // }); + + buildRouter(app, getRouter); +}; + +/** + * 从配置文件中创建上下文 + * + * 因为考虑serverless服务因此不能全局管理 + */ +function createTailchatContextWithConfig(githubRaw: string) { + const content = Buffer.from(githubRaw, 'base64').toString(); + const json = JSON.parse(content); + const tailchatHost = json['tailchatHost'] ?? defaultTailchatApiUrl; + const groupId = json['groupId']; + const panelId = json['panelId']; + + if (!groupId || !panelId) { + throw new Error('config format error'); + } + + const tailchatClient = createTailchatClient(tailchatHost); + + return { + tailchatClient, + groupId, + panelId, + }; +} + +function createTailchatClient(tailchatHost = defaultTailchatApiUrl) { + const tailchatClient = new TailchatClient( + tailchatHost, + tailchatAppId, + tailchatAppSecret + ); + + return tailchatClient; +} + +export function buildRouter( + app: Probot, + getRouter: Parameters[1]['getRouter'] +) { + if (getRouter) { + getRouter('/') + .get('/api', (_req, res) => { + res.send('Hello World! Github app api server is working!'); + }) + .get('/api/message/webhook', (_req, res) => { + res.send('Please use POST method'); + }) + .post('/api/message/webhook', bodyParser.json(), (req, res) => { + (async () => { + try { + // 根据收件箱内容向 Github Issue 创建话题 + const inboxItem = req.body ?? {}; + if (inboxItem.type !== 'plugin:com.msgbyte.topic.comment') { + // 如果不是回复消息,则跳过 + return; + } + + const newComment: any = + _.last(_.get(inboxItem, ['payload', 'comments'])) ?? {}; + const meta = _.get(inboxItem, ['payload', 'meta']) ?? {}; + if ( + !meta.installationId || + !meta.githubRepoOwner || + !meta.githubRepoName || + !meta.githubIssueNumber + ) { + console.warn('Cannot pass meta info check:', { meta }); + return; + } + if (!newComment.author || !newComment.content) { + console.warn( + 'Cannot get "newComment.author" or "newComment.content"' + ); + return; + } + + // 发送到github comment + const octokit = await app.auth(Number(meta.installationId)); + const tailchatClient = createTailchatClient(meta.tailchatHost); + const userInfo = await tailchatClient.call('user.getUserInfo', { + userId: newComment.author, + }); + + const payload = { + owner: meta.githubRepoOwner, + repo: meta.githubRepoName, + issue_number: meta.githubIssueNumber, + body: `[${_.get(userInfo, [ + 'data', + 'nickname', + ])}] 在 Tailchat 回复:\n\`\`\`\n${ + newComment.content ?? '' + }\n\`\`\``, + }; + + console.log('正在向Github Issue创建回复:', payload); + + await octokit.issues.createComment(payload); + } catch (err) { + console.error(err); + } + })(); + + res.send('Success!'); + }); + } +} diff --git a/apps/github-app/src/client.ts b/apps/github-app/src/client.ts new file mode 100644 index 00000000000..f0bc6d05aed --- /dev/null +++ b/apps/github-app/src/client.ts @@ -0,0 +1,97 @@ +import axios, { AxiosInstance } from 'axios'; +import crypto from 'crypto'; + +export class TailchatClient { + request: AxiosInstance; + jwt: string | null = null; + userId: string | null = null; + loginP: Promise; + + constructor( + public url: string, + public appId: string, + public appSecret: string + ) { + if (!url || !appId || !appSecret) { + throw new Error( + 'Require params: apiUrl, appId, appSecret. You can set it with env' + ); + } + + this.request = axios.create({ + baseURL: url, + }); + this.request.interceptors.request.use(async (val) => { + if ( + this.jwt && + ['post', 'get'].includes(String(val.method).toLowerCase()) && + !val.headers['X-Token'] + ) { + // 任何请求都尝试增加token + val.headers['X-Token'] = this.jwt; + } + + return val; + }); + this.loginP = this.login(); + } + + async login() { + try { + console.log('正在登录...'); + const { data } = await this.request.post('/api/openapi/bot/login', { + appId: this.appId, + token: this.getBotToken(), + }); + + // NOTICE: 注意,有30天过期时间,需要定期重新登录以换取新的token + // 这里先不换 + this.jwt = data.data?.jwt; + + console.log('tailchat openapp login success!'); + + // 尝试调用函数 + // this.whoami().then(console.log); + } catch (err) { + console.error(err); + throw new Error('登录失败, 请检查应用凭证'); + } + } + + async call(action: string, params = {}) { + try { + await Promise.resolve(this.loginP); + console.log('正在调用服务:', action); + const { data } = await this.request.post( + '/api/' + action.replace(/\./g, '/'), + params + ); + + return data; + } catch (err: any) { + console.error('服务调用失败:', err); + const data: string = err?.response?.data; + if (data) { + throw new Error( + JSON.stringify({ + action, + data, + }) + ); + } else { + throw err; + } + } + } + + async whoami() { + return this.call('user.whoami'); + } + + getBotToken() { + return crypto + .createHash('md5') + .update(this.appId + this.appSecret) + .digest('hex'); + } +} diff --git a/apps/github-app/src/index.ts b/apps/github-app/src/index.ts new file mode 100644 index 00000000000..15873dccc6a --- /dev/null +++ b/apps/github-app/src/index.ts @@ -0,0 +1,4 @@ +import { run } from 'probot'; +import { appFn } from './app'; + +run(appFn); diff --git a/apps/github-app/src/utils.ts b/apps/github-app/src/utils.ts new file mode 100644 index 00000000000..82bfee8266e --- /dev/null +++ b/apps/github-app/src/utils.ts @@ -0,0 +1,43 @@ +export const configPath = '.tailchat/topic.json'; + +/** + * 输入错误对象 + * 返回一个详细信息的markdown字段 + */ +export function generateErrorBlock(err: unknown) { + const detail = err instanceof Error ? err : new Error(String(err)); + const codesign = '```'; + const errorBlock = `${codesign}\n${detail.name}${detail.message}\n${detail.stack}\n${codesign}`; + + return `Tailchat occur error, please checkout your config in \`${configPath}\`! \n${errorBlock}`; +} + +/** + * 生成创建话题的内容 + */ +export function generateTopicCreateContent( + user: string, + title: string, + body: string, + url: string +) { + return `[b]${user}[/b] create Issue: +[b]Title: ${title}[/b] +[markdown]${body}[/markdown] + +Website: ${url}`; +} + +/** + * 生成创建话题的内容 + */ +export function generateTopicCommentCreateContent( + user: string, + body: string, + url: string +) { + return `[b]${user}[/b] reply Issue: +[markdown]${body}[/markdown] + +Website: ${url}`; +} diff --git a/apps/github-app/test/fixtures/issues.opened.json b/apps/github-app/test/fixtures/issues.opened.json new file mode 100644 index 00000000000..e570cd41bf3 --- /dev/null +++ b/apps/github-app/test/fixtures/issues.opened.json @@ -0,0 +1,18 @@ +{ + "action": "opened", + "issue": { + "number": 1, + "user": { + "login": "hiimbex" + } + }, + "repository": { + "name": "testing-things", + "owner": { + "login": "hiimbex" + } + }, + "installation": { + "id": 2 + } +} diff --git a/apps/github-app/test/fixtures/mock-cert.pem b/apps/github-app/test/fixtures/mock-cert.pem new file mode 100644 index 00000000000..f2f271c304d --- /dev/null +++ b/apps/github-app/test/fixtures/mock-cert.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAli7V49NdZe+XYC1pLaHM0te8kiDmZBJ1u2HJHN8GdbROB6NO +VpC3xK7NxQn6xpvZ9ux20NvcDvGle+DOptZztBH+np6h2jZQ1/kD1yG1eQvVH4th +/9oqHuIjmIfO8lIe4Hyd5Fw5xHkGqVETTGR+0c7kdZIlHmkOregUGtMYZRUi4YG+ +q0w+uFemiHpGKXbeCIAvkq7aIkisEzvPWfSyYdA6WJHpxFk7tD7D8VkzABLVRHCq +AuyqPG39BhGZcGLXx5rGK56kDBJkyTR1t3DkHpwX+JKNG5UYNwOG4LcQj1fteeta +TdkYUMjIyWbanlMYyC+dq7B5fe7el99jXQ1gXwIDAQABAoIBADKfiPOpzKLOtzzx +MbHzB0LO+75aHq7+1faayJrVxqyoYWELuB1P3NIMhknzyjdmU3t7S7WtVqkm5Twz +lBUC1q+NHUHEgRQ4GNokExpSP4SU63sdlaQTmv0cBxmkNarS6ZuMBgDy4XoLvaYX +MSUf/uukDLhg0ehFS3BteVFtdJyllhDdTenF1Nb1rAeN4egt8XLsE5NQDr1szFEG +xH5lb+8EDtzgsGpeIddWR64xP0lDIKSZWst/toYKWiwjaY9uZCfAhvYQ1RsO7L/t +sERmpYgh+rAZUh/Lr98EI8BPSPhzFcSHmtqzzejvC5zrZPHcUimz0CGA3YBiLoJX +V1OrxmECgYEAxkd8gpmVP+LEWB3lqpSvJaXcGkbzcDb9m0OPzHUAJDZtiIIf0UmO +nvL68/mzbCHSj+yFjZeG1rsrAVrOzrfDCuXjAv+JkEtEx0DIevU1u60lGnevOeky +r8Be7pmymFB9/gzQAd5ezIlTv/COgoO986a3h1yfhzrrzbqSiivw308CgYEAwecI +aZZwqH3GifR+0+Z1B48cezA5tC8LZt5yObGzUfxKTWy30d7lxe9N59t0KUVt/QL5 +qVkd7mqGzsUMyxUN2U2HVnFTWfUFMhkn/OnCnayhILs8UlCTD2Xxoy1KbQH/9FIr +xf0pbMNJLXeGfyRt/8H+BzSZKBw9opJBWE4gqfECgYBp9FdvvryHuBkt8UQCRJPX +rWsRy6pY47nf11mnazpZH5Cmqspv3zvMapF6AIxFk0leyYiQolFWvAv+HFV5F6+t +Si1mM8GCDwbA5zh6pEBDewHhw+UqMBh63HSeUhmi1RiOwrAA36CO8i+D2Pt+eQHv +ir52IiPJcs4BUNrv5Q1BdwKBgBHgVNw3LGe8QMOTMOYkRwHNZdjNl2RPOgPf2jQL +d/bFBayhq0jD/fcDmvEXQFxVtFAxKAc+2g2S8J67d/R5Gm/AQAvuIrsWZcY6n38n +pfOXaLt1x5fnKcevpFlg4Y2vM4O416RHNLx8PJDehh3Oo/2CSwMrDDuwbtZAGZok +icphAoGBAI74Tisfn+aeCZMrO8KxaWS5r2CD1KVzddEMRKlJvSKTY+dOCtJ+XKj1 +OsZdcDvDC5GtgcywHsYeOWHldgDWY1S8Z/PUo4eK9qBXYBXp3JEZQ1dqzFdz+Txi +rBn2WsFLsxV9j2/ugm0PqWVBcU2bPUCwvaRu3SOms2teaLwGCkhr +-----END RSA PRIVATE KEY----- diff --git a/apps/github-app/test/index.test.ts b/apps/github-app/test/index.test.ts new file mode 100644 index 00000000000..44d962de911 --- /dev/null +++ b/apps/github-app/test/index.test.ts @@ -0,0 +1,74 @@ +// You can import your modules +// import index from '../src/index' + +import nock from 'nock'; +// Requiring our app implementation +import myProbotApp from '../src'; +import { Probot, ProbotOctokit } from 'probot'; +// Requiring our fixtures +import payload from './fixtures/issues.opened.json'; +const issueCreatedBody = { body: 'Thanks for opening this issue!' }; +const fs = require('fs'); +const path = require('path'); + +const privateKey = fs.readFileSync( + path.join(__dirname, 'fixtures/mock-cert.pem'), + 'utf-8' +); + +describe('My Probot app', () => { + let probot: any; + + beforeEach(() => { + nock.disableNetConnect(); + probot = new Probot({ + appId: 123, + privateKey, + // disable request throttling and retries for testing + Octokit: ProbotOctokit.defaults({ + retry: { enabled: false }, + throttle: { enabled: false }, + }), + }); + // Load our app into probot + probot.load(myProbotApp); + }); + + test('creates a comment when an issue is opened', async () => { + const mock = nock('https://api.github.com/') + // Test that we correctly return a test token + .post('/app/installations/2/access_tokens') + .reply(200, { + token: 'test', + permissions: { + issues: 'write', + }, + }) + + // Test that a comment is posted + .post('/repos/hiimbex/testing-things/issues/1/comments', (body: any) => { + expect(body).toMatchObject(issueCreatedBody); + return true; + }) + .reply(200); + + // Receive a webhook event + await probot.receive({ name: 'issues', payload }); + + expect(mock.pendingMocks()).toStrictEqual([]); + }); + + afterEach(() => { + nock.cleanAll(); + nock.enableNetConnect(); + }); +}); + +// For more information about testing with Jest see: +// https://facebook.github.io/jest/ + +// For more information about using TypeScript in your tests, Jest recommends: +// https://github.com/kulshekhar/ts-jest + +// For more information about testing with Nock see: +// https://github.com/nock/nock diff --git a/apps/github-app/tsconfig.json b/apps/github-app/tsconfig.json new file mode 100644 index 00000000000..a39a6f53627 --- /dev/null +++ b/apps/github-app/tsconfig.json @@ -0,0 +1,74 @@ +{ + "compilerOptions": { + /* Basic Options */ + "incremental": true /* Enable incremental compilation */, + "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + "lib": [ + "es2015", + "es2017" + ] /* Specify library files to be included in the compilation. */, + "allowJs": true /* Allow javascript files to be compiled. */, + "checkJs": true /* Report errors in .js files. */, + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./lib" /* Redirect output structure to the directory. */, + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./" /* Specify file to store incremental compilation information */, + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + "noUnusedLocals": true /* Report errors on unused locals. */, + "noUnusedParameters": true /* Report errors on unused parameters. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, + + /* Module Resolution Options */ + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + // "baseUrl": "./src" /* Base directory to resolve non-absolute module names. */, + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just type checking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "resolveJsonModule": true, + "pretty": false, + "skipLibCheck": true + }, + "include": ["src/"], + "compileOnSave": false +} diff --git a/apps/github-app/vercel.json b/apps/github-app/vercel.json new file mode 100644 index 00000000000..86eef0761cd --- /dev/null +++ b/apps/github-app/vercel.json @@ -0,0 +1,6 @@ +{ + "rewrites": [ + { "source": "/api/(.*)", "destination": "/api" }, + { "source": "/api/github/webhooks", "destination": "/api/github/webhooks" } + ] +} diff --git a/apps/oauth-demo/app.html b/apps/oauth-demo/app.html new file mode 100644 index 00000000000..1e9490c7a6d --- /dev/null +++ b/apps/oauth-demo/app.html @@ -0,0 +1,11 @@ + + + + + + OAuth Demo + + + 登录 + + diff --git a/apps/oauth-demo/index.ts b/apps/oauth-demo/index.ts new file mode 100644 index 00000000000..5dda67146d4 --- /dev/null +++ b/apps/oauth-demo/index.ts @@ -0,0 +1,63 @@ +import express from 'express'; +import path from 'path'; +import fs from 'fs-extra'; +import { OAuthClient } from 'tailchat-server-sdk'; +const app = express(); +const port = 8080; + +const API = process.env.API || 'http://localhost:11001/'; +const clientUrl = `http://localhost:${port}`; +const clientId = process.env.ID; +const clientSecret = process.env.SECRET; + +if (!clientId || !clientSecret) { + throw new Error('环境变量缺失, 请设置环境变量 ID 和 SECRET'); +} + +console.log('config:', { + API, + clientUrl, + clientId, +}); + +const tailchatClient = new OAuthClient(API, clientId, clientSecret); + +app.get('/', async (req, res) => { + let html = ( + await fs.readFile(path.resolve(__dirname, './app.html')) + ).toString(); + html = html + .replace('', API) + .replace('', clientId) + .replace('', clientUrl); + + res.send(html); +}); + +app.get('/cb', async (req, res, next) => { + try { + const { code, state } = req.query; + + console.log('code', code); + + // 根据获取到的code获取授权码 + const { access_token } = await tailchatClient.getToken( + String(code), + `${clientUrl}/cb` + ); + + console.log('access_token', access_token); + + const { data: userInfo } = await tailchatClient.getUserInfo(access_token); + + res.json({ userInfo }); + } catch (err: any) { + console.error(err.response.data); + next(err); + } +}); + +app.listen(port, () => { + console.log(`请确保回调已经被注册在OIDC服务端的白名单中: ${clientUrl}/cb`); + console.log(`测试服务地址: http://127.0.0.1:${port}`); +}); diff --git a/apps/oauth-demo/package.json b/apps/oauth-demo/package.json new file mode 100644 index 00000000000..dbf28392eeb --- /dev/null +++ b/apps/oauth-demo/package.json @@ -0,0 +1,25 @@ +{ + "name": "oauth-demo", + "version": "1.0.0", + "private": true, + "description": "", + "main": "index.js", + "scripts": { + "start": "ts-node ./index.ts", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "moonrailgun ", + "license": "MIT", + "dependencies": { + "express": "^4.18.2", + "fs-extra": "^11.1.0", + "tailchat-server-sdk": "workspace:^" + }, + "devDependencies": { + "@types/express": "^4.17.15", + "@types/fs-extra": "^9.0.13", + "@types/node": "^18.13.0", + "ts-node": "^10.9.1", + "typescript": "^4.9.5" + } +} diff --git a/apps/oauth-demo/tsconfig.json b/apps/oauth-demo/tsconfig.json new file mode 100644 index 00000000000..40134578b66 --- /dev/null +++ b/apps/oauth-demo/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "isolatedModules": true, + "strict": true, + "importsNotUsedAsValues": "error", + "experimentalDecorators": true, + } +} diff --git a/widget/.gitignore b/apps/widget/.gitignore similarity index 100% rename from widget/.gitignore rename to apps/widget/.gitignore diff --git a/widget/.yarnrc b/apps/widget/.yarnrc similarity index 100% rename from widget/.yarnrc rename to apps/widget/.yarnrc diff --git a/widget/demo/.gitignore b/apps/widget/demo/.gitignore similarity index 100% rename from widget/demo/.gitignore rename to apps/widget/demo/.gitignore diff --git a/apps/widget/demo/index.html b/apps/widget/demo/index.html new file mode 100644 index 00000000000..bc02ab6fc0f --- /dev/null +++ b/apps/widget/demo/index.html @@ -0,0 +1,22 @@ + + + + + + + + Tailchat Widget Demo + + + + + + + diff --git a/widget/demo/package.json b/apps/widget/demo/package.json similarity index 100% rename from widget/demo/package.json rename to apps/widget/demo/package.json diff --git a/widget/demo/yarn.lock b/apps/widget/demo/yarn.lock similarity index 100% rename from widget/demo/yarn.lock rename to apps/widget/demo/yarn.lock diff --git a/apps/widget/package.json b/apps/widget/package.json new file mode 100644 index 00000000000..c02d5413933 --- /dev/null +++ b/apps/widget/package.json @@ -0,0 +1,20 @@ +{ + "name": "tailchat-widget", + "version": "0.0.8", + "main": "lib/index.js", + "repository": "https://github.com/msgbyte/tailchat.git", + "author": "moonrailgun ", + "license": "MIT", + "files": [ + "lib/index.js", + "lib/index.d.ts" + ], + "scripts": { + "watch": "tsc --watch", + "build": "tsc", + "release": "yarn publish --patch" + }, + "devDependencies": { + "typescript": "^4.8.2" + } +} diff --git a/apps/widget/src/index.ts b/apps/widget/src/index.ts new file mode 100644 index 00000000000..6bb182e1456 --- /dev/null +++ b/apps/widget/src/index.ts @@ -0,0 +1,136 @@ +export interface TailchatWidgetOptions { + /** + * @default https://nightly.paw.msgbyte.com/ + */ + host?: string; + groupId: string; + panelId: string; + widgetStyle?: Partial; + iconStyle?: Partial; + frameStyle?: Partial; +} + +const defaultTailchatWidgetOptions: Partial = { + host: 'https://nightly.paw.msgbyte.com/', +}; + +const defaultWidgetStyle: Partial = { + position: 'absolute', + right: '20px', + bottom: '20px', +}; + +const iconContainerSize = 48; +const defaultIconContainerStyle: Partial = { + width: `${iconContainerSize}px`, + height: `${iconContainerSize}px`, + boxShadow: '0 1px 4px rgba(0, 0, 0, 0.2)', + borderRadius: '50%', + cursor: 'pointer', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', +}; + +const defaultFrameStyle: Partial = { + width: '414px', + height: '736px', + border: '0', + borderRadius: '3px', + boxShadow: '0 1px 4px rgba(0, 0, 0, 0.2)', +}; + +const iconSize = 32; +const iconSvg = ``; +const closeIconSvg = ``; + +/** + * 创建聊天小部件 + */ +export function createTailchatWidget(_options: TailchatWidgetOptions) { + const options = { ...defaultTailchatWidgetOptions, ..._options }; + + const url = `${options.host}/panel/group/${options.groupId}/${options.panelId}`; + + // 容器 + const container = document.createElement('div'); + applyStyle(container, { + ...defaultWidgetStyle, + ..._options.widgetStyle, + }); + + // 图标 + const iconContainer = document.createElement('div'); + applyStyle(iconContainer, { + ...defaultIconContainerStyle, + ..._options.iconStyle, + }); + iconContainer.innerHTML = iconSvg; + container.appendChild(iconContainer); + + // Iframe 容器 + let frameContainer: HTMLDivElement | null = null; + iconContainer.addEventListener('click', () => { + // 展开iframe + if (!frameContainer) { + // 元素不存在 + + // 容器 + const _frameContainer = document.createElement('div'); + frameContainer = _frameContainer; + + // Iframe + const frameEl = document.createElement('iframe'); + frameEl.src = url; + applyStyle(frameEl, { + ...defaultFrameStyle, + ..._options.frameStyle, + }); + + // closeBtn + const closeBtnEl = document.createElement('div'); + closeBtnEl.innerHTML = closeIconSvg; + applyStyle(closeBtnEl, { + position: 'absolute', + right: '0', + top: `-${iconSize}px`, + backgroundColor: 'white', + cursor: 'pointer', + boxShadow: '0px -1px 4px rgba(0, 0, 0, 0.2)', + borderRadius: '50% 50% 0 0', + }); + closeBtnEl.addEventListener('click', () => { + // 关闭操作 + iconContainer.style.display = 'flex'; + if (frameContainer) { + frameContainer.style.display = 'none'; + } + }); + + _frameContainer.appendChild(frameEl); + _frameContainer.appendChild(closeBtnEl); + container.appendChild(_frameContainer); + } else { + // 已创建 + frameContainer.style.display = 'block'; + } + + iconContainer.style.display = 'none'; + }); + + document.body.appendChild(container); +} + +/** + * 应用样式到元素 + * @param el 元素 + * @param styles 样式 + */ +function applyStyle(el: HTMLElement, styles: Partial) { + for (const key in styles) { + const val = styles[key]; + if (typeof val === 'string') { + el.style[key] = val; + } + } +} diff --git a/apps/widget/tsconfig.json b/apps/widget/tsconfig.json new file mode 100644 index 00000000000..9866ad9edfd --- /dev/null +++ b/apps/widget/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "ES5", + "declaration": true, + "lib": ["DOM", "ESNext"], + "rootDir": "./src", + "outDir": "lib" + } +} diff --git a/client/.dockerignore b/client/.dockerignore new file mode 100644 index 00000000000..3c3629e647f --- /dev/null +++ b/client/.dockerignore @@ -0,0 +1 @@ +node_modules diff --git a/.gitattributes b/client/.gitattributes similarity index 100% rename from .gitattributes rename to client/.gitattributes diff --git a/.github/workflows/playwright.yml b/client/.github/workflows/playwright.yml similarity index 100% rename from .github/workflows/playwright.yml rename to client/.github/workflows/playwright.yml diff --git a/client/.husky/commit-msg b/client/.husky/commit-msg new file mode 100755 index 00000000000..0bd658f4962 --- /dev/null +++ b/client/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit "$1" diff --git a/client/.husky/pre-commit b/client/.husky/pre-commit new file mode 100755 index 00000000000..fab6428a1a7 --- /dev/null +++ b/client/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +pnpm lint-staged diff --git a/client/.npmrc b/client/.npmrc new file mode 100644 index 00000000000..278230a25c5 --- /dev/null +++ b/client/.npmrc @@ -0,0 +1,6 @@ +# https://npmmirror.com/ +registry = https://registry.npmmirror.com +public-hoist-pattern[] = react +public-hoist-pattern[] = @types/react +# For docker: https://pnpm.io/npmrc#unsafe-perm +unsafe-perm = true diff --git a/build/config/i18next-scanner.config.js b/client/build/config/i18next-scanner.config.js similarity index 100% rename from build/config/i18next-scanner.config.js rename to client/build/config/i18next-scanner.config.js diff --git a/build/script/buildPublicTranslation.js b/client/build/script/buildPublicTranslation.js similarity index 100% rename from build/script/buildPublicTranslation.js rename to client/build/script/buildPublicTranslation.js diff --git a/build/script/scanTranslation.js b/client/build/script/scanTranslation.js similarity index 100% rename from build/script/scanTranslation.js rename to client/build/script/scanTranslation.js diff --git a/desktop-old/.gitignore b/client/desktop-old/.gitignore similarity index 100% rename from desktop-old/.gitignore rename to client/desktop-old/.gitignore diff --git a/packages/meta-form/.npmrc b/client/desktop-old/.npmrc similarity index 100% rename from packages/meta-form/.npmrc rename to client/desktop-old/.npmrc diff --git a/desktop-old/build/icon.icns b/client/desktop-old/build/icon.icns similarity index 100% rename from desktop-old/build/icon.icns rename to client/desktop-old/build/icon.icns diff --git a/desktop/assets/icon.ico b/client/desktop-old/build/icon.ico similarity index 100% rename from desktop/assets/icon.ico rename to client/desktop-old/build/icon.ico diff --git a/desktop-old/forge.config.js b/client/desktop-old/forge.config.js similarity index 100% rename from desktop-old/forge.config.js rename to client/desktop-old/forge.config.js diff --git a/desktop-old/package.json b/client/desktop-old/package.json similarity index 100% rename from desktop-old/package.json rename to client/desktop-old/package.json diff --git a/desktop-old/scripts/update.ts b/client/desktop-old/scripts/update.ts similarity index 100% rename from desktop-old/scripts/update.ts rename to client/desktop-old/scripts/update.ts diff --git a/desktop-old/src/lib/electron-update-notifier.ts b/client/desktop-old/src/lib/electron-update-notifier.ts similarity index 100% rename from desktop-old/src/lib/electron-update-notifier.ts rename to client/desktop-old/src/lib/electron-update-notifier.ts diff --git a/desktop-old/src/lib/update-electron-app.ts b/client/desktop-old/src/lib/update-electron-app.ts similarity index 100% rename from desktop-old/src/lib/update-electron-app.ts rename to client/desktop-old/src/lib/update-electron-app.ts diff --git a/desktop-old/src/main/config.ts b/client/desktop-old/src/main/config.ts similarity index 100% rename from desktop-old/src/main/config.ts rename to client/desktop-old/src/main/config.ts diff --git a/desktop-old/src/main/index.ts b/client/desktop-old/src/main/index.ts similarity index 100% rename from desktop-old/src/main/index.ts rename to client/desktop-old/src/main/index.ts diff --git a/desktop-old/src/main/menu.ts b/client/desktop-old/src/main/menu.ts similarity index 100% rename from desktop-old/src/main/menu.ts rename to client/desktop-old/src/main/menu.ts diff --git a/desktop-old/src/main/update.ts b/client/desktop-old/src/main/update.ts similarity index 100% rename from desktop-old/src/main/update.ts rename to client/desktop-old/src/main/update.ts diff --git a/desktop-old/tsconfig.json b/client/desktop-old/tsconfig.json similarity index 100% rename from desktop-old/tsconfig.json rename to client/desktop-old/tsconfig.json diff --git a/desktop-old/yarn.lock b/client/desktop-old/yarn.lock similarity index 100% rename from desktop-old/yarn.lock rename to client/desktop-old/yarn.lock diff --git a/desktop/.editorconfig b/client/desktop/.editorconfig similarity index 100% rename from desktop/.editorconfig rename to client/desktop/.editorconfig diff --git a/desktop/.erb/configs/.eslintrc b/client/desktop/.erb/configs/.eslintrc similarity index 100% rename from desktop/.erb/configs/.eslintrc rename to client/desktop/.erb/configs/.eslintrc diff --git a/client/desktop/.erb/configs/webpack.config.base.ts b/client/desktop/.erb/configs/webpack.config.base.ts new file mode 100644 index 00000000000..da2ab9fd798 --- /dev/null +++ b/client/desktop/.erb/configs/webpack.config.base.ts @@ -0,0 +1,68 @@ +/** + * Base webpack config used across other specific configs + */ + +import webpack from 'webpack'; +import TsconfigPathsPlugins from 'tsconfig-paths-webpack-plugin'; +import webpackPaths from './webpack.paths'; +import { dependencies as externals } from '../../release/app/package.json'; + +const configuration: webpack.Configuration = { + externals: [...Object.keys(externals || {})], + + stats: 'errors-only', + + module: { + rules: [ + { + test: /\.[jt]sx?$/, + exclude: /node_modules/, + use: { + loader: 'ts-loader', + options: { + // Remove this line to enable type checking in webpack builds + transpileOnly: true, + compilerOptions: { + module: 'esnext', + }, + }, + }, + }, + { + test: /\.html$/, + use: { + loader: 'url-loader', + options: { + limit: false, + }, + }, + }, + ], + }, + + output: { + path: webpackPaths.srcPath, + // https://github.com/webpack/webpack/issues/1114 + library: { + type: 'commonjs2', + }, + }, + + /** + * Determine the array of extensions that should be used to resolve modules. + */ + resolve: { + extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'], + modules: [webpackPaths.srcPath, 'node_modules'], + // There is no need to add aliases here, the paths in tsconfig get mirrored + plugins: [new TsconfigPathsPlugins()], + }, + + plugins: [ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + }), + ], +}; + +export default configuration; diff --git a/desktop/.erb/configs/webpack.config.main.prod.ts b/client/desktop/.erb/configs/webpack.config.main.prod.ts similarity index 91% rename from desktop/.erb/configs/webpack.config.main.prod.ts rename to client/desktop/.erb/configs/webpack.config.main.prod.ts index 3ed351f1c90..472748219f7 100644 --- a/desktop/.erb/configs/webpack.config.main.prod.ts +++ b/client/desktop/.erb/configs/webpack.config.main.prod.ts @@ -15,15 +15,8 @@ import deleteSourceMaps from '../scripts/delete-source-maps'; checkNodeEnv('production'); deleteSourceMaps(); -const devtoolsConfig = - process.env.DEBUG_PROD === 'true' - ? { - devtool: 'source-map', - } - : {}; - const configuration: webpack.Configuration = { - ...devtoolsConfig, + devtool: 'source-map', mode: 'production', @@ -37,6 +30,9 @@ const configuration: webpack.Configuration = { output: { path: webpackPaths.distMainPath, filename: '[name].js', + library: { + type: 'umd', + }, }, optimization: { @@ -50,6 +46,7 @@ const configuration: webpack.Configuration = { plugins: [ new BundleAnalyzerPlugin({ analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', + analyzerPort: 8888, }), /** @@ -66,6 +63,10 @@ const configuration: webpack.Configuration = { DEBUG_PROD: false, START_MINIMIZED: false, }), + + new webpack.DefinePlugin({ + 'process.type': '"browser"', + }), ], /** diff --git a/desktop/.erb/configs/webpack.config.preload.dev.ts b/client/desktop/.erb/configs/webpack.config.preload.dev.ts similarity index 97% rename from desktop/.erb/configs/webpack.config.preload.dev.ts rename to client/desktop/.erb/configs/webpack.config.preload.dev.ts index 061db530d42..d6679e63e40 100644 --- a/desktop/.erb/configs/webpack.config.preload.dev.ts +++ b/client/desktop/.erb/configs/webpack.config.preload.dev.ts @@ -24,6 +24,9 @@ const configuration: webpack.Configuration = { output: { path: webpackPaths.dllPath, filename: 'preload.js', + library: { + type: 'umd', + }, }, plugins: [ diff --git a/client/desktop/.erb/configs/webpack.config.renderer.dev.dll.ts b/client/desktop/.erb/configs/webpack.config.renderer.dev.dll.ts new file mode 100644 index 00000000000..614b90f0475 --- /dev/null +++ b/client/desktop/.erb/configs/webpack.config.renderer.dev.dll.ts @@ -0,0 +1,77 @@ +/** + * Builds the DLL for development electron renderer process + */ + +import webpack from 'webpack'; +import path from 'path'; +import { merge } from 'webpack-merge'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import { dependencies } from '../../package.json'; +import checkNodeEnv from '../scripts/check-node-env'; + +checkNodeEnv('development'); + +const dist = webpackPaths.dllPath; + +const configuration: webpack.Configuration = { + context: webpackPaths.rootPath, + + devtool: 'eval', + + mode: 'development', + + target: 'electron-renderer', + + externals: ['fsevents', 'crypto-browserify'], + + /** + * Use `module` from `webpack.config.renderer.dev.js` + */ + module: require('./webpack.config.renderer.dev').default.module, + + entry: { + renderer: Object.keys(dependencies || {}), + }, + + output: { + path: dist, + filename: '[name].dev.dll.js', + library: { + name: 'renderer', + type: 'var', + }, + }, + + plugins: [ + new webpack.DllPlugin({ + path: path.join(dist, '[name].json'), + name: '[name]', + }), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + options: { + context: webpackPaths.srcPath, + output: { + path: webpackPaths.dllPath, + }, + }, + }), + ], +}; + +export default merge(baseConfig, configuration); diff --git a/client/desktop/.erb/configs/webpack.config.renderer.dev.ts b/client/desktop/.erb/configs/webpack.config.renderer.dev.ts new file mode 100644 index 00000000000..28a62fef0e5 --- /dev/null +++ b/client/desktop/.erb/configs/webpack.config.renderer.dev.ts @@ -0,0 +1,213 @@ +import 'webpack-dev-server'; +import path from 'path'; +import fs from 'fs'; +import webpack from 'webpack'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import chalk from 'chalk'; +import { merge } from 'webpack-merge'; +import { execSync, spawn } from 'child_process'; +import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; + +// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's +// at the dev webpack config is not accidentally run in a production environment +if (process.env.NODE_ENV === 'production') { + checkNodeEnv('development'); +} + +const port = process.env.PORT || 1212; +const manifest = path.resolve(webpackPaths.dllPath, 'renderer.json'); +const skipDLLs = + module.parent?.filename.includes('webpack.config.renderer.dev.dll') || + module.parent?.filename.includes('webpack.config.eslint'); + +/** + * Warn if the DLL is not built + */ +if ( + !skipDLLs && + !(fs.existsSync(webpackPaths.dllPath) && fs.existsSync(manifest)) +) { + console.log( + chalk.black.bgYellow.bold( + 'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"' + ) + ); + execSync('npm run postinstall'); +} + +const configuration: webpack.Configuration = { + devtool: 'inline-source-map', + + mode: 'development', + + target: ['web', 'electron-renderer'], + + entry: [ + `webpack-dev-server/client?http://localhost:${port}/dist`, + 'webpack/hot/only-dev-server', + path.join(webpackPaths.srcRendererPath, 'index.tsx'), + ], + + output: { + path: webpackPaths.distRendererPath, + publicPath: '/', + filename: 'renderer.dev.js', + library: { + type: 'umd', + }, + }, + + module: { + rules: [ + { + test: /\.s?(c|a)ss$/, + use: [ + 'style-loader', + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + }, + }, + 'sass-loader', + ], + include: /\.module\.s?(c|a)ss$/, + }, + { + test: /\.s?css$/, + use: ['style-loader', 'css-loader', 'sass-loader'], + exclude: /\.module\.s?(c|a)ss$/, + }, + // Fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + }, + // Images + { + test: /\.(png|jpg|jpeg|gif)$/i, + type: 'asset/resource', + }, + // SVG + { + test: /\.svg$/, + use: [ + { + loader: '@svgr/webpack', + options: { + prettier: false, + svgo: false, + svgoConfig: { + plugins: [{ removeViewBox: false }], + }, + titleProp: true, + ref: true, + }, + }, + 'file-loader', + ], + }, + ], + }, + plugins: [ + ...(skipDLLs + ? [] + : [ + new webpack.DllReferencePlugin({ + context: webpackPaths.dllPath, + manifest: require(manifest), + sourceType: 'var', + }), + ]), + + new webpack.NoEmitOnErrorsPlugin(), + + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + * + * By default, use 'development' as NODE_ENV. This can be overriden with + * 'staging', for example, by changing the ENV variables in the npm scripts + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', + }), + + new webpack.LoaderOptionsPlugin({ + debug: true, + }), + + new ReactRefreshWebpackPlugin(), + + new HtmlWebpackPlugin({ + filename: path.join('index.html'), + template: path.join(webpackPaths.srcRendererPath, 'index.ejs'), + minify: { + collapseWhitespace: true, + removeAttributeQuotes: true, + removeComments: true, + }, + isBrowser: false, + env: process.env.NODE_ENV, + isDevelopment: process.env.NODE_ENV !== 'production', + nodeModules: webpackPaths.appNodeModulesPath, + }), + ], + + node: { + __dirname: false, + __filename: false, + }, + + devServer: { + port, + compress: true, + hot: true, + headers: { 'Access-Control-Allow-Origin': '*' }, + static: { + publicPath: '/', + }, + historyApiFallback: { + verbose: true, + }, + setupMiddlewares(middlewares) { + console.log('Starting preload.js builder...'); + const preloadProcess = spawn('npm', ['run', 'start:preload'], { + shell: true, + stdio: 'inherit', + }) + .on('close', (code: number) => process.exit(code!)) + .on('error', (spawnError) => console.error(spawnError)); + + console.log('Starting Main Process...'); + let args = ['run', 'start:main']; + if (process.env.MAIN_ARGS) { + args = args.concat( + ['--', ...process.env.MAIN_ARGS.matchAll(/"[^"]+"|[^\s"]+/g)].flat() + ); + } + spawn('npm', args, { + shell: true, + stdio: 'inherit', + }) + .on('close', (code: number) => { + preloadProcess.kill(); + process.exit(code!); + }) + .on('error', (spawnError) => console.error(spawnError)); + return middlewares; + }, + }, +}; + +export default merge(baseConfig, configuration); diff --git a/client/desktop/.erb/configs/webpack.config.renderer.prod.ts b/client/desktop/.erb/configs/webpack.config.renderer.prod.ts new file mode 100644 index 00000000000..3cebf30d449 --- /dev/null +++ b/client/desktop/.erb/configs/webpack.config.renderer.prod.ts @@ -0,0 +1,141 @@ +/** + * Build config for electron renderer process + */ + +import path from 'path'; +import webpack from 'webpack'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; +import { merge } from 'webpack-merge'; +import TerserPlugin from 'terser-webpack-plugin'; +import baseConfig from './webpack.config.base'; +import webpackPaths from './webpack.paths'; +import checkNodeEnv from '../scripts/check-node-env'; +import deleteSourceMaps from '../scripts/delete-source-maps'; + +checkNodeEnv('production'); +deleteSourceMaps(); + +const configuration: webpack.Configuration = { + devtool: 'source-map', + + mode: 'production', + + target: ['web', 'electron-renderer'], + + entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')], + + output: { + path: webpackPaths.distRendererPath, + publicPath: './', + filename: 'renderer.js', + library: { + type: 'umd', + }, + }, + + module: { + rules: [ + { + test: /\.s?(a|c)ss$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + }, + }, + 'sass-loader', + ], + include: /\.module\.s?(c|a)ss$/, + }, + { + test: /\.s?(a|c)ss$/, + use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'], + exclude: /\.module\.s?(c|a)ss$/, + }, + // Fonts + { + test: /\.(woff|woff2|eot|ttf|otf)$/i, + type: 'asset/resource', + }, + // Images + { + test: /\.(png|jpg|jpeg|gif)$/i, + type: 'asset/resource', + }, + // SVG + { + test: /\.svg$/, + use: [ + { + loader: '@svgr/webpack', + options: { + prettier: false, + svgo: false, + svgoConfig: { + plugins: [{ removeViewBox: false }], + }, + titleProp: true, + ref: true, + }, + }, + 'file-loader', + ], + }, + ], + }, + + optimization: { + minimize: true, + minimizer: [new TerserPlugin(), new CssMinimizerPlugin()], + }, + + plugins: [ + /** + * Create global constants which can be configured at compile time. + * + * Useful for allowing different behaviour between development builds and + * release builds + * + * NODE_ENV should be production so that modules do not perform certain + * development checks + */ + new webpack.EnvironmentPlugin({ + NODE_ENV: 'production', + DEBUG_PROD: false, + }), + + new MiniCssExtractPlugin({ + filename: 'style.css', + }), + + new BundleAnalyzerPlugin({ + analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled', + analyzerPort: 8889, + }), + + new HtmlWebpackPlugin({ + filename: 'index.html', + template: path.join(webpackPaths.srcRendererPath, 'index.ejs'), + minify: { + collapseWhitespace: true, + removeAttributeQuotes: true, + removeComments: true, + }, + isBrowser: false, + isDevelopment: false, + }), + + new webpack.DefinePlugin({ + 'process.type': '"renderer"', + }), + ], +}; + +export default merge(baseConfig, configuration); diff --git a/desktop/.erb/configs/webpack.paths.ts b/client/desktop/.erb/configs/webpack.paths.ts similarity index 86% rename from desktop/.erb/configs/webpack.paths.ts rename to client/desktop/.erb/configs/webpack.paths.ts index 7863defdbca..e5ba573435f 100644 --- a/desktop/.erb/configs/webpack.paths.ts +++ b/client/desktop/.erb/configs/webpack.paths.ts @@ -7,7 +7,6 @@ const dllPath = path.join(__dirname, '../dll'); const srcPath = path.join(rootPath, 'src'); const srcMainPath = path.join(srcPath, 'main'); const srcRendererPath = path.join(srcPath, 'renderer'); -const srcPublicPath = path.join(rootPath, '../app/public'); const releasePath = path.join(rootPath, 'release'); const appPath = path.join(releasePath, 'app'); @@ -18,7 +17,6 @@ const srcNodeModulesPath = path.join(srcPath, 'node_modules'); const distPath = path.join(appPath, 'dist'); const distMainPath = path.join(distPath, 'main'); const distRendererPath = path.join(distPath, 'renderer'); -const distPublicPath = path.join(distRendererPath, 'public'); const buildPath = path.join(releasePath, 'build'); @@ -37,6 +35,4 @@ export default { distMainPath, distRendererPath, buildPath, - srcPublicPath, - distPublicPath, }; diff --git a/desktop/.erb/img/erb-banner.svg b/client/desktop/.erb/img/erb-banner.svg similarity index 100% rename from desktop/.erb/img/erb-banner.svg rename to client/desktop/.erb/img/erb-banner.svg diff --git a/desktop/.erb/img/erb-logo.png b/client/desktop/.erb/img/erb-logo.png similarity index 100% rename from desktop/.erb/img/erb-logo.png rename to client/desktop/.erb/img/erb-logo.png diff --git a/desktop/.erb/mocks/fileMock.js b/client/desktop/.erb/mocks/fileMock.js similarity index 100% rename from desktop/.erb/mocks/fileMock.js rename to client/desktop/.erb/mocks/fileMock.js diff --git a/desktop/.erb/scripts/.eslintrc b/client/desktop/.erb/scripts/.eslintrc similarity index 100% rename from desktop/.erb/scripts/.eslintrc rename to client/desktop/.erb/scripts/.eslintrc diff --git a/desktop/.erb/scripts/check-build-exists.ts b/client/desktop/.erb/scripts/check-build-exists.ts similarity index 100% rename from desktop/.erb/scripts/check-build-exists.ts rename to client/desktop/.erb/scripts/check-build-exists.ts diff --git a/desktop/.erb/scripts/check-native-dep.js b/client/desktop/.erb/scripts/check-native-dep.js similarity index 100% rename from desktop/.erb/scripts/check-native-dep.js rename to client/desktop/.erb/scripts/check-native-dep.js diff --git a/desktop/.erb/scripts/check-node-env.js b/client/desktop/.erb/scripts/check-node-env.js similarity index 100% rename from desktop/.erb/scripts/check-node-env.js rename to client/desktop/.erb/scripts/check-node-env.js diff --git a/desktop/.erb/scripts/check-port-in-use.js b/client/desktop/.erb/scripts/check-port-in-use.js similarity index 100% rename from desktop/.erb/scripts/check-port-in-use.js rename to client/desktop/.erb/scripts/check-port-in-use.js diff --git a/desktop/.erb/scripts/clean.js b/client/desktop/.erb/scripts/clean.js similarity index 100% rename from desktop/.erb/scripts/clean.js rename to client/desktop/.erb/scripts/clean.js diff --git a/desktop/.erb/scripts/delete-source-maps.js b/client/desktop/.erb/scripts/delete-source-maps.js similarity index 100% rename from desktop/.erb/scripts/delete-source-maps.js rename to client/desktop/.erb/scripts/delete-source-maps.js diff --git a/desktop/.erb/scripts/electron-rebuild.js b/client/desktop/.erb/scripts/electron-rebuild.js similarity index 100% rename from desktop/.erb/scripts/electron-rebuild.js rename to client/desktop/.erb/scripts/electron-rebuild.js diff --git a/desktop/.erb/scripts/link-modules.ts b/client/desktop/.erb/scripts/link-modules.ts similarity index 100% rename from desktop/.erb/scripts/link-modules.ts rename to client/desktop/.erb/scripts/link-modules.ts diff --git a/desktop/.erb/scripts/notarize.js b/client/desktop/.erb/scripts/notarize.js similarity index 100% rename from desktop/.erb/scripts/notarize.js rename to client/desktop/.erb/scripts/notarize.js diff --git a/desktop/.gitattributes b/client/desktop/.gitattributes similarity index 100% rename from desktop/.gitattributes rename to client/desktop/.gitattributes diff --git a/desktop/.github/workflows/publish.yml b/client/desktop/.github/workflows/publish.yml similarity index 100% rename from desktop/.github/workflows/publish.yml rename to client/desktop/.github/workflows/publish.yml diff --git a/desktop/.github/workflows/test.yml b/client/desktop/.github/workflows/test.yml similarity index 100% rename from desktop/.github/workflows/test.yml rename to client/desktop/.github/workflows/test.yml diff --git a/client/desktop/.gitignore b/client/desktop/.gitignore new file mode 100644 index 00000000000..9bf85626333 --- /dev/null +++ b/client/desktop/.gitignore @@ -0,0 +1,33 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Coverage directory used by tools like istanbul +coverage +.eslintcache + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules + +# OSX +.DS_Store + +release/app/dist +release/app/public +release/build +release/deploy +.erb/dll + +.idea +npm-debug.log.* +*.css.d.ts +*.sass.d.ts +*.scss.d.ts + +src/renderer/config/index.ts diff --git a/desktop/.npmrc b/client/desktop/.npmrc similarity index 100% rename from desktop/.npmrc rename to client/desktop/.npmrc diff --git a/desktop/.vscode/extensions.json b/client/desktop/.vscode/extensions.json similarity index 100% rename from desktop/.vscode/extensions.json rename to client/desktop/.vscode/extensions.json diff --git a/desktop/.vscode/launch.json b/client/desktop/.vscode/launch.json similarity index 100% rename from desktop/.vscode/launch.json rename to client/desktop/.vscode/launch.json diff --git a/desktop/.vscode/settings.json b/client/desktop/.vscode/settings.json similarity index 100% rename from desktop/.vscode/settings.json rename to client/desktop/.vscode/settings.json diff --git a/desktop/.vscode/tasks.json b/client/desktop/.vscode/tasks.json similarity index 100% rename from desktop/.vscode/tasks.json rename to client/desktop/.vscode/tasks.json diff --git a/desktop/LICENSE b/client/desktop/LICENSE similarity index 100% rename from desktop/LICENSE rename to client/desktop/LICENSE diff --git a/client/desktop/README.md b/client/desktop/README.md new file mode 100644 index 00000000000..c44487ab961 --- /dev/null +++ b/client/desktop/README.md @@ -0,0 +1,19 @@ +## Usage + +### Install dependency + +```bash +yarn +``` + +### dev + +```bash +yarn dev +``` + +### package + +```bash +yarn package +``` diff --git a/client/desktop/assets/add.svg b/client/desktop/assets/add.svg new file mode 100644 index 00000000000..042e4bb0c6d --- /dev/null +++ b/client/desktop/assets/add.svg @@ -0,0 +1 @@ + diff --git a/desktop/assets/assets.d.ts b/client/desktop/assets/assets.d.ts similarity index 100% rename from desktop/assets/assets.d.ts rename to client/desktop/assets/assets.d.ts diff --git a/client/desktop/assets/capturer-source-picker.html b/client/desktop/assets/capturer-source-picker.html new file mode 100644 index 00000000000..66cd673dbd8 --- /dev/null +++ b/client/desktop/assets/capturer-source-picker.html @@ -0,0 +1,138 @@ + + + + + + Capturer Picker + + + + + + diff --git a/desktop/assets/entitlements.mac.plist b/client/desktop/assets/entitlements.mac.plist similarity index 100% rename from desktop/assets/entitlements.mac.plist rename to client/desktop/assets/entitlements.mac.plist diff --git a/desktop/assets/icon.icns b/client/desktop/assets/icon.icns similarity index 100% rename from desktop/assets/icon.icns rename to client/desktop/assets/icon.icns diff --git a/client/desktop/assets/icon.ico b/client/desktop/assets/icon.ico new file mode 100644 index 00000000000..94ac22cf74e Binary files /dev/null and b/client/desktop/assets/icon.ico differ diff --git a/client/desktop/assets/icon.png b/client/desktop/assets/icon.png new file mode 100644 index 00000000000..7f0db2bfc26 Binary files /dev/null and b/client/desktop/assets/icon.png differ diff --git a/desktop/assets/icon.svg b/client/desktop/assets/icon.svg similarity index 100% rename from desktop/assets/icon.svg rename to client/desktop/assets/icon.svg diff --git a/desktop/electron-builder.yml b/client/desktop/electron-builder.yml similarity index 84% rename from desktop/electron-builder.yml rename to client/desktop/electron-builder.yml index 9adb43a1a2c..6101aea72f2 100644 --- a/desktop/electron-builder.yml +++ b/client/desktop/electron-builder.yml @@ -6,10 +6,12 @@ files: - dist - node_modules - package.json + - assets/ afterSign: .erb/scripts/notarize.js mac: target: - target: default + # Not need zip and auto update + target: dmg arch: - arm64 - x64 @@ -40,7 +42,7 @@ directories: output: release/build extraResources: - ./assets/** -publish: - provider: github - owner: msgbyte - repo: tailchat +# publish: +# provider: github +# owner: msgbyte +# repo: tailchat diff --git a/client/desktop/package.json b/client/desktop/package.json new file mode 100644 index 00000000000..013e7124f61 --- /dev/null +++ b/client/desktop/package.json @@ -0,0 +1,229 @@ +{ + "description": "A foundation for scalable desktop apps", + "private": true, + "keywords": [ + "electron", + "boilerplate", + "react", + "typescript", + "ts", + "sass", + "webpack", + "hot", + "reload" + ], + "homepage": "https://github.com/electron-react-boilerplate/electron-react-boilerplate#readme", + "bugs": { + "url": "https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/electron-react-boilerplate/electron-react-boilerplate.git" + }, + "license": "MIT", + "author": { + "name": "moonrailgun", + "email": "moonrailgun@gmail.com", + "url": "https://github.com/moonrailgun" + }, + "contributors": [ + { + "name": "Amila Welihinda", + "email": "amilajack@gmail.com", + "url": "https://github.com/amilajack" + } + ], + "main": "./src/main/main.ts", + "scripts": { + "build": "concurrently \"yarn build:main\" \"yarn build:renderer\"", + "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", + "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts", + "postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts", + "lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx", + "package": "cross-env DEBUG_PROD=true yarn package:nodebug --config.asar=false", + "package:all": "yarn package:nodebug -mwl", + "package:nodebug": "ts-node ./.erb/scripts/clean.js dist && yarn build && electron-builder build --publish never", + "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app", + "dev": "yarn start", + "start": "ts-node ./.erb/scripts/check-port-in-use.js && yarn start:renderer", + "start:main": "cross-env NODE_ENV=development electronmon -r ts-node/register/transpile-only .", + "start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts", + "start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts", + "deploy": "ts-node scripts/deploy.ts", + "http-server": "ts-node test/http-server.ts", + "test": "jest" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "cross-env NODE_ENV=development eslint --cache" + ], + "*.json,.{eslintrc,prettierrc}": [ + "prettier --ignore-path .eslintignore --parser json --write" + ], + "*.{css,scss}": [ + "prettier --ignore-path .eslintignore --single-quote --write" + ], + "*.{html,md,yml}": [ + "prettier --ignore-path .eslintignore --single-quote --write" + ] + }, + "browserslist": [], + "prettier": { + "singleQuote": true, + "overrides": [ + { + "files": [ + ".prettierrc", + ".eslintrc" + ], + "options": { + "parser": "json" + } + } + ] + }, + "jest": { + "moduleDirectories": [ + "node_modules", + "release/app/node_modules" + ], + "moduleFileExtensions": [ + "js", + "jsx", + "ts", + "tsx", + "json" + ], + "moduleNameMapper": { + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/.erb/mocks/fileMock.js", + "\\.(css|less|sass|scss)$": "identity-obj-proxy" + }, + "setupFiles": [ + "./.erb/scripts/check-build-exists.ts" + ], + "testEnvironment": "jsdom", + "testEnvironmentOptions": { + "url": "http://localhost/" + }, + "testPathIgnorePatterns": [ + "release/app/dist" + ], + "transform": { + "\\.(ts|tsx|js|jsx)$": "ts-jest" + } + }, + "dependencies": { + "antd": "^5.6.4", + "electron-debug": "^3.2.0", + "electron-is": "^3.0.0", + "electron-log": "^4.4.7", + "electron-serve": "^1.1.0", + "electron-updater": "^5.0.1", + "electron-window-state": "^5.0.3", + "express": "^4.18.1", + "get-port": "5.1.1", + "immer": "^10.0.2", + "lodash": "^4.17.21", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "source-ref-loader": "^1.0.7", + "zustand": "^4.3.8" + }, + "devDependencies": { + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.6", + "@svgr/webpack": "^6.2.1", + "@teamsupercell/typings-for-css-modules-loader": "^2.5.1", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.2.0", + "@types/gh-pages": "^3.2.1", + "@types/jest": "^27.5.1", + "@types/lodash": "^4.14.191", + "@types/node": "^17.0.42", + "@types/react": "^18.0.9", + "@types/react-dom": "^18.0.4", + "@types/react-test-renderer": "^18.0.0", + "@types/terser-webpack-plugin": "^5.0.4", + "@types/webpack-bundle-analyzer": "^4.4.1", + "@typescript-eslint/eslint-plugin": "^5.23.0", + "@typescript-eslint/parser": "^5.23.0", + "autoprefixer": "^10.4.7", + "browserslist-config-erb": "^0.0.3", + "chalk": "^4.1.2", + "concurrently": "^7.6.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.22.5", + "cross-env": "^7.0.3", + "crypto-browserify": "^3.12.0", + "css-loader": "^5.2.6", + "css-minimizer-webpack-plugin": "^3.4.1", + "detect-port": "^1.3.0", + "dotenv": "^16.0.1", + "electron": "^18.2.3", + "electron-builder": "^23.0.3", + "electron-devtools-installer": "^3.2.0", + "electron-notarize": "^1.2.1", + "electron-rebuild": "^3.2.7", + "electronmon": "^2.0.2", + "esbuild-loader": "^2.19.0", + "eslint": "^8.15.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-erb": "^4.0.3", + "eslint-import-resolver-typescript": "^2.7.1", + "eslint-import-resolver-webpack": "^0.13.2", + "eslint-plugin-compat": "^4.0.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jest": "^26.2.2", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-promise": "^6.0.0", + "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react-hooks": "^4.5.0", + "fast-glob": "^3.2.12", + "file-loader": "^6.2.0", + "gh-pages": "^5.0.0", + "html-webpack-plugin": "^5.5.0", + "https-browserify": "^1.0.0", + "identity-obj-proxy": "^3.0.0", + "jest": "27.5.1", + "jest-environment-jsdom": "27.5.1", + "less": "^4.1.3", + "less-loader": "^10.0.0", + "lint-staged": "^12.4.1", + "mini-css-extract-plugin": "^2.6.0", + "path-browserify": "^1.0.1", + "postcss-loader": "^7.0.0", + "prettier": "^2.6.2", + "react-refresh": "^0.13.0", + "react-test-renderer": "^18.1.0", + "rimraf": "^3.0.2", + "sass": "^1.51.0", + "sass-loader": "^12.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "style-loader": "^3.3.1", + "tailwindcss": "^2.2.4", + "terser-webpack-plugin": "^5.3.1", + "ts-jest": "27.1.4", + "ts-loader": "^9.3.0", + "ts-node": "^10.7.0", + "tsconfig-paths-webpack-plugin": "^4.0.1", + "typescript": "^4.6.4", + "url": "^0.11.0", + "url-loader": "^4.1.1", + "webpack": "5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.9.0", + "webpack-merge": "^5.8.0" + }, + "devEngines": { + "node": ">=14.x", + "npm": ">=7.x" + }, + "electronmon": { + "patterns": [ + "!**/**", + "src/main/**/*" + ], + "logLevel": "quiet" + } +} diff --git a/client/desktop/release/app/.npmrc b/client/desktop/release/app/.npmrc new file mode 100644 index 00000000000..59b092e2b5d --- /dev/null +++ b/client/desktop/release/app/.npmrc @@ -0,0 +1,3 @@ +# https://npmmirror.com/ +registry = https://registry.npmmirror.com +electron_mirror = https://npmmirror.com/mirrors/electron/ diff --git a/client/desktop/release/app/package.json b/client/desktop/release/app/package.json new file mode 100644 index 00000000000..1b3cd5c7c5d --- /dev/null +++ b/client/desktop/release/app/package.json @@ -0,0 +1,20 @@ +{ + "name": "tailchat-desktop", + "version": "0.1.0", + "description": "A foundation for scalable desktop apps", + "license": "MIT", + "author": { + "name": "moonrailgun", + "email": "moonrailgun@gmail.com", + "url": "https://github.com/moonrailgun" + }, + "main": "./dist/main/main.js", + "scripts": { + "electron-rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js", + "postinstall": "npm run electron-rebuild && npm run link-modules", + "link-modules": "node -r ts-node/register ../../.erb/scripts/link-modules.ts" + }, + "dependencies": { + "electron-screenshots": "^0.5.23" + } +} diff --git a/client/desktop/release/app/yarn.lock b/client/desktop/release/app/yarn.lock new file mode 100644 index 00000000000..eda6c7489a8 --- /dev/null +++ b/client/desktop/release/app/yarn.lock @@ -0,0 +1,112 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +electron-screenshots@^0.5.23: + version "0.5.23" + resolved "https://registry.npmmirror.com/electron-screenshots/-/electron-screenshots-0.5.23.tgz#4d0b8ff8dee31033faf8b8680f3ff93d88d5df47" + integrity sha512-mcBDauRdKyuUOPX64inJwbBsbmFbmszDB0qlcc5ofO1q/SugiAvagVrajcK9jl9DWJwO4tVFDgqXJDHG6U//yA== + dependencies: + debug "^4.3.4" + fs-extra "^11.1.1" + node-screenshots "^0.1.4" + react-screenshots "^0.5.22" + +fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +node-screenshots-darwin-arm64@0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots-darwin-arm64/-/node-screenshots-darwin-arm64-0.1.4.tgz#434e181156c235b7e41682de164732d2fbd8499c" + integrity sha512-PN9hy1Dd+vvRU6sol/sNBu1+XZ0VoUkZ1nWClmSjwLlwGYe2L5xNBnG1OTiiZeNCueBlyf/0k0vI5hognH/LVA== + +node-screenshots-darwin-universal@0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots-darwin-universal/-/node-screenshots-darwin-universal-0.1.4.tgz#93a9ce4b707f2e15114b75c67c89da7a030caa35" + integrity sha512-xYZrTyVI+8gWXr3mmhcvqUyv8lwWLruhNgE8ClhX+1y6rP8LKoZ5QohBuTPEtIo0oC0y0EETbBnHW/5IkRlijg== + +node-screenshots-darwin-x64@0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots-darwin-x64/-/node-screenshots-darwin-x64-0.1.4.tgz#5cff721d174d0b3b2f430c331012ad27ca852284" + integrity sha512-JDWSC7pmph7RN7SnJeXwwzKHk1anMk3cqskgT47h1t4Hu3tN1a0sKfKagglRaI9Y2IoDfBTLSZxNNwyCZag5iQ== + +node-screenshots-linux-x64-gnu@0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots-linux-x64-gnu/-/node-screenshots-linux-x64-gnu-0.1.4.tgz#77cc54ddfff941f34db61ad0aba0e3603e2e2937" + integrity sha512-oj39sWl9Xe8wGmHeUoAwLSN+0186XJrmVojOSEovBLCY2teUSHNPOq8D52z67mPv7S4bNHilj5b52jz9nl31/Q== + +node-screenshots-linux-x64-musl@0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots-linux-x64-musl/-/node-screenshots-linux-x64-musl-0.1.4.tgz#cc558db789d44a8fda7274b82f34e2ffb77c8b83" + integrity sha512-eHRC6BobZPRbyj01VIiaK84kg4plSGBSPYYSo4ObFzrFmD3dRaUgTfsACoi8th0XiNd25w6/FyAIKKGU5M8IPg== + +node-screenshots-win32-arm64-msvc@0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots-win32-arm64-msvc/-/node-screenshots-win32-arm64-msvc-0.1.4.tgz#a61c6d1f86761b24fdd379b8cd6249e2a2bda056" + integrity sha512-BgwLbAQwvnv+T0W47Dq9Pd7/IKTMRCie3ECW6aLG3jqsPhKMqXac8lyrJbaYR88lxlKWraWxREkb1sx6gQaUlA== + +node-screenshots-win32-ia32-msvc@0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots-win32-ia32-msvc/-/node-screenshots-win32-ia32-msvc-0.1.4.tgz#17809fd941fc822dcdffaa9312f95782f4f275b1" + integrity sha512-afZqWWbfZ3nChI8eeZ93J7bn5096Zq+NRutvqNZhBYLAGZd+hCWqcDumTgJ74oUMVi49Cn06isXxj+MB3RtUDQ== + +node-screenshots-win32-x64-msvc@0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots-win32-x64-msvc/-/node-screenshots-win32-x64-msvc-0.1.4.tgz#325df877896dd0533e63c90f0d8436e2c11a43e5" + integrity sha512-08mfx/6veDKrdx0KDVMqnYjZq0U4LIbezIKBIgI06Bj+S8CrgXBvTQTEu+lsL/PZMK+J9yimI2Bp77h2AqhaiQ== + +node-screenshots@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-screenshots/-/node-screenshots-0.1.4.tgz#ec6c7626aaea9afc2bd78ad379dd9feeb13cd6c8" + integrity sha512-QmbgiI0VkV3wu+Dn7Kn107/VnujdFgT3juDdaRv2GyOviVghP3+QD46IVU/IlXmzgxVFTjIiVBRrI6yovDnXiQ== + optionalDependencies: + node-screenshots-darwin-arm64 "0.1.4" + node-screenshots-darwin-universal "0.1.4" + node-screenshots-darwin-x64 "0.1.4" + node-screenshots-linux-x64-gnu "0.1.4" + node-screenshots-linux-x64-musl "0.1.4" + node-screenshots-win32-arm64-msvc "0.1.4" + node-screenshots-win32-ia32-msvc "0.1.4" + node-screenshots-win32-x64-msvc "0.1.4" + +react-screenshots@^0.5.22: + version "0.5.22" + resolved "https://registry.npmmirror.com/react-screenshots/-/react-screenshots-0.5.22.tgz#2d974189d2d2df74388a4a19482fd1c956641837" + integrity sha512-aooIlb1k6161BTqhhyADlMrlF0n1UdudjuhyvXaCQfwURXZNuUerMxFuOfwNCgSbPAHlxdHCWtYQ6iQT+RaF+w== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== diff --git a/client/desktop/scripts/deploy.ts b/client/desktop/scripts/deploy.ts new file mode 100644 index 00000000000..75b410e6ea4 --- /dev/null +++ b/client/desktop/scripts/deploy.ts @@ -0,0 +1,53 @@ +import path from 'path'; +import fs from 'fs-extra'; +import ghpages from 'gh-pages'; +import fg from 'fast-glob'; + +const outputDir = path.resolve(__dirname, '../release/build'); +const deployDir = path.resolve(__dirname, '../release/deploy'); + +async function deployToGithubPages() { + if (!(await fs.pathExists(outputDir))) { + throw new Error('outputDir does not exist'); + } + + await fs.ensureDir(deployDir); + await fs.emptyDir(deployDir); + + console.log('Selecting file...'); + const fileList = await fg(['*.zip', '*.exe'], { + cwd: outputDir, + }); + console.log(fileList.map((f) => `- ${f}`).join('\n')); + await Promise.all( + fileList.map((f) => + fs.copyFile(path.resolve(outputDir, f), path.resolve(deployDir, f)) + ) + ); + + console.log('Deploying to remote...'); + // 部署到github pages + await new Promise((resolve, reject) => { + ghpages.publish( + deployDir, + { + repo: 'git@github.com:msgbyte/tailchat-archive.git', + branch: 'gh-pages', + dest: './desktop/app', + push: true, + history: false, + }, + (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + } + ); + }); + + console.log('Completed!'); +} + +deployToGithubPages(); diff --git a/desktop/src/__tests__/App.test.tsx b/client/desktop/src/__tests__/App.test.tsx similarity index 100% rename from desktop/src/__tests__/App.test.tsx rename to client/desktop/src/__tests__/App.test.tsx diff --git a/client/desktop/src/main/inject/index.ts b/client/desktop/src/main/inject/index.ts new file mode 100644 index 00000000000..7cbc2471983 --- /dev/null +++ b/client/desktop/src/main/inject/index.ts @@ -0,0 +1,48 @@ +import { app } from 'electron'; + +/** + * 生成注入到Webview中的js代码 + */ +export function generateInstallPluginScript() { + /** + * manifest copy from: + * com.msgbyte.env.rn/manifest.json + */ + const inner = `function main() { + window.tailchat + .installPlugin({ + label: 'Electron Support', + 'label.zh-CN': 'Electron 支持', + name: 'com.msgbyte.env.electron', + url: '/plugins/com.msgbyte.env.electron/index.js', + version: '0.0.0', + author: 'moonrailgun', + description: 'Add support for Electron environment in Tailchat', + 'description.zh-CN': '在 Tailchat 添加对 Electron 环境的支持', + requireRestart: true, + }); + }`; + + const raw = `(${inner})()`; + return raw; +} + +export function generateInjectedScript(): string { + return [generateDeviceInfo()].join(';'); +} + +function getPlatform() { + if (process.platform === 'darwin') { + return 'mac'; + } else if (process.platform === 'win32') { + return 'windows'; + } else if (process.platform === 'linux') { + return 'linux'; + } else { + return process.platform; + } +} + +function generateDeviceInfo() { + return `window.__electronDeviceInfo = { version: "${app.getVersion()}", name: "${app.getName()}", platform: "${getPlatform()}" }`; +} diff --git a/client/desktop/src/main/inject/message-handler.ts b/client/desktop/src/main/inject/message-handler.ts new file mode 100644 index 00000000000..4c70982ce69 --- /dev/null +++ b/client/desktop/src/main/inject/message-handler.ts @@ -0,0 +1,30 @@ +import { generateInstallPluginScript } from '.'; +import log from 'electron-log'; +import { startScreenshots } from '../screenshots'; +import { BrowserWindow } from 'electron'; + +export function handleTailchatMessage( + type: string, + payload: any, + webview: Electron.WebContents, + win: BrowserWindow +) { + log.info('onMessage receive:', type, payload); + + if (type === 'init') { + webview.executeJavaScript(generateInstallPluginScript()); + return; + } + + if (type === 'callScreenshotsTool') { + startScreenshots(); + return; + } + + if (type === 'receiveUnmutedMessage') { + if (!win.isFocused()) { + win.flashFrame(true); + } + return; + } +} diff --git a/client/desktop/src/main/lib/electron-serve.ts b/client/desktop/src/main/lib/electron-serve.ts new file mode 100644 index 00000000000..8360a5376cc --- /dev/null +++ b/client/desktop/src/main/lib/electron-serve.ts @@ -0,0 +1,150 @@ +/** + * Fork from: https://github.com/sindresorhus/electron-serve + * + * Has some problem + */ + +import fs from 'fs'; +import path from 'path'; +import { promisify } from 'util'; +import electron, { + BrowserWindow, + ProtocolRequest, + ProtocolResponse, +} from 'electron'; +import log from 'electron-log'; +import is from 'electron-is'; + +interface Options { + /** + The directory to serve, relative to the app root directory. + */ + directory: string; + + /** + Custom scheme. For example, `foo` results in your `directory` being available at `foo://-`. + @default 'app' + */ + scheme?: string; + + /** + Whether [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) should be enabled. + Useful for testing purposes. + @default true + */ + isCorsEnabled?: boolean; + + /** + The partition the protocol should be installed to, if you're not using Electron's default partition. + @default electron.session.defaultSession + */ + partition?: string; +} + +const stat = promisify(fs.stat); + +// See https://cs.chromium.org/chromium/src/net/base/net_error_list.h +const FILE_NOT_FOUND = -6; + +async function getPath(_path: string): Promise { + try { + const result = await stat(_path); + + if (result.isFile()) { + return _path; + } + + if (result.isDirectory()) { + return getPath(path.join(_path, 'index.html')); + } + } catch (_) {} +} + +export default (options: Options) => { + const scheme = options.scheme ?? 'app'; + const isCorsEnabled = options.isCorsEnabled ?? true; + + if (!options.directory) { + throw new Error('The `directory` option is required'); + } + + const directory = path.resolve(electron.app.getAppPath(), options.directory); + + const handler = async ( + request: ProtocolRequest, + callback: (response: ProtocolResponse) => void + ) => { + log.info('Request custom scheme url:', request.url); + + const pathname = new URL(request.url).pathname; + + if (is.dev()) { + callback({ + headers: request.headers, + method: request.method, + referrer: request.referrer, + url: `http://localhost:1212/${request.url.replace('app://-/', '')}`, + }); + return; + } + + const indexPath = path.join(directory, 'index.html'); + const filePath = path.join(directory, decodeURIComponent(pathname)); + const resolvedPath = await getPath(filePath); + const fileExtension = path.extname(filePath); + + log.info('Request custom scheme path', { + indexPath, + filePath, + resolvedPath, + fileExtension, + }); + + if ( + resolvedPath || + !fileExtension || + fileExtension === '.html' || + fileExtension === '.asar' + ) { + callback({ + path: resolvedPath || indexPath, + }); + } else { + callback({ error: FILE_NOT_FOUND }); + } + }; + + log.info('register scheme:', scheme); + try { + electron.protocol.registerSchemesAsPrivileged([ + { + scheme, + privileges: { + standard: true, + secure: true, + allowServiceWorkers: true, + supportFetchAPI: true, + corsEnabled: isCorsEnabled, + }, + }, + ]); + } catch (e) { + log.error('register scheme error:', e); + } + + electron.app.on('ready', () => { + const session = options.partition + ? electron.session.fromPartition(options.partition) + : electron.session.defaultSession; + + if (is.dev()) { + session.protocol.registerHttpProtocol(scheme, handler); + } else { + session.protocol.registerFileProtocol(scheme, handler); + } + }); + + return async (window: BrowserWindow) => { + await window.loadURL(`${scheme}://-`); + }; +}; diff --git a/client/desktop/src/main/lib/http.ts b/client/desktop/src/main/lib/http.ts new file mode 100644 index 00000000000..06a192a9b27 --- /dev/null +++ b/client/desktop/src/main/lib/http.ts @@ -0,0 +1,29 @@ +import express from 'express'; +import path from 'path'; + +/** + * 启动一个本地服务器 + */ +export function startLocalServer( + staticPath: string, + port: number +): Promise { + return new Promise((resolve) => { + const app = express(); + + const staticDir = path.resolve(__dirname, staticPath); + console.log('Static File:', staticDir); + + app.use(express.static(staticDir)); + + // Fallback + app.use('/**', function (_, res) { + res.sendFile(staticPath + '/index.html', { maxAge: 0 }); + }); + + app.listen(port, () => { + console.log('Static file server is listen at:', port); + resolve(); + }); + }); +} diff --git a/client/desktop/src/main/lib/webview-manager.ts b/client/desktop/src/main/lib/webview-manager.ts new file mode 100644 index 00000000000..c3478de3e69 --- /dev/null +++ b/client/desktop/src/main/lib/webview-manager.ts @@ -0,0 +1,186 @@ +/** + * Fork from https://github.com/msgbyte/webbox/blob/main/src/main/webviewManager.ts + */ + +import { BrowserView, BrowserWindow, ipcMain, Rectangle } from 'electron'; +import os from 'os'; +import log from 'electron-log'; + +interface WebviewInfo { + view: BrowserView; + url: string; + hidden: boolean; +} + +const webviewMap = new Map(); + +/** + * fix rect into correct size + */ +function fixRect(rect: Rectangle, isFullScreen: boolean): Rectangle { + const xOffset = 1; + const yOffset = !isFullScreen && os.platform() === 'darwin' ? 28 : 0; // add y axis offset in mac os if is not fullScreen + + return { + x: Math.round(rect.x) + xOffset, + y: Math.round(rect.y) + yOffset, + width: Math.round(rect.width) - xOffset, + height: Math.round(rect.height), + }; +} + +export function initWebviewManager(win: BrowserWindow) { + ipcMain.on('$mount-webview', (e, info) => { + if (!win) { + log.info('[mount-webview]', 'cannot get mainWindow'); + return; + } + + log.info('[mount-webview] info:', info); + + const { key, url } = info; + if (!url) { + return; + } + + if (webviewMap.has(key)) { + const webview = webviewMap.get(key)!; + win.setTopBrowserView(webview.view); + webview.view.setBounds(fixRect(info.rect, win.isFullScreen())); + if (webview.url !== url) { + // url has been change. + webview.view.webContents.loadURL(url); + } + return; + } + + // hideAllWebview(); + const view = new BrowserView({ + webPreferences: { + nodeIntegration: false, + }, + }); + view.setBackgroundColor('#fff'); + view.setBounds(fixRect(info.rect, win.isFullScreen())); + view.webContents.loadURL(url); + win.addBrowserView(view); + webviewMap.set(key, { view, url, hidden: false }); + }); + + ipcMain.on('$unmount-webview', (e, info) => { + if (!win) { + log.info('[unmount-webview]', 'cannot get mainWindow'); + return; + } + + log.info('[unmount-webview] info:', info); + + const { key } = info; + const webview = webviewMap.get(key); + if (webview) { + win.removeBrowserView(webview.view); + webviewMap.delete(key); + } + }); + + ipcMain.on('$update-webview-rect', (e, info) => { + if (!win) { + log.info('[update-webview-rect]', 'cannot get mainWindow'); + return; + } + + log.info('[update-webview-rect] info:', info); + + // Change All View to avoid under view display on resize. + // webviewMap.forEach((webview) => { + // webview.hidden = false; + // webview.view.setBounds(fixRect(info.rect, win.isFullScreen())); + // }); + + // Change Single View + const webview = webviewMap.get(info.key); + if (webview) { + webview.hidden = false; + webview.view.setBounds(fixRect(info.rect, win.isFullScreen())); + } + }); + + ipcMain.on('$show-webview', (e, info) => { + log.info('[show-webview] info:', info); + + const webview = webviewMap.get(info.key); + if (webview) { + showWebView(webview); + } + }); + + ipcMain.on('$hide-webview', (e, info) => { + log.info('[hide-webview] info:', info); + + const webview = webviewMap.get(info.key); + if (webview) { + hideWebView(webview); + } + }); + + ipcMain.on('$hide-all-webview', () => { + log.info('[hide-all-webview]'); + + hideAllWebview(); + }); + + ipcMain.on('$clear-all-webview', () => { + if (!win) { + log.info('[clear-all-webview]', 'cannot get mainWindow'); + return; + } + + log.info('[clear-all-webview]'); + + win.getBrowserViews().forEach((view) => { + win.removeBrowserView(view); + }); + + webviewMap.clear(); + }); +} + +const HIDDEN_OFFSET = 3000; + +/** + * Show webview with remove offset in y + */ +function showWebView(webview: WebviewInfo) { + if (webview.hidden === false) { + return; + } + + webview.hidden = false; + const oldBounds = webview.view.getBounds(); + webview.view.setBounds({ + ...oldBounds, + y: oldBounds.y - HIDDEN_OFFSET, + }); +} + +/** + * Hide webview with append offset in y + */ +function hideWebView(webview: WebviewInfo) { + if (webview.hidden === true) { + return; + } + + webview.hidden = true; + const oldBounds = webview.view.getBounds(); + webview.view.setBounds({ + ...oldBounds, + y: oldBounds.y + HIDDEN_OFFSET, + }); +} + +function hideAllWebview() { + Array.from(webviewMap.values()).forEach((webview) => { + hideWebView(webview); + }); +} diff --git a/client/desktop/src/main/main.ts b/client/desktop/src/main/main.ts new file mode 100644 index 00000000000..008f84532b4 --- /dev/null +++ b/client/desktop/src/main/main.ts @@ -0,0 +1,370 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ + +/** + * This module executes inside of electron's main process. You can start + * electron renderer process from here and communicate with the other processes + * through IPC. + * + * When running `npm run build` or `npm run build:main`, this file is compiled to + * `./src/main.js` using webpack. This gives us some performance wins. + */ +import path from 'path'; +import { + app, + BrowserWindow, + shell, + ipcMain, + desktopCapturer, + DesktopCapturerSource, +} from 'electron'; +import { autoUpdater } from 'electron-updater'; +import log from 'electron-log'; +import MenuBuilder from './menu'; +import { getCapturerSourcePickerUrl, resolveHtmlPath } from './util'; +import windowStateKeeper from 'electron-window-state'; +import is from 'electron-is'; +import { initScreenshots } from './screenshots'; +import { generateInjectedScript } from './inject'; +import { handleTailchatMessage } from './inject/message-handler'; +import { initWebviewManager } from './lib/webview-manager'; + +log.info('Start...'); + +if (is.dev()) { + console.log('==========================='); + console.log('Log file:', log.transports.file.getFile().path); + console.log('==========================='); +} + +export default class AppUpdater { + constructor() { + log.transports.file.level = 'info'; + autoUpdater.logger = log; + autoUpdater.checkForUpdatesAndNotify(); + } +} + +ipcMain.on('ipc-example', async (event, arg) => { + const msgTemplate = (pingPong: string) => `IPC test: ${pingPong}`; + console.log(msgTemplate(arg)); + event.reply('ipc-example', msgTemplate('pong')); +}); + +ipcMain.handle('DESKTOP_CAPTURER_GET_SOURCES', async (event, opts) => { + const sources = await desktopCapturer.getSources({ + types: ['window', 'screen'], + }); + + return new Promise((resolve) => { + createCapturerSourcePicker(sources, (source) => { + if (source) { + resolve(source); + } else { + resolve(null); + } + }); + }); +}); + +if (process.env.NODE_ENV === 'production') { + const sourceMapSupport = require('source-map-support'); + sourceMapSupport.install(); +} + +const isDebug = + process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; + +if (isDebug) { + require('electron-debug')(); +} + +if (app.isPackaged) { + log.info('auto catch errors and overwrite default `console.log` functions'); + log.catchErrors(); + Object.assign(console, log.functions); +} + +const installExtensions = async () => { + const installer = require('electron-devtools-installer'); + const forceDownload = !!process.env.UPGRADE_EXTENSIONS; + const extensions = ['REACT_DEVELOPER_TOOLS']; + + return installer + .default( + extensions.map((name) => installer[name]), + forceDownload + ) + .catch(console.log); +}; + +const webPreferences: Electron.WebPreferences = { + nodeIntegration: false, + contextIsolation: true, + devTools: true, + webSecurity: false, // skip same-origin + allowRunningInsecureContent: true, // allow visit http page in https + preload: app.isPackaged + ? path.join(__dirname, 'preload.js') + : path.join(__dirname, '../../.erb/dll/preload.js'), +}; + +let welcomeWindow: BrowserWindow | null = null; +let mainWindow: BrowserWindow | null = null; +let capturerSourcePickerWindow: BrowserWindow | null = null; + +const createWelcomeWindow = async () => { + // 创建一个新的浏览器窗口 + welcomeWindow = new BrowserWindow({ + width: 800, + height: 600, + frame: false, + webPreferences, + }); + + // 加载欢迎窗口的HTML文件 + welcomeWindow.loadURL(resolveHtmlPath('index.html')); + + // 监听从渲染进程发送的选择用户事件 + // welcomeWindow.webContents.on('selectUser', (event, user) => { + // selectedUser = user; + // welcomeWindow.close(); // 关闭欢迎窗口 + // createMainWindow(); // 创建主窗口 + // }); + + welcomeWindow.webContents.on('ipc-message', (e, channel, data) => { + log.info('[ipc-message]', channel, data); + if (channel === 'close') { + welcomeWindow?.close(); + } else if (channel === 'selectServer') { + console.log(data); + const url = data.url; + + createMainWindow(url).then(() => { + welcomeWindow?.close(); + }); + } + }); + + welcomeWindow.on('closed', () => { + welcomeWindow = null; + }); +}; + +const createMainWindow = async (url: string) => { + try { + log.info('Create window'); + + if (isDebug) { + log.info('Install extensions'); + await installExtensions(); + } + + const RESOURCES_PATH = app.isPackaged + ? path.join(process.resourcesPath, 'assets') + : path.join(__dirname, '../../assets'); + log.info('parse resolve path:', RESOURCES_PATH); + + const mainWindowState = windowStateKeeper({ + defaultWidth: 1200, + defaultHeight: 800, + }); + log.info('load window state with:', mainWindowState); + + const getAssetPath = (...paths: string[]): string => { + return path.join(RESOURCES_PATH, ...paths); + }; + mainWindow = new BrowserWindow({ + show: false, + x: mainWindowState.x, + y: mainWindowState.y, + height: mainWindowState.height, + width: mainWindowState.width, + icon: getAssetPath('icon.png'), + webPreferences, + }); + + mainWindow.loadURL(url); + + /** + * 如果存在 + * 注入 SERVICE_URL + */ + if (process.env.SERVICE_URL) { + mainWindow.webContents + .executeJavaScript( + `window.localStorage.setItem("serviceUrl", ${process.env.SERVICE_URL});` + ) + .then(() => { + log.info('Update Service Url Success:', process.env.SERVICE_URL); + }); + } + + mainWindow.webContents.on('did-start-navigation', () => { + if (mainWindow) { + mainWindow.webContents.executeJavaScript(generateInjectedScript()); + } + }); + + mainWindow.webContents.on('ipc-message', (e, channel, data) => { + if (channel === 'webview-message') { + const obj = JSON.parse(data); + if (typeof obj === 'object' && obj._isTailchat === true && mainWindow) { + handleTailchatMessage( + obj.type, + obj.payload, + mainWindow.webContents, + mainWindow + ); + } + } + }); + + mainWindow.on('focus', () => { + mainWindow?.flashFrame(false); + }); + + mainWindow.on('ready-to-show', () => { + if (!mainWindow) { + throw new Error('"mainWindow" is not defined'); + } + + if (process.env.START_MINIMIZED) { + mainWindow.minimize(); + } else { + mainWindow.show(); + } + }); + + mainWindow.on('closed', () => { + mainWindow = null; + }); + + log.info('Build menu'); + const menuBuilder = new MenuBuilder(mainWindow); + menuBuilder.buildMenu(); + + // Open urls in the user's browser + mainWindow.webContents.setWindowOpenHandler((edata) => { + shell.openExternal(edata.url); + return { action: 'deny' }; + }); + + // 下载操作相关处理 + mainWindow.webContents.session.on('will-download', (event, item) => { + // 下载开始前的回调函数 + item.on('updated', (event, state) => { + if (state === 'interrupted') { + log.warn('File download interrupted'); + } else if (state === 'progressing') { + if (item.isPaused()) { + log.warn('File download paused'); + } else { + log.info( + `File download process: ${item.getReceivedBytes()} / ${item.getTotalBytes()} Bytes` + ); + } + } + }); + + item.once('done', (event, state) => { + if (state === 'completed') { + log.info('File download completed'); + const filePath = item.getSavePath(); + shell.showItemInFolder(filePath); + } else { + log.error(`File download failed: ${state}`); + } + }); + }); + + mainWindowState.manage(mainWindow); + + initWebviewManager(mainWindow); + + // Remove this if your app does not use auto updates + new AppUpdater(); + } catch (err) { + log.error('createWindow error:', err); + } +}; + +const createCapturerSourcePicker = async ( + sources: DesktopCapturerSource[], + onSelected: (source: DesktopCapturerSource | null) => void +) => { + // 创建一个新的浏览器窗口 + capturerSourcePickerWindow = new BrowserWindow({ + width: 800, + height: 600, + alwaysOnTop: true, + parent: mainWindow ?? undefined, + modal: true, + autoHideMenuBar: true, + minimizable: false, + maximizable: false, + webPreferences, + }); + + // 加载欢迎窗口的HTML文件 + const htmlPath = getCapturerSourcePickerUrl(); + log.info('htmlPath', htmlPath); + capturerSourcePickerWindow.webContents.loadFile(htmlPath); + + capturerSourcePickerWindow.webContents.on('did-finish-load', () => { + if (capturerSourcePickerWindow) { + capturerSourcePickerWindow.webContents.send( + 'SEND_SCREEN_SHARE_SOURCES', + sources.map((s) => ({ + ...s, + thumbnail: s.thumbnail.toDataURL(), + })) + ); + } + }); + + // 监听从渲染进程发送的选择捕获源事件 + capturerSourcePickerWindow.webContents.on( + 'ipc-message', + (e, channel, data) => { + if (channel === 'selectCapturerSource') { + onSelected(data); + if (capturerSourcePickerWindow) { + capturerSourcePickerWindow.close(); + } + } + } + ); + + capturerSourcePickerWindow.on('closed', () => { + onSelected(null); + capturerSourcePickerWindow = null; + }); +}; + +/** + * Add event listeners... + */ + +app.on('window-all-closed', () => { + // Respect the OSX convention of having the application in memory even + // after all windows have been closed + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app + .whenReady() + .then(() => { + createWelcomeWindow(); + initScreenshots(); + + app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (welcomeWindow === null && mainWindow === null) { + createWelcomeWindow(); + } + }); + }) + .catch(log.error); diff --git a/client/desktop/src/main/menu.ts b/client/desktop/src/main/menu.ts new file mode 100644 index 00000000000..83552d2eded --- /dev/null +++ b/client/desktop/src/main/menu.ts @@ -0,0 +1,259 @@ +import { + app, + Menu, + shell, + BrowserWindow, + MenuItemConstructorOptions, +} from 'electron'; +import log from 'electron-log'; + +interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions { + selector?: string; + submenu?: DarwinMenuItemConstructorOptions[] | Menu; +} + +export default class MenuBuilder { + mainWindow: BrowserWindow; + + constructor(mainWindow: BrowserWindow) { + this.mainWindow = mainWindow; + } + + buildMenu(): Menu { + if ( + process.env.NODE_ENV === 'development' || + process.env.DEBUG_PROD === 'true' + ) { + this.setupDevelopmentEnvironment(); + } + + const template = + process.platform === 'darwin' + ? this.buildDarwinTemplate() + : this.buildDefaultTemplate(); + + const menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); + + return menu; + } + + setupDevelopmentEnvironment(): void { + this.mainWindow.webContents.on('context-menu', (_, props) => { + const { x, y } = props; + + Menu.buildFromTemplate([ + { + label: 'Inspect element', + click: () => { + this.mainWindow.webContents.inspectElement(x, y); + }, + }, + ]).popup({ window: this.mainWindow }); + }); + } + + buildDarwinTemplate(): MenuItemConstructorOptions[] { + const subMenuAbout: DarwinMenuItemConstructorOptions = { + label: 'Tailchat', + submenu: [ + { + label: 'About Tailchat', + selector: 'orderFrontStandardAboutPanel:', + }, + { type: 'separator' }, + { label: 'Services', submenu: [] }, + { type: 'separator' }, + { + label: 'Hide Tailchat', + accelerator: 'Command+H', + selector: 'hide:', + }, + { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + selector: 'hideOtherApplications:', + }, + { label: 'Show All', selector: 'unhideAllApplications:' }, + { type: 'separator' }, + { + label: 'Quit', + accelerator: 'Command+Q', + click: () => { + app.quit(); + }, + }, + ], + }; + const subMenuEdit: DarwinMenuItemConstructorOptions = { + label: 'Edit', + submenu: [ + { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, + { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, + { type: 'separator' }, + { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' }, + { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, + { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, + { + label: 'Select All', + accelerator: 'Command+A', + selector: 'selectAll:', + }, + ], + }; + const subMenuView: MenuItemConstructorOptions = { + label: 'View', + submenu: [ + { + label: 'Reload', + accelerator: 'Command+R', + click: () => { + this.mainWindow.webContents.reload(); + }, + }, + { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + }, + }, + { + label: 'Toggle Developer Tools', + accelerator: 'Alt+Command+I', + click: () => { + this.mainWindow.webContents.toggleDevTools(); + }, + }, + ], + }; + const subMenuWindow: DarwinMenuItemConstructorOptions = { + label: 'Window', + submenu: [ + { + label: 'Minimize', + accelerator: 'Command+M', + selector: 'performMiniaturize:', + }, + { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, + { type: 'separator' }, + { label: 'Bring All to Front', selector: 'arrangeInFront:' }, + ], + }; + const subMenuHelp: MenuItemConstructorOptions = { + label: 'Help', + submenu: [ + { + label: 'Learn More', + click() { + shell.openExternal('https://tailchat.msgbyte.com/'); + }, + }, + { + label: 'Documentation', + click() { + shell.openExternal('https://tailchat.msgbyte.com/docs/intro'); + }, + }, + { + label: 'Github', + click() { + shell.openExternal('https://github.com/msgbyte/tailchat'); + }, + }, + { + label: 'Search Issues', + click() { + shell.openExternal('https://github.com/msgbyte/tailchat/issues'); + }, + }, + ], + }; + + return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow, subMenuHelp]; + } + + buildDefaultTemplate() { + const templateDefault = [ + { + label: '&File', + submenu: [ + { + label: '&Open', + accelerator: 'Ctrl+O', + }, + { + label: '&Close', + accelerator: 'Ctrl+W', + click: () => { + this.mainWindow.close(); + }, + }, + ], + }, + { + label: '&View', + submenu: [ + { + label: '&Reload', + accelerator: 'Ctrl+R', + click: () => { + this.mainWindow.webContents.reload(); + }, + }, + { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + }, + }, + { + label: 'Toggle &Developer Tools', + accelerator: 'Alt+Ctrl+I', + click: () => { + this.mainWindow.webContents.toggleDevTools(); + }, + }, + ], + }, + { + label: 'Help', + submenu: [ + { + label: 'Learn More', + click() { + shell.openExternal('https://tailchat.msgbyte.com/'); + }, + }, + { + label: 'Documentation', + click() { + shell.openExternal('https://tailchat.msgbyte.com/docs/intro'); + }, + }, + { + label: 'Github', + click() { + shell.openExternal('https://github.com/msgbyte/tailchat'); + }, + }, + { + label: 'Search Issues', + click() { + shell.openExternal('https://github.com/msgbyte/tailchat/issues'); + }, + }, + { + label: 'Logs', + click() { + shell.showItemInFolder(log.transports.file.getFile().path); + }, + }, + ], + }, + ]; + + return templateDefault; + } +} diff --git a/client/desktop/src/main/preload.ts b/client/desktop/src/main/preload.ts new file mode 100644 index 00000000000..8e1c66e5e4e --- /dev/null +++ b/client/desktop/src/main/preload.ts @@ -0,0 +1,41 @@ +import { + contextBridge, + ipcRenderer, + IpcRendererEvent, + webFrame, +} from 'electron'; + +export type Channels = + | 'ipc-example' + | 'webview-message' + | 'close' + | 'selectServer'; + +contextBridge.exposeInMainWorld('electron', { + ipcRenderer: { + sendMessage(channel: Channels, ...args: unknown[]) { + ipcRenderer.send(channel, ...args); + }, + on(channel: Channels, func: (...args: unknown[]) => void) { + const subscription = (_event: IpcRendererEvent, ...args: unknown[]) => + func(...args); + ipcRenderer.on(channel, subscription); + + return () => ipcRenderer.removeListener(channel, subscription); + }, + once(channel: Channels, func: (...args: unknown[]) => void) { + ipcRenderer.once(channel, (_event, ...args) => func(...args)); + }, + async getDesktopCapturerSource(): Promise { + const source = await ipcRenderer.invoke('DESKTOP_CAPTURER_GET_SOURCES'); + + return source; + }, + }, +}); + +const postMessageOverride = `window.postMessage = function (data) { + window.electron.ipcRenderer.sendMessage('webview-message', JSON.stringify(data)); +};`; + +webFrame.executeJavaScript(postMessageOverride); diff --git a/client/desktop/src/main/screenshots.ts b/client/desktop/src/main/screenshots.ts new file mode 100644 index 00000000000..e221acc4f68 --- /dev/null +++ b/client/desktop/src/main/screenshots.ts @@ -0,0 +1,38 @@ +import { globalShortcut } from 'electron'; +import Screenshots from 'electron-screenshots'; +import _once from 'lodash/once'; +import log from 'electron-log'; + +let _screenshots: Screenshots; + +export const initScreenshots = _once(() => { + const screenshots = new Screenshots(); + _screenshots = screenshots; + + globalShortcut.register('ctrl+shift+a', () => { + screenshots.startCapture(); + // screenshots.$view.webContents.openDevTools(); + }); + + // 点击确定按钮回调事件 + screenshots.on('ok', (e, buffer, bounds) => { + console.log('capture', buffer, bounds); + }); + // 点击取消按钮回调事件 + screenshots.on('cancel', () => { + console.log('capture', 'cancel'); + }); + // 点击保存按钮回调事件 + screenshots.on('save', (e, buffer, bounds) => { + console.log('capture', buffer, bounds); + }); +}); + +export function startScreenshots() { + if (!_screenshots) { + log.warn('_screenshots not inited'); + return; + } + + _screenshots.startCapture(); +} diff --git a/client/desktop/src/main/util.ts b/client/desktop/src/main/util.ts new file mode 100644 index 00000000000..2c773499099 --- /dev/null +++ b/client/desktop/src/main/util.ts @@ -0,0 +1,29 @@ +import log from 'electron-log'; +import { URL } from 'url'; +import path from 'path'; + +export function resolveHtmlPath(htmlFileName: string) { + if (process.env.NODE_ENV === 'development') { + const port = process.env.PORT || 1212; + const url = new URL(`http://localhost:${port}`); + url.pathname = htmlFileName; + return url.href; + } + + return `file://${path.resolve(__dirname, '../renderer/', htmlFileName)}`; +} + +export function getDefaultLoggerPath(): string { + return log.transports.file.getFile().path; +} + +export function getCapturerSourcePickerUrl() { + if (process.env.NODE_ENV === 'development') { + return path.resolve(__dirname, '../../assets/capturer-source-picker.html'); + } else { + return path.resolve( + __dirname, + '../../../assets/capturer-source-picker.html' + ); + } +} diff --git a/client/desktop/src/renderer/AddServerItem.tsx b/client/desktop/src/renderer/AddServerItem.tsx new file mode 100644 index 00000000000..81effec94de --- /dev/null +++ b/client/desktop/src/renderer/AddServerItem.tsx @@ -0,0 +1,51 @@ +import { Input, message, Modal } from 'antd'; +import React, { useState } from 'react'; +import { ServerItem } from './ServerItem'; +import { useServerStore } from './store/server'; +import addIcon from '../../assets/add.svg'; +import './ServerItem.css'; + +export const AddServerItem: React.FC = React.memo(() => { + const { addServer } = useServerStore(); + const [messageApi, contextHolder] = message.useMessage(); + const [isModalOpen, setIsModalOpen] = useState(false); + const [url, setUrl] = useState(''); + + return ( + <> + {contextHolder} + + { + setIsModalOpen(true); + }} + > + Add Server + + + { + addServer(url) + .then(() => { + messageApi.success('Server Added Success'); + setUrl(''); + setIsModalOpen(false); + }) + .catch((err) => { + messageApi.error('Server Added Failed:' + String(err)); + }); + }} + onCancel={() => { + setIsModalOpen(false); + }} + > +
Input Server Url
+ setUrl(e.target.value)} /> +
+ + ); +}); +AddServerItem.displayName = 'AddServerItem'; diff --git a/client/desktop/src/renderer/App.css b/client/desktop/src/renderer/App.css new file mode 100644 index 00000000000..810a2363201 --- /dev/null +++ b/client/desktop/src/renderer/App.css @@ -0,0 +1,76 @@ +/* + * @NOTE: Prepend a `~` to css file paths that are in your node_modules + * See https://github.com/webpack-contrib/sass-loader#imports + */ + +* { + box-sizing: border-box; +} + +body { + position: relative; + color: white; + height: 100vh; + background: linear-gradient( + 200.96deg, + #111827 -29.09%, + #374151 51.77%, + #111827 129.35% + ); + font-family: sans-serif; + overflow-y: hidden; + display: flex; + justify-content: center; + align-items: center; + margin: 0; + padding: 0; +} + +button { + background-color: white; + padding: 10px 20px; + border-radius: 10px; + border: none; + appearance: none; + font-size: 1.3rem; + box-shadow: 0px 8px 28px -6px rgba(24, 39, 75, 0.12), + 0px 18px 88px -4px rgba(24, 39, 75, 0.14); + transition: all ease-in 0.1s; + cursor: pointer; + opacity: 0.9; +} + +button:hover { + transform: scale(1.05); + opacity: 1; +} + +li { + list-style: none; +} + +button + button { + margin-left: 10px; +} + +.header { + display: flex; + justify-content: center; + align-items: center; + margin: 20px 0; +} + +.server-list { + display: flex; + flex-wrap: wrap; + gap: 10px; + justify-content: center; + padding: 0 20px; +} + +.actions { + display: flex; + justify-content: center; + align-items: center; + margin: 20px 0; +} diff --git a/client/desktop/src/renderer/App.tsx b/client/desktop/src/renderer/App.tsx new file mode 100644 index 00000000000..589dc56bb90 --- /dev/null +++ b/client/desktop/src/renderer/App.tsx @@ -0,0 +1,87 @@ +import icon from '../../assets/icon.svg'; +import { ServerItem } from './ServerItem'; +import React from 'react'; +import { defaultServerList, useServerStore } from './store/server'; +import { AddServerItem } from './AddServerItem'; +import { Dropdown, Modal } from 'antd'; +import './App.css'; + +const Hello: React.FC = React.memo(() => { + const { serverList, removeServer } = useServerStore(); + + return ( +
+
+

Select your server...

+
+
+ {[...defaultServerList, ...serverList].map((serverInfo, i) => { + return ( + { + Modal.confirm({ + title: 'Do you Want to delete this server?', + onOk() { + removeServer(serverInfo.url); + }, + }); + }, + }, + ], + }} + > +
+ { + window.electron.ipcRenderer.sendMessage('selectServer', { + url: serverInfo.url, + }); + }} + > + {serverInfo.name} + +
+
+ ); + })} + + +
+ +
+ + + +
+
+ ); +}); +Hello.displayName = 'Hello'; + +export default function App() { + return ; +} diff --git a/client/desktop/src/renderer/ServerItem.css b/client/desktop/src/renderer/ServerItem.css new file mode 100644 index 00000000000..4a3b4a522a5 --- /dev/null +++ b/client/desktop/src/renderer/ServerItem.css @@ -0,0 +1,28 @@ +.server-item { + background-color: white; + padding: 10px; + border-radius: 10px; + border: none; + appearance: none; + font-size: 1rem; + box-shadow: 0px 8px 28px -6px rgba(24, 39, 75, 0.12), + 0px 18px 88px -4px rgba(24, 39, 75, 0.14); + transition: all ease-in 0.1s; + cursor: pointer; + opacity: 0.9; + color: black; + width: 120px; + height: 120px; + text-align: center; +} + +.server-item:hover { + transform: scale(1.05); + opacity: 1; +} + +.server-item > div { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/client/desktop/src/renderer/ServerItem.tsx b/client/desktop/src/renderer/ServerItem.tsx new file mode 100644 index 00000000000..3f4c50e5894 --- /dev/null +++ b/client/desktop/src/renderer/ServerItem.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import './ServerItem.css'; + +export const ServerItem: React.FC< + React.PropsWithChildren<{ + icon: string; + version?: string; + onClick: () => void; + }> +> = React.memo((props) => { + return ( +
+
+ icon +
+
{props.children}
+
+ {props.version} +
+
+ ); +}); +ServerItem.displayName = 'ServerItem'; diff --git a/desktop/src/renderer/index.ejs b/client/desktop/src/renderer/index.ejs similarity index 88% rename from desktop/src/renderer/index.ejs rename to client/desktop/src/renderer/index.ejs index 110d1ea84c9..18b0d595b10 100644 --- a/desktop/src/renderer/index.ejs +++ b/client/desktop/src/renderer/index.ejs @@ -9,6 +9,6 @@ Tailchat -
+
diff --git a/client/desktop/src/renderer/index.tsx b/client/desktop/src/renderer/index.tsx new file mode 100644 index 00000000000..064a05784f8 --- /dev/null +++ b/client/desktop/src/renderer/index.tsx @@ -0,0 +1,13 @@ +import { createRoot } from 'react-dom/client'; +import App from './App'; + +const container = document.getElementById('root') as HTMLElement; +const root = createRoot(container); +root.render(); + +// calling IPC exposed from preload script +window.electron.ipcRenderer.once('ipc-example', (arg) => { + // eslint-disable-next-line no-console + console.log(arg); +}); +window.electron.ipcRenderer.sendMessage('ipc-example', ['ping']); diff --git a/client/desktop/src/renderer/preload.d.ts b/client/desktop/src/renderer/preload.d.ts new file mode 100644 index 00000000000..7a0edf62129 --- /dev/null +++ b/client/desktop/src/renderer/preload.d.ts @@ -0,0 +1,21 @@ +import { Channels } from 'main/preload'; + +declare global { + interface Window { + electron: { + ipcRenderer: { + sendMessage(channel: Channels, ...args: unknown[]): void; + on( + channel: string, + func: (...args: unknown[]) => void + ): (() => void) | undefined; + once(channel: string, func: (...args: unknown[]) => void): void; + getDesktopCapturerSource: () => Promise< + Electron.DesktopCapturerSource[] + >; + }; + }; + } +} + +export {}; diff --git a/client/desktop/src/renderer/store/server.ts b/client/desktop/src/renderer/store/server.ts new file mode 100644 index 00000000000..30581c00b8a --- /dev/null +++ b/client/desktop/src/renderer/store/server.ts @@ -0,0 +1,73 @@ +import { create } from 'zustand'; +import { immer } from 'zustand/middleware/immer'; +import { persist } from 'zustand/middleware'; +import { urlResolve } from '../utils'; + +/** + * Same with mobile + */ + +interface ServerInfo { + name?: string; + version?: string; + url: string; + icon?: string; +} + +interface ServerStoreState { + serverList: ServerInfo[]; + addServer: (url: string) => Promise; + removeServer: (url: string) => void; +} + +export const defaultServerList: ServerInfo[] = [ + { + name: 'Tailchat', + url: 'https://nightly.paw.msgbyte.com/', + version: 'nightly', + }, +]; + +export const useServerStore = create()( + persist( + immer((set) => ({ + serverList: [], + addServer: async (url: string) => { + try { + // 获取 Tailchat 客户端配置 + const res = await fetch(urlResolve(url, './tailchat.manifest')); + const clientConfig = await res.json(); + const { version, serviceUrl } = clientConfig; + console.log('获取Tailchat客户端配置成功', clientConfig); + + // 获取 Tailchat 服务端配置 + const res2 = await fetch( + urlResolve(serviceUrl ?? url, './api/config/client') + ); + const serviceConfig = (await res2.json()).data; + console.log('获取Tailchat服务端配置成功', serviceConfig); + + set((state) => { + state.serverList.push({ + name: serviceConfig.serverName ?? 'Tailchat', + url, + version, + }); + }); + } catch (err) { + console.error('获取服务器配置失败:', err); + throw err; + } + }, + removeServer: (url: string) => { + set((state) => { + state.serverList = state.serverList.filter((s) => s.url !== url); + }); + }, + })), + { + name: 'server', + partialize: (state) => ({ serverList: state.serverList }), + } + ) +); diff --git a/client/desktop/src/renderer/utils/index.ts b/client/desktop/src/renderer/utils/index.ts new file mode 100644 index 00000000000..c52d8281007 --- /dev/null +++ b/client/desktop/src/renderer/utils/index.ts @@ -0,0 +1,3 @@ +export function urlResolve(base: string, url: string): string { + return new URL(url, base).href; +} diff --git a/desktop/tailwind.config.js b/client/desktop/tailwind.config.js similarity index 100% rename from desktop/tailwind.config.js rename to client/desktop/tailwind.config.js diff --git a/client/desktop/test/http-server.ts b/client/desktop/test/http-server.ts new file mode 100644 index 00000000000..02d8a3f1ce8 --- /dev/null +++ b/client/desktop/test/http-server.ts @@ -0,0 +1,11 @@ +import { startLocalServer } from '../src/main/lib/http'; +import path from 'path'; + +const port = 12120; + +startLocalServer( + path.resolve(__dirname, '../release/app/dist/renderer'), + port +).then(() => { + console.log('HTTP Server start in', `http://localhost:${port}`); +}); diff --git a/desktop/tsconfig.json b/client/desktop/tsconfig.json similarity index 100% rename from desktop/tsconfig.json rename to client/desktop/tsconfig.json diff --git a/client/desktop/yarn.lock b/client/desktop/yarn.lock new file mode 100644 index 00000000000..9d1cb1eba30 --- /dev/null +++ b/client/desktop/yarn.lock @@ -0,0 +1,12053 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@ant-design/colors@^7.0.0": + version "7.0.0" + resolved "https://registry.npmmirror.com/@ant-design/colors/-/colors-7.0.0.tgz#eb7eecead124c3533aea05d61254f0a17f2b61b3" + integrity sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg== + dependencies: + "@ctrl/tinycolor" "^3.4.0" + +"@ant-design/cssinjs@^1.10.1": + version "1.11.0" + resolved "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-1.11.0.tgz#bf1297f425e98b487d735116242ef519ccfd32a9" + integrity sha512-FZzj+kPobxLsMltygmca8nc+/dOYUiJZP/f1+MH6phuCWCNSX5QNWoZurp/lcfXZMR8WvLIcSv/BlLY/WD18YQ== + dependencies: + "@babel/runtime" "^7.11.1" + "@emotion/hash" "^0.8.0" + "@emotion/unitless" "^0.7.5" + classnames "^2.3.1" + csstype "^3.0.10" + rc-util "^5.34.1" + stylis "^4.0.13" + +"@ant-design/icons-svg@^4.2.1": + version "4.2.1" + resolved "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" + integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== + +"@ant-design/icons@^5.1.0": + version "5.1.4" + resolved "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.1.4.tgz#614e29e26d092c2c1c1a2acbc0d84434d8d1474e" + integrity sha512-YHKL7Jx3bM12OxvtiYDon04BsBT/6LGitYEqar3GljzWaAyMOAD8i/uF1Rsi5Us/YNdWWXBGSvZV2OZWMpJlcA== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/icons-svg" "^4.2.1" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.31.1" + +"@ant-design/react-slick@~1.0.0": + version "1.0.1" + resolved "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.0.1.tgz#af10e67ef9a233df5610c36313a5c804ccc2ae6b" + integrity sha512-ARM0TmpGdDuUVE10NwUCENQlJSInNKo5NiBjL5szu5BxWNEHNwQMcDrlVCqFbkvFLy+2CvywW8Y59QJtC0YDag== + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + resize-observer-polyfill "^1.5.1" + throttle-debounce "^5.0.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/compat-data@^7.20.5": + version "7.20.14" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" + integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + +"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.20.12" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/core@^7.12.3", "@babel/core@^7.15.5": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876" + integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helpers" "^7.18.2" + "@babel/parser" "^7.18.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.17.7", "@babel/generator@^7.19.0": + version "7.19.0" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a" + integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== + dependencies: + "@babel/types" "^7.19.0" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/generator@^7.18.2", "@babel/generator@^7.7.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" + integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== + dependencies: + "@babel/types" "^7.18.2" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" + +"@babel/generator@^7.20.7": + version "7.20.14" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" + integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" + integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" + integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" + integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.17.7": + version "7.17.7" + resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.0": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" + integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + +"@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@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.20.10" + "@babel/types" "^7.20.7" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" + integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz#41fdfcc9abaf900e18ba6e5931816d9062a7b2e0" + integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q== + dependencies: + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + +"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" + integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== + dependencies: + "@babel/types" "^7.18.2" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.18.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" + integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + +"@babel/helpers@^7.20.7": + version "7.20.13" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" + +"@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0": + version "7.18.4" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" + integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== + +"@babel/parser@^7.17.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.1": + version "7.19.1" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.19.1.tgz#6f6d6c2e621aad19a92544cc217ed13f1aac5b4c" + integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A== + +"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": + version "7.20.15" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" + integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" + integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" + integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.17.12" + +"@babel/plugin-proposal-async-generator-functions@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" + integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" + integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-proposal-class-static-block@^7.18.0": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710" + integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" + integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" + integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" + integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" + integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.18.0": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8" + integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.17.12" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" + integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" + integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-proposal-private-property-in-object@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" + integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" + integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd" + integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz#834035b45061983a491f60096f61a2e7c5674a47" + integrity sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.17.12", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" + integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-arrow-functions@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" + integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-async-to-generator@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" + integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.17.12": + version "7.18.4" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz#7988627b3e9186a13e4d7735dc9c34a056613fb9" + integrity sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-classes@^7.17.12": + version "7.18.4" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz#51310b812a090b846c784e47087fa6457baef814" + integrity sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-replace-supers" "^7.18.2" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" + integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-destructuring@^7.18.0": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" + integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" + integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.18.1": + version "7.18.1" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036" + integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" + integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.18.0": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed" + integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.18.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e" + integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-simple-access" "^7.18.2" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.18.0": + version "7.18.4" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz#3d6fd9868c735cce8f38d6ae3a407fb7e61e6d46" + integrity sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.18.0": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f" + integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA== + dependencies: + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" + integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-new-target@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3" + integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" + integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-constant-elements@^7.14.5": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz#cc580857696b6dd9e5e3d079e673d060a0657f37" + integrity sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz#2aa20022709cd6a3f40b45d60603d5f269586dba" + integrity sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/types" "^7.17.12" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz#ef82c8e310913f3522462c9ac967d395092f1954" + integrity sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-regenerator@^7.18.0": + version "7.18.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5" + integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" + integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" + integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.18.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28" + integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-typeof-symbol@^7.17.12": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" + integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-typescript@^7.17.12": + version "7.18.4" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz#587eaf6a39edb8c06215e550dc939faeadd750bf" + integrity sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-typescript" "^7.17.12" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.15.6": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a" + integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" + "@babel/plugin-proposal-async-generator-functions" "^7.17.12" + "@babel/plugin-proposal-class-properties" "^7.17.12" + "@babel/plugin-proposal-class-static-block" "^7.18.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.17.12" + "@babel/plugin-proposal-json-strings" "^7.17.12" + "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.18.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.17.12" + "@babel/plugin-proposal-private-methods" "^7.17.12" + "@babel/plugin-proposal-private-property-in-object" "^7.17.12" + "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.17.12" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.17.12" + "@babel/plugin-transform-async-to-generator" "^7.17.12" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.17.12" + "@babel/plugin-transform-classes" "^7.17.12" + "@babel/plugin-transform-computed-properties" "^7.17.12" + "@babel/plugin-transform-destructuring" "^7.18.0" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.17.12" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.18.1" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.17.12" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.18.0" + "@babel/plugin-transform-modules-commonjs" "^7.18.2" + "@babel/plugin-transform-modules-systemjs" "^7.18.0" + "@babel/plugin-transform-modules-umd" "^7.18.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" + "@babel/plugin-transform-new-target" "^7.17.12" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.17.12" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.18.0" + "@babel/plugin-transform-reserved-words" "^7.17.12" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.17.12" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.18.2" + "@babel/plugin-transform-typeof-symbol" "^7.17.12" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.18.2" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.14.5": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/preset-react/-/preset-react-7.17.12.tgz#62adbd2d1870c0de3893095757ed5b00b492ab3d" + integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.17.12" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@^7.15.0": + version "7.17.12" + resolved "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz#40269e0a0084d56fc5731b6c40febe1c9a4a3e8c" + integrity sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.17.12" + +"@babel/runtime-corejs3@^7.10.2": + version "7.18.3" + resolved "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz#52f0241a31e0ec61a6187530af6227c2846bd60c" + integrity sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q== + dependencies: + core-js-pure "^3.20.2" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0": + version "7.22.5" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" + integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.18.3" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" + integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.7.2": + version "7.18.2" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" + integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.0" + "@babel/types" "^7.18.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.17.3": + version "7.19.1" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.19.1.tgz#0fafe100a8c2a603b4718b1d9bf2568d1d193347" + integrity sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.19.1" + "@babel/types" "^7.19.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13": + version "7.20.13" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.18.4" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" + integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.17.10", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0": + version "7.19.0" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" + integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@babel/types@^7.20.2", "@babel/types@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@ctrl/tinycolor@^3.4.0", "@ctrl/tinycolor@^3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8" + integrity sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ== + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@electron/get@^1.13.0": + version "1.14.1" + resolved "https://registry.npmmirror.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" + integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + global-tunnel-ng "^2.7.1" + +"@electron/universal@1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@electron/universal/-/universal-1.2.0.tgz#518cac72bccd79c00bf41345119e6fdbabdb871d" + integrity sha512-eu20BwNsrMPKoe2bZ3/l9c78LclDvxg3PlVXrQf3L50NaUuW5M59gbPytI+V4z7/QMrohUHetQaU0ou+p1UG9Q== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.1.0" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@emotion/unitless@^0.7.5": + version "0.7.5" + resolved "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.npmmirror.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@mdn/browser-compat-data@^3.3.14": + version "3.3.14" + resolved "https://registry.npmmirror.com/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz#b72a37c654e598f9ae6f8335faaee182bebc6b28" + integrity sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA== + +"@mdn/browser-compat-data@^4.1.5": + version "4.2.1" + resolved "https://registry.npmmirror.com/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz#1fead437f3957ceebe2e8c3f46beccdb9bc575b8" + integrity sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.npmmirror.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.npmmirror.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.6": + version "0.5.7" + resolved "https://registry.npmmirror.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz#58f8217ba70069cc6a73f5d7e05e85b458c150e2" + integrity sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.8.1" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@rc-component/color-picker@~1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-1.2.0.tgz#964c86e85f0791703c7f1ec842e7476bcb41954d" + integrity sha512-IitJ6RWGHs7btI1AqzGPrehr5bueWLGDUyMKwDwvFunfSDo/o8g/95kUG55vC5EYLM0ZJ3SDfw45OrW5KAx3oA== + dependencies: + "@babel/runtime" "^7.10.1" + "@ctrl/tinycolor" "^3.6.0" + classnames "^2.2.6" + rc-util "^5.30.0" + +"@rc-component/context@^1.3.0": + version "1.3.0" + resolved "https://registry.npmmirror.com/@rc-component/context/-/context-1.3.0.tgz#608ccf0abcbec9406751b17a4b35db08e481c110" + integrity sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w== + dependencies: + "@babel/runtime" "^7.10.1" + rc-util "^5.27.0" + +"@rc-component/mini-decimal@^1.0.1": + version "1.1.0" + resolved "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz#7b7a362b14a0a54cb5bc6fd2b82731f29f11d9b0" + integrity sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ== + dependencies: + "@babel/runtime" "^7.18.0" + +"@rc-component/mutate-observer@^1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-1.0.0.tgz#ce99af3239ed9c74ee3e7302f1c67098de920b46" + integrity sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0", "@rc-component/portal@^1.1.1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@rc-component/portal/-/portal-1.1.1.tgz#1a30ffe51c240b54360cba8e8bfc5d1f559325c4" + integrity sha512-m8w3dFXX0H6UkJ4wtfrSwhe2/6M08uz24HHrF8pWfAXPwA9hwCuTE5per/C86KwNLouRpwFGcr7LfpHaa1F38g== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/tour@~1.8.0": + version "1.8.0" + resolved "https://registry.npmmirror.com/@rc-component/tour/-/tour-1.8.0.tgz#fda8b533e36db1d4254e3ffbcefe3395c346eb1c" + integrity sha512-rrRGioHTLQlGca27G2+lw7QpRb3uuMYCUIJjj31/B44VCJS0P2tqYhOgtzvWQmaLMlWH3ZlpzotkKX13NT4XEA== + dependencies: + "@babel/runtime" "^7.18.0" + "@rc-component/portal" "^1.0.0-9" + "@rc-component/trigger" "^1.3.6" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/trigger@^1.0.4", "@rc-component/trigger@^1.13.0", "@rc-component/trigger@^1.3.6", "@rc-component/trigger@^1.5.0", "@rc-component/trigger@^1.6.2", "@rc-component/trigger@^1.7.0": + version "1.14.1" + resolved "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-1.14.1.tgz#ac24fec4372408514eeb6ac7c557a207ac4a8cb4" + integrity sha512-P6guwJV0etdP4pPEl3MY6SlqNuAhHfV1b793b/oXE8LTQJDR+kaxYZ0E8tFgZtnDr+FZ4zL/Txg5ri2cT2V3lg== + dependencies: + "@babel/runtime" "^7.18.3" + "@rc-component/portal" "^1.1.0" + classnames "^2.3.2" + rc-align "^4.0.0" + rc-motion "^2.0.0" + rc-resize-observer "^1.3.1" + rc-util "^5.33.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@svgr/babel-plugin-add-jsx-attribute@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz#bd6d1ff32a31b82b601e73672a789cc41e84fe18" + integrity sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA== + +"@svgr/babel-plugin-remove-jsx-attribute@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz#58654908beebfa069681a83332544b17e5237e89" + integrity sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz#d06dd6e8a8f603f92f9979bb9990a1f85a4f57ba" + integrity sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz#0b85837577b02c31c09c758a12932820f5245cee" + integrity sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ== + +"@svgr/babel-plugin-svg-dynamic-title@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz#28236ec26f7ab9d486a487d36ae52d58ba15676f" + integrity sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg== + +"@svgr/babel-plugin-svg-em-dimensions@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz#40267c5dea1b43c4f83a0eb6169e08b43d8bafce" + integrity sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.0.0": + version "6.0.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz#eb688d0a5f539e34d268d8a516e81f5d7fede7c9" + integrity sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ== + +"@svgr/babel-plugin-transform-svg-component@^6.2.0": + version "6.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz#7ba61d9fc1fb42b0ba1a04e4630019fa7e993c4f" + integrity sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg== + +"@svgr/babel-preset@^6.2.0": + version "6.2.0" + resolved "https://registry.npmmirror.com/@svgr/babel-preset/-/babel-preset-6.2.0.tgz#1d3ad8c7664253a4be8e4a0f0e6872f30d8af627" + integrity sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^6.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "^6.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "^6.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0" + "@svgr/babel-plugin-transform-svg-component" "^6.2.0" + +"@svgr/core@^6.2.1": + version "6.2.1" + resolved "https://registry.npmmirror.com/@svgr/core/-/core-6.2.1.tgz#195de807a9f27f9e0e0d678e01084b05c54fdf61" + integrity sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA== + dependencies: + "@svgr/plugin-jsx" "^6.2.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.2.1": + version "6.2.1" + resolved "https://registry.npmmirror.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz#ae065567b74cbe745afae617053adf9a764bea25" + integrity sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ== + dependencies: + "@babel/types" "^7.15.6" + entities "^3.0.1" + +"@svgr/plugin-jsx@^6.2.1": + version "6.2.1" + resolved "https://registry.npmmirror.com/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz#5668f1d2aa18c2f1bb7a1fc9f682d3f9aed263bd" + integrity sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g== + dependencies: + "@babel/core" "^7.15.5" + "@svgr/babel-preset" "^6.2.0" + "@svgr/hast-util-to-babel-ast" "^6.2.1" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^6.2.0": + version "6.2.0" + resolved "https://registry.npmmirror.com/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz#4cbe6a33ccccdcae4e3b63ded64cc1cbe1faf48c" + integrity sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.5.0" + +"@svgr/webpack@^6.2.1": + version "6.2.1" + resolved "https://registry.npmmirror.com/@svgr/webpack/-/webpack-6.2.1.tgz#ef5d51c1b6be4e7537fb9f76b3f2b2e22b63c58d" + integrity sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw== + dependencies: + "@babel/core" "^7.15.5" + "@babel/plugin-transform-react-constant-elements" "^7.14.5" + "@babel/preset-env" "^7.15.6" + "@babel/preset-react" "^7.14.5" + "@babel/preset-typescript" "^7.15.0" + "@svgr/core" "^6.2.1" + "@svgr/plugin-jsx" "^6.2.1" + "@svgr/plugin-svgo" "^6.2.0" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@teamsupercell/typings-for-css-modules-loader@^2.5.1": + version "2.5.1" + resolved "https://registry.npmmirror.com/@teamsupercell/typings-for-css-modules-loader/-/typings-for-css-modules-loader-2.5.1.tgz#9a8c5f9667de5edbc18a5e5d4c1a5c38a09ca004" + integrity sha512-8Dz/2awNbkrFHf3IpF8YGUPniXAZW/z7OTiosO+xucIU1+jVg/cT4uyGZ7z9cmAsnExsxq4igazxwgGBXVpUgA== + dependencies: + camelcase "^5.3.1" + loader-utils "1.2.3" + schema-utils "^2.0.1" + optionalDependencies: + prettier "*" + +"@testing-library/dom@^8.5.0": + version "8.13.0" + resolved "https://registry.npmmirror.com/@testing-library/dom/-/dom-8.13.0.tgz#bc00bdd64c7d8b40841e27a70211399ad3af46f5" + integrity sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^5.16.4": + version "5.16.4" + resolved "https://registry.npmmirror.com/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd" + integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA== + dependencies: + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^13.2.0": + version "13.3.0" + resolved "https://registry.npmmirror.com/@testing-library/react/-/react-13.3.0.tgz#bf298bfbc5589326bbcc8052b211f3bb097a97c5" + integrity sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.10" + resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.10.tgz#10fecee4a3be17357ce99b370bd81874044d8dbd" + integrity sha512-N+srakvPaYMGkwjNDx3ASx65Zl3QG8dJgVtIB+YMOkucU+zctlv/hdP5250VKdDHSDoW9PFZoCqbqNcAPjCjXA== + +"@tsconfig/node14@^1.0.0": + version "1.0.2" + resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.2.tgz#b09c08de2eb319ca2acab17a1b8028af110b24b3" + integrity sha512-YwrUA5ysDXHFYfL0Xed9x3sNS4P+aKlCOnnbqUa2E5HdQshHFleCJVrj1PlGTb4GgFUCDyte1v3JWLy2sz8Oqg== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/aria-query@^4.2.0": + version "4.2.2" + resolved "https://registry.npmmirror.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" + integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== + +"@types/babel__core@^7.0.0": + version "7.20.0" + resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__core@^7.1.14": + version "7.1.19" + resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.17.1" + resolved "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" + integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/babel__traverse@^7.0.4": + version "7.18.3" + resolved "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/cacheable-request@^6.0.1": + version "6.0.2" + resolved "https://registry.npmmirror.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmmirror.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.npmmirror.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.3" + resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece" + integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.npmmirror.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/gh-pages@^3.2.1": + version "3.2.1" + resolved "https://registry.npmmirror.com/@types/gh-pages/-/gh-pages-3.2.1.tgz#0c47e024774461fce161570bca309c51d787ef67" + integrity sha512-y5ULkwfoOEUa6sp2te+iEODv2S//DRiKmxpeXboXhhv+s758rSSxLUiBd6NnlR7aAY4nw1X4FGovLrSWEXWLow== + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.6" + resolved "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*": + version "28.1.1" + resolved "https://registry.npmmirror.com/@types/jest/-/jest-28.1.1.tgz#8c9ba63702a11f8c386ee211280e8b68cb093cd1" + integrity sha512-C2p7yqleUKtCkVjlOur9BWVA4HgUQmEj/HWCt5WzZ5mLXrWnyIfl0wGuArc+kBXsy0ZZfLp+7dywB4HtSVYGVA== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/jest@^27.5.1": + version "27.5.2" + resolved "https://registry.npmmirror.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" + integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/json-buffer@~3.0.0": + version "3.0.0" + resolved "https://registry.npmmirror.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64" + integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ== + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/keyv@*": + version "3.1.4" + resolved "https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.191": + version "4.14.191" + resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmmirror.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.npmmirror.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*", "@types/node@^17.0.42": + version "17.0.42" + resolved "https://registry.npmmirror.com/@types/node/-/node-17.0.42.tgz#d7e8f22700efc94d125103075c074396b5f41f9b" + integrity sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ== + +"@types/node@^16.11.26": + version "16.11.39" + resolved "https://registry.npmmirror.com/@types/node/-/node-16.11.39.tgz#07223cd2bc332ad9d92135e3a522eebdee3b060e" + integrity sha512-K0MsdV42vPwm9L6UwhIxMAOmcvH/1OoVkZyCgEtVu4Wx7sElGloy/W7kMBNe/oJ7V/jW9BVt1F6RahH6e7tPXw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.npmmirror.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + +"@types/prettier@^2.1.5": + version "2.6.3" + resolved "https://registry.npmmirror.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" + integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.4": + version "18.0.5" + resolved "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.0.5.tgz#330b2d472c22f796e5531446939eacef8378444a" + integrity sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA== + dependencies: + "@types/react" "*" + +"@types/react-test-renderer@^18.0.0": + version "18.0.0" + resolved "https://registry.npmmirror.com/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz#7b7f69ca98821ea5501b21ba24ea7b6139da2243" + integrity sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.9": + version "18.0.12" + resolved "https://registry.npmmirror.com/@types/react/-/react-18.0.12.tgz#cdaa209d0a542b3fcf69cf31a03976ec4cdd8840" + integrity sha512-duF1OTASSBQtcigUvhuiTB1Ya3OvSy+xORCiEf20H0P0lzx+/KeVsA99U5UjLXSbyo1DRJDlLKqTeM1ngosqtg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/semver@^7.3.6": + version "7.3.9" + resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" + integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.13.10" + resolved "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/terser-webpack-plugin@^5.0.4": + version "5.2.0" + resolved "https://registry.npmmirror.com/@types/terser-webpack-plugin/-/terser-webpack-plugin-5.2.0.tgz#6aaec696593216917f9f03266bed222f8253483b" + integrity sha512-iHDR2pRfFjGyDqCALX2tgUgFtGoQf2AJhKpC2XD1IMBQVJF2bny6WChGRDKj9eaZJl4F2RmvBhxJNtVPj7aTRw== + dependencies: + terser-webpack-plugin "*" + +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.3" + resolved "https://registry.npmmirror.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz#ee6c7ffe9f8595882ee7bda8af33ae7b8789ef17" + integrity sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw== + dependencies: + "@types/jest" "*" + +"@types/verror@^1.10.3": + version "1.10.5" + resolved "https://registry.npmmirror.com/@types/verror/-/verror-1.10.5.tgz#2a1413aded46e67a1fe2386800e291123ed75eb1" + integrity sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw== + +"@types/webpack-bundle-analyzer@^4.4.1": + version "4.4.1" + resolved "https://registry.npmmirror.com/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.1.tgz#bcc2501be10c8cdd1d170bc6b7847b3321f20440" + integrity sha512-yQAj3l7bIYL+QRRlNJt6gyP+zrXZOlgaR4wsX0WY4yzZIbv41ZibREfZvuYjxY0iVtvQQlbhx0AeokkCuqUAQg== + dependencies: + "@types/node" "*" + tapable "^2.2.0" + webpack "^5" + +"@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.npmmirror.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.1": + version "17.0.10" + resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4.29.2": + version "4.33.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== + dependencies: + "@typescript-eslint/experimental-utils" "4.33.0" + "@typescript-eslint/scope-manager" "4.33.0" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/eslint-plugin@^5.23.0": + version "5.27.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz#fdf59c905354139046b41b3ed95d1609913d0758" + integrity sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw== + dependencies: + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/type-utils" "5.27.1" + "@typescript-eslint/utils" "5.27.1" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.33.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.29.3": + version "4.33.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== + dependencies: + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + debug "^4.3.1" + +"@typescript-eslint/parser@^5.23.0": + version "5.27.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.27.1.tgz#3a4dcaa67e45e0427b6ca7bb7165122c8b569639" + integrity sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ== + dependencies: + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/typescript-estree" "5.27.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + +"@typescript-eslint/scope-manager@5.27.1": + version "5.27.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.27.1.tgz#4d1504392d01fe5f76f4a5825991ec78b7b7894d" + integrity sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg== + dependencies: + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/visitor-keys" "5.27.1" + +"@typescript-eslint/type-utils@5.27.1": + version "5.27.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.27.1.tgz#369f695199f74c1876e395ebea202582eb1d4166" + integrity sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw== + dependencies: + "@typescript-eslint/utils" "5.27.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + +"@typescript-eslint/types@5.27.1": + version "5.27.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.27.1.tgz#34e3e629501349d38be6ae97841298c03a6ffbf1" + integrity sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg== + +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@5.27.1": + version "5.27.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz#7621ee78607331821c16fffc21fc7a452d7bc808" + integrity sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw== + dependencies: + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/visitor-keys" "5.27.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.27.1", "@typescript-eslint/utils@^5.10.0": + version "5.27.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.27.1.tgz#b4678b68a94bc3b85bf08f243812a6868ac5128f" + integrity sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/typescript-estree" "5.27.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + +"@typescript-eslint/visitor-keys@5.27.1": + version "5.27.1" + resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.1.tgz#05a62666f2a89769dac2e6baa48f74e8472983af" + integrity sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ== + dependencies: + "@typescript-eslint/types" "5.27.1" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" + integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== + +"@webpack-cli/info@^1.4.1": + version "1.4.1" + resolved "https://registry.npmmirror.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" + integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.1": + version "1.6.1" + resolved "https://registry.npmmirror.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" + integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0, acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.0.0, acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^7.0.0, acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +acorn@^8.2.4: + version "8.8.2" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +address@^1.0.1: + version "1.2.0" + resolved "https://registry.npmmirror.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.2.1" + resolved "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.0.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== + +antd@^5.6.4: + version "5.6.4" + resolved "https://registry.npmmirror.com/antd/-/antd-5.6.4.tgz#689d74ba61181ba6ea87a0c5d249d30d116ce602" + integrity sha512-ttAN5vk6yUybDCe5WFloEb49dyLwyec+FJlvopfZFSkScHX2OBbfpPlCQ50Bpp2u5P/eqN6EQUM4PsE4MPslAA== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/cssinjs" "^1.10.1" + "@ant-design/icons" "^5.1.0" + "@ant-design/react-slick" "~1.0.0" + "@babel/runtime" "^7.18.3" + "@ctrl/tinycolor" "^3.6.0" + "@rc-component/color-picker" "~1.2.0" + "@rc-component/mutate-observer" "^1.0.0" + "@rc-component/tour" "~1.8.0" + "@rc-component/trigger" "^1.13.0" + classnames "^2.2.6" + copy-to-clipboard "^3.2.0" + dayjs "^1.11.1" + qrcode.react "^3.1.0" + rc-cascader "~3.12.0" + rc-checkbox "~3.1.0" + rc-collapse "~3.7.0" + rc-dialog "~9.1.0" + rc-drawer "~6.2.0" + rc-dropdown "~4.1.0" + rc-field-form "~1.34.0" + rc-image "~5.17.1" + rc-input "~1.0.4" + rc-input-number "~7.4.0" + rc-mentions "~2.3.0" + rc-menu "~9.9.2" + rc-motion "^2.7.3" + rc-notification "~5.0.4" + rc-pagination "~3.5.0" + rc-picker "~3.8.2" + rc-progress "~3.4.1" + rc-rate "~2.12.0" + rc-resize-observer "^1.2.0" + rc-segmented "~2.2.0" + rc-select "~14.5.0" + rc-slider "~10.1.0" + rc-steps "~6.0.0" + rc-switch "~4.1.0" + rc-table "~7.32.1" + rc-tabs "~12.7.0" + rc-textarea "~1.2.2" + rc-tooltip "~6.0.0" + rc-tree "~5.7.4" + rc-tree-select "~5.9.0" + rc-upload "~4.3.0" + rc-util "^5.32.0" + scroll-into-view-if-needed "^3.0.3" + throttle-debounce "^5.0.0" + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@23.0.3: + version "23.0.3" + resolved "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-23.0.3.tgz#44c90237abdc4ad9b34a24658bee022828ad6205" + integrity sha512-1qrtXYHXJfXhzJnMtVGjIva3067F1qYQubl2oBjI61gCBoCHvhghdYJ57XxXTQQ0VxnUhg1/Iaez87uXp8mD8w== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.2.0" + "@malept/flatpak-bundler" "^0.4.0" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chromium-pickle-js "^0.2.0" + debug "^4.3.2" + ejs "^3.1.6" + electron-osx-sign "^0.6.0" + electron-publish "23.0.2" + form-data "^4.0.0" + fs-extra "^10.0.0" + hosted-git-info "^4.0.2" + is-ci "^3.0.0" + isbinaryfile "^4.0.8" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^3.0.4" + read-config-file "6.2.0" + sanitize-filename "^1.6.3" + semver "^7.3.5" + temp-file "^3.4.0" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d" + integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +arg@^5.0.1: + version "5.0.2" + resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.npmmirror.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +aria-query@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" + integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + +array-find@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" + integrity sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.1.1, array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +asar@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473" + integrity sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.npmmirror.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +ast-metadata-inferer@^0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/ast-metadata-inferer/-/ast-metadata-inferer-0.7.0.tgz#c45d874cbdecabea26dc5de11fc6fa1919807c66" + integrity sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q== + dependencies: + "@mdn/browser-compat-data" "^3.3.14" + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmmirror.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async-validator@^4.1.0: + version "4.2.5" + resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" + integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== + +async@^3.2.3, async@^3.2.4: + version "3.2.4" + resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^10.4.7: + version "10.4.7" + resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" + integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== + dependencies: + browserslist "^4.20.3" + caniuse-lite "^1.0.30001335" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axe-core@^4.0.2, axe-core@^4.3.5: + version "4.4.2" + resolved "https://registry.npmmirror.com/axe-core/-/axe-core-4.4.2.tgz#dcf7fb6dea866166c3eab33d68208afe4d5f670c" + integrity sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.npmmirror.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.0, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.13" + resolved "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.0.13.tgz#4ac003dc1626023252d58adf2946f57e5da450c1" + integrity sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.npmmirror.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserslist-config-erb@^0.0.3: + version "0.0.3" + resolved "https://registry.npmmirror.com/browserslist-config-erb/-/browserslist-config-erb-0.0.3.tgz#db7f06fe5b1ce2ab9f09e78ac4d5a9f572e188a4" + integrity sha512-y47DryCY92lxkKyRVMlaZvXAolIY7U33q9e4CS0MdWeJkoAht7OzsrkfdZFCBOP3H5q1EVUxS0L7VVsKM6gZCQ== + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.16.8, browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.4" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" + integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== + dependencies: + caniuse-lite "^1.0.30001349" + electron-to-chromium "^1.4.147" + escalade "^3.1.1" + node-releases "^2.0.5" + picocolors "^1.0.0" + +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmmirror.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.1.0, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builder-util-runtime@9.0.0: + version "9.0.0" + resolved "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz#3a40ba7382712ccdb24471567f91d7c167e00830" + integrity sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA== + dependencies: + debug "^4.3.2" + sax "^1.2.4" + +builder-util@23.0.2: + version "23.0.2" + resolved "https://registry.npmmirror.com/builder-util/-/builder-util-23.0.2.tgz#da84a971076397e3a671726f4bb96f0c2214fea7" + integrity sha512-HaNHL3axNW/Ms8O1mDx3I07G+ZnZ/TKSWWvorOAPau128cdt9S+lNx5ocbx8deSaHHX4WFXSZVHh3mxlaKJNgg== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.2" + fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2, bytes@^3.0.0: + version "3.1.2" + resolved "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.npmmirror.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.2: + version "7.0.2" + resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001304, caniuse-lite@^1.0.30001335, caniuse-lite@^1.0.30001349: + version "1.0.30001352" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz#cc6f5da3f983979ad1e2cdbae0505dccaa7c6a12" + integrity sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA== + +caniuse-lite@^1.0.30001449: + version "1.0.30001456" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001456.tgz#734ec1dbfa4f3abe6e435b78ecf40d68e8c32ce4" + integrity sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.3.1" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" + integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +clean-css@^5.2.2: + version "5.3.0" + resolved "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" + integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmmirror.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^4.0.1: + version "4.2.3" + resolved "https://registry.npmmirror.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +colord@^2.9.1: + version "2.9.2" + resolved "https://registry.npmmirror.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16: + version "2.0.17" + resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.17.tgz#5dd4c0d15e2984b7433cb4a9f2ead45063b80c47" + integrity sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.npmmirror.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.18.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.0.0, commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commander@^9.3.0: + version "9.3.0" + resolved "https://registry.npmmirror.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" + integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== + +compress-brotli@^1.3.8: + version "1.3.8" + resolved "https://registry.npmmirror.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db" + integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ== + dependencies: + "@types/json-buffer" "~3.0.0" + json-buffer "~3.0.1" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz#c418900a5c56e2b04b885b54995df164535962b1" + integrity sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concurrently@^7.6.0: + version "7.6.0" + resolved "https://registry.npmmirror.com/concurrently/-/concurrently-7.6.0.tgz#531a6f5f30cf616f355a4afb8f8fcb2bba65a49a" + integrity sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw== + dependencies: + chalk "^4.1.0" + date-fns "^2.29.1" + lodash "^4.17.21" + rxjs "^7.0.0" + shell-quote "^1.7.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^17.3.1" + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.npmmirror.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + +copy-to-clipboard@^3.2.0: + version "3.3.3" + resolved "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.22.8" + resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.22.8.tgz#46fa34ce1ddf742acd7f95f575f66bbb21e05d62" + integrity sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg== + dependencies: + browserslist "^4.20.3" + semver "7.0.0" + +core-js-pure@^3.20.2, core-js-pure@^3.8.1: + version "3.22.8" + resolved "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.22.8.tgz#f2157793b58719196ccf9673cc14f3683adc0957" + integrity sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w== + +core-js@^3.16.2, core-js@^3.22.5: + version "3.22.8" + resolved "https://registry.npmmirror.com/core-js/-/core-js-3.22.8.tgz#23f860b1fe60797cc4f704d76c93fea8a2f60631" + integrity sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.12.0: + version "3.12.0" + resolved "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.npmmirror.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== + +css-declaration-sorter@^6.2.2: + version "6.3.0" + resolved "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz#72ebd995c8f4532ff0036631f7365cce9759df14" + integrity sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og== + +css-loader@^5.2.6: + version "5.2.7" + resolved "https://registry.npmmirror.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== + dependencies: + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@^3.4.1: + version "3.4.1" + resolved "https://registry.npmmirror.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-unit-converter@^1.1.1: + version "1.1.2" + resolved "https://registry.npmmirror.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.2.11: + version "5.2.11" + resolved "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-5.2.11.tgz#28350471bc1af9df14052472b61340347f453a53" + integrity sha512-4PadR1NtuaIK8MvLNuY7MznK4WJteldGlzCiMaaTiOUP+apeiIvUDIXykzUOoqgOOUAHrU64ncdD90NfZR3LSQ== + dependencies: + css-declaration-sorter "^6.2.2" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.2" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.5" + postcss-merge-rules "^5.1.2" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.3" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.0" + postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.2" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.6: + version "5.1.11" + resolved "https://registry.npmmirror.com/cssnano/-/cssnano-5.1.11.tgz#3bb003380718c7948ce3813493370e8946caf04b" + integrity sha512-2nx+O6LvewPo5EBtYrKc8762mMkZRk9cMGIOP4UlkmxHm7ObxH+zvsJJ+qLwPkUc4/yumL/qJkavYi9NlodWIQ== + dependencies: + cssnano-preset-default "^5.2.11" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.npmmirror.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.10: + version "3.1.2" + resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +csstype@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + +damerau-levenshtein@^1.0.6, damerau-levenshtein@^1.0.7: + version "1.0.8" + resolved "https://registry.npmmirror.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-fns@^2.29.1: + version "2.29.3" + resolved "https://registry.npmmirror.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + +dayjs@^1.11.1: + version "1.11.9" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + +debug@2.6.9, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.6, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decimal.js@^10.2.1: + version "10.4.3" + resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detective@^5.2.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== + dependencies: + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dmg-builder@23.0.3: + version "23.0.3" + resolved "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-23.0.3.tgz#ea94bc76fcd94612641580f3c6ae42c3f07f3fee" + integrity sha512-mBYrHHnSM5PC656TDE+xTGmXIuWHAGmmRfyM+dV0kP+AxtwPof4pAXNQ8COd0/exZQ4dqf72FiPS3B9G9aB5IA== + dependencies: + app-builder-lib "23.0.3" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + fs-extra "^10.0.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.9" + +dmg-license@^1.0.9: + version "1.0.11" + resolved "https://registry.npmmirror.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.3.1" + resolved "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d" + integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.14" + resolved "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + +dom-align@^1.7.0: + version "1.12.4" + resolved "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz#3503992eb2a7cfcb2ed3b2a6d21e0b9c00d54511" + integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw== + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^16.0.1: + version "16.0.1" + resolved "https://registry.npmmirror.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" + integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.npmmirror.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.6: + version "3.1.8" + resolved "https://registry.npmmirror.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + +electron-builder@^23.0.3: + version "23.0.3" + resolved "https://registry.npmmirror.com/electron-builder/-/electron-builder-23.0.3.tgz#16264a0d8e3d40da1467bcc8ef7917538b54a3bc" + integrity sha512-0lnTsljAgcOMuIiOjPcoFf+WxOOe/O04hZPgIvvUBXIbz3kolbNu0Xdch1f5WuQ40NdeZI7oqs8Eo395PcuGHQ== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "23.0.3" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + dmg-builder "23.0.3" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + update-notifier "^5.1.0" + yargs "^17.0.1" + +electron-debug@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/electron-debug/-/electron-debug-3.2.0.tgz#46a15b555c3b11872218c65ea01d058aa0814920" + integrity sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow== + dependencies: + electron-is-dev "^1.1.0" + electron-localshortcut "^3.1.0" + +electron-devtools-installer@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz#acc48d24eb7033fe5af284a19667e73b78d406d0" + integrity sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ== + dependencies: + rimraf "^3.0.2" + semver "^7.2.1" + tslib "^2.1.0" + unzip-crx-3 "^0.2.0" + +electron-is-accelerator@^0.1.0: + version "0.1.2" + resolved "https://registry.npmmirror.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" + integrity sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA== + +electron-is-dev@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe" + integrity sha512-jLttuuq8QK67n3mXmIe9pkrO7IH3LGIk12xJkhTmc852U2sCJaRAOpRGPSh+1Xnzck5v9escd9YXzuze9nGejg== + +electron-is-dev@^1.1.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" + integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== + +electron-is@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/electron-is/-/electron-is-3.0.0.tgz#bd4c27651fbe03f243f3607c2a098be884f9ed50" + integrity sha512-aQv1y3WrDZ+mtO8acbhiiip/8fa0Et7cvZyvlqJm2H7fih4hiJWEFRyYxzLgDG2kmiLdF8l3y5tbek5JFOPQkQ== + dependencies: + electron-is-dev "^0.3.0" + semver "^5.5.0" + +electron-localshortcut@^3.1.0: + version "3.2.1" + resolved "https://registry.npmmirror.com/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz#cfc83a3eff5e28faf98ddcc87f80a2ce4f623cd3" + integrity sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q== + dependencies: + debug "^4.0.1" + electron-is-accelerator "^0.1.0" + keyboardevent-from-electron-accelerator "^2.0.0" + keyboardevents-areequal "^0.2.1" + +electron-log@^4.4.7: + version "4.4.7" + resolved "https://registry.npmmirror.com/electron-log/-/electron-log-4.4.7.tgz#d55b7232c019521694c3503d2109e5a49cb49dd0" + integrity sha512-uFZQdgevOp9Fn5lDOrJMU/bmmYxDLZitbIHJM7VXN+cpB59ZnPt1FQL4bOf/Dl2gaIMPYJEfXx38GvJma5iV6A== + +electron-notarize@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/electron-notarize/-/electron-notarize-1.2.1.tgz#347c18eca8e29dddadadee511b870c13d4008baf" + integrity sha512-u/ECWhIrhkSQpZM4cJzVZ5TsmkaqrRo5LDC/KMbGF0sPkm53Ng59+M0zp8QVaql0obfJy9vlVT+4iOkAi2UDlA== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +electron-osx-sign@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" + integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@23.0.2: + version "23.0.2" + resolved "https://registry.npmmirror.com/electron-publish/-/electron-publish-23.0.2.tgz#aa11419ae57b847df4beb63b95e2b2a43161957c" + integrity sha512-8gMYgWqv96lc83FCm85wd+tEyxNTJQK7WKyPkNkO8GxModZqt1GO8S+/vAnFGxilS/7vsrVRXFfqiCDUCSuxEg== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "23.0.2" + builder-util-runtime "9.0.0" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron-rebuild@^3.2.7: + version "3.2.7" + resolved "https://registry.npmmirror.com/electron-rebuild/-/electron-rebuild-3.2.7.tgz#0f56c1cc99a6fec0a5b990532283c2a8c838c19b" + integrity sha512-WvaW1EgRinDQ61khHFZfx30rkPQG5ItaOT0wrI7iJv9A3SbghriQGfZQfHZs25fWLBe6/vkv05LOqg6aDw6Wzw== + dependencies: + "@malept/cross-spawn-promise" "^2.0.0" + chalk "^4.0.0" + debug "^4.1.1" + detect-libc "^1.0.3" + fs-extra "^10.0.0" + got "^11.7.0" + lzma-native "^8.0.5" + node-abi "^3.0.0" + node-api-version "^0.1.4" + node-gyp "^8.4.0" + ora "^5.1.0" + semver "^7.3.5" + tar "^6.0.5" + yargs "^17.0.1" + +electron-serve@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/electron-serve/-/electron-serve-1.1.0.tgz#507f56c8512c501880d3a9bec792fa92512af378" + integrity sha512-tQJBCbXKoKCfkBC143QCqnEtT1s8dNE2V+b/82NF6lxnGO/2Q3a3GSLHtKl3iEDQgdzTf9pH7p418xq2rXbz1Q== + +electron-to-chromium@^1.4.147: + version "1.4.152" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.152.tgz#7dedbe8f3dc1c597088982a203f392e60f7ee90a" + integrity sha512-jk4Ju5SGZAQQJ1iI4Rgru7dDlvkQPLpNPWH9gIZmwCD4YteA5Bbk1xPcPDUf5jUYs3e1e80RXdi8XgKQZaigeg== + +electron-to-chromium@^1.4.284: + version "1.4.302" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.302.tgz#5770646ffe7051677b489226144aad9386d420f2" + integrity sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw== + +electron-updater@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/electron-updater/-/electron-updater-5.0.1.tgz#327915f1b2e573daf1ce1d8102bcab93f4880c1a" + integrity sha512-dNnXPCqYmergXy3jgg4UICuD50Orug9GQe/5xfHy+BE2Fy0icB0QE+y6iQWdCDf7yeONxwMBf4HgIkGG5pIaVg== + dependencies: + "@types/semver" "^7.3.6" + builder-util-runtime "9.0.0" + fs-extra "^10.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + lodash.escaperegexp "^4.1.2" + lodash.isequal "^4.5.0" + semver "^7.3.5" + +electron-window-state@^5.0.3: + version "5.0.3" + resolved "https://registry.npmmirror.com/electron-window-state/-/electron-window-state-5.0.3.tgz#4f36d09e3f953d87aff103bf010f460056050aa8" + integrity sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg== + dependencies: + jsonfile "^4.0.0" + mkdirp "^0.5.1" + +electron@^18.2.3: + version "18.3.3" + resolved "https://registry.npmmirror.com/electron/-/electron-18.3.3.tgz#1c48273c1ad1522b8c18f19575e862c7ccd9f409" + integrity sha512-LYxf3uCDc/r0klu7LL0eZLxkseoGIY/vrCfS0Qj4YTU3M7LLjOaIqrajI7icKwaI2dgxiuJJH3n4eqALFpJAFg== + dependencies: + "@electron/get" "^1.13.0" + "@types/node" "^16.11.26" + extract-zip "^1.0.3" + +electronmon@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/electronmon/-/electronmon-2.0.2.tgz#082cb4c7cd5eee0602308c3253b17ecbef77aea8" + integrity sha512-Yw1CXEp5HJT9P6Sns3UP3Krwm5eb2JKqTRAVczKdsUa+U/dMTgONwKIHkPbKSSmtyTV+5JwobxkhFPiRgegObA== + dependencies: + chalk "^3.0.0" + import-from "^3.0.0" + runtime-required "^1.1.0" + watchboy "^0.4.3" + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.npmmirror.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +email-addresses@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/email-addresses/-/email-addresses-5.0.0.tgz#7ae9e7f58eef7d5e3e2c2c2d3ea49b78dc854fa6" + integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.npmmirror.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.0.0, emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@^1.0.2, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^0.9.1: + version "0.9.1" + resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + integrity sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + +enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.3: + version "5.9.3" + resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enhanced-resolve@^5.7.0: + version "5.15.0" + resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.npmmirror.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.1" + resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +esbuild-android-64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.43.tgz#59bf3edad6863c27aa92bbb5c1d83a9a5c981495" + integrity sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg== + +esbuild-android-arm64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.43.tgz#0258704edf92ce2463af6d2900b844b5423bed63" + integrity sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA== + +esbuild-darwin-64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.43.tgz#72a47295678d4aa0656979baa8cf6d5c8c92656f" + integrity sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg== + +esbuild-darwin-arm64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.43.tgz#5f5823170b8d85b888957f0794e186caac447aca" + integrity sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw== + +esbuild-freebsd-64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.43.tgz#e4a48b08181053837e6cd9bda19ae0af94d493b0" + integrity sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA== + +esbuild-freebsd-arm64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.43.tgz#386e780d36c1dedf3a1cdab79e0bbacd873274e6" + integrity sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA== + +esbuild-linux-32@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.43.tgz#040ed6b9ebf06d73acdf2acce7f1cd0c12fbc6a5" + integrity sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw== + +esbuild-linux-64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.43.tgz#8abbb7594ab6a008f2aae72d95d8a4fdc59d9000" + integrity sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw== + +esbuild-linux-arm64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.43.tgz#4e8e9ce77cbf7efec65e79e512b3d2fbd2da398f" + integrity sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ== + +esbuild-linux-arm@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.43.tgz#9e41ee5e099c0ffdfd150da154330c2c0226cc96" + integrity sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg== + +esbuild-linux-mips64le@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.43.tgz#4b41f465a787f91cc4fe7dffa0dcabf655935a1a" + integrity sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA== + +esbuild-linux-ppc64le@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.43.tgz#ca15934f5b46728dd9ac05270e783e7feaca9eaf" + integrity sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA== + +esbuild-linux-riscv64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.43.tgz#70fce2b5a0605a67e58b5a357b0e00be1029836d" + integrity sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw== + +esbuild-linux-s390x@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.43.tgz#318d03b4f4ccc7fa44ac7562121cf4a4529e477a" + integrity sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ== + +esbuild-loader@^2.19.0: + version "2.19.0" + resolved "https://registry.npmmirror.com/esbuild-loader/-/esbuild-loader-2.19.0.tgz#54f62d1da8262acfc3c5883c24da35af8324f116" + integrity sha512-urGNVE6Tl2rqx92ElKi/LiExXjGvcH6HfDBFzJ9Ppwqh4n6Jmx8x7RKAyMzSM78b6CAaJLhDncG5sPrL0ROh5Q== + dependencies: + esbuild "^0.14.39" + joycon "^3.0.1" + json5 "^2.2.0" + loader-utils "^2.0.0" + tapable "^2.2.0" + webpack-sources "^2.2.0" + +esbuild-netbsd-64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.43.tgz#86130ce204ef0162a96e863b55851efecc92f423" + integrity sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ== + +esbuild-openbsd-64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.43.tgz#0229dc2db2ded97b03bb93bba7646b30ffdf5d0d" + integrity sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg== + +esbuild-sunos-64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.43.tgz#17e316216eb9f1de25d52a9000356ae5b869e736" + integrity sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q== + +esbuild-windows-32@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.43.tgz#a173757bc6dfd0f2656ff40b64f7f9290745778e" + integrity sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw== + +esbuild-windows-64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.43.tgz#c447b23126aad158c4fe6a394342cafd97926ed1" + integrity sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw== + +esbuild-windows-arm64@0.14.43: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.43.tgz#3caed1b430d394d7a7836407b9d36c4750246e76" + integrity sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw== + +esbuild@^0.14.39: + version "0.14.43" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.43.tgz#c227d585c512d3e0f23b88f50b8e16501147f647" + integrity sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA== + optionalDependencies: + esbuild-android-64 "0.14.43" + esbuild-android-arm64 "0.14.43" + esbuild-darwin-64 "0.14.43" + esbuild-darwin-arm64 "0.14.43" + esbuild-freebsd-64 "0.14.43" + esbuild-freebsd-arm64 "0.14.43" + esbuild-linux-32 "0.14.43" + esbuild-linux-64 "0.14.43" + esbuild-linux-arm "0.14.43" + esbuild-linux-arm64 "0.14.43" + esbuild-linux-mips64le "0.14.43" + esbuild-linux-ppc64le "0.14.43" + esbuild-linux-riscv64 "0.14.43" + esbuild-linux-s390x "0.14.43" + esbuild-netbsd-64 "0.14.43" + esbuild-openbsd-64 "0.14.43" + esbuild-sunos-64 "0.14.43" + esbuild-windows-32 "0.14.43" + esbuild-windows-64 "0.14.43" + esbuild-windows-arm64 "0.14.43" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-airbnb-base@^14.2.1: + version "14.2.1" + resolved "https://registry.npmmirror.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.2" + +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.npmmirror.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@^13.0.0: + version "13.0.1" + resolved "https://registry.npmmirror.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-13.0.1.tgz#007e841efaf72aefae812afd68ac377c644a4cf2" + integrity sha512-n7fGBDNV3xSKbWDUES2FfsNAJhuqADcwzshX6ci6qoszUnH6p4dzrLnSFqYkw5Sn7M+aarp2BTf7JDOK88M+bg== + +eslint-config-airbnb@^18.2.1: + version "18.2.1" + resolved "https://registry.npmmirror.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" + integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== + dependencies: + eslint-config-airbnb-base "^14.2.1" + object.assign "^4.1.2" + object.entries "^1.1.2" + +eslint-config-erb@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/eslint-config-erb/-/eslint-config-erb-4.0.3.tgz#0125f417934e86589dc76b3b238b4767f95e2d50" + integrity sha512-qZeiUSQanpCKKazkLzIvVaoM9NZcNvqhO7gYZ2jaEpBmadCu1aOzzvMMtjsoxaDytRQt6mt+uXjWGyJNqUYusw== + dependencies: + "@typescript-eslint/eslint-plugin" "^4.29.2" + "@typescript-eslint/parser" "^4.29.3" + eslint-config-airbnb "^18.2.1" + eslint-config-airbnb-typescript "^13.0.0" + eslint-config-prettier "^8.3.0" + eslint-import-resolver-webpack "^0.13.1" + eslint-plugin-compat "^3.13.0" + eslint-plugin-import "^2.24.1" + eslint-plugin-jest "^24.4.0" + eslint-plugin-jsx-a11y "6.4.1" + eslint-plugin-prettier "^3.4.1" + eslint-plugin-promise "^5.1.0" + eslint-plugin-react "^7.24.0" + eslint-plugin-react-hooks "^4.2.0" + +eslint-config-prettier@^8.3.0: + version "8.5.0" + resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.npmmirror.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-import-resolver-typescript@^2.7.1: + version "2.7.1" + resolved "https://registry.npmmirror.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" + integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== + dependencies: + debug "^4.3.4" + glob "^7.2.0" + is-glob "^4.0.3" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-import-resolver-webpack@^0.13.1, eslint-import-resolver-webpack@^0.13.2: + version "0.13.2" + resolved "https://registry.npmmirror.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.2.tgz#fc813df0d08b9265cc7072d22393bda5198bdc1e" + integrity sha512-XodIPyg1OgE2h5BDErz3WJoK7lawxKTJNhgPNafRST6csC/MZC+L5P6kKqsZGRInpbgc02s/WZMrb4uGJzcuRg== + dependencies: + array-find "^1.0.0" + debug "^3.2.7" + enhanced-resolve "^0.9.1" + find-root "^1.1.0" + has "^1.0.3" + interpret "^1.4.0" + is-core-module "^2.7.0" + is-regex "^1.1.4" + lodash "^4.17.21" + resolve "^1.20.0" + semver "^5.7.1" + +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-compat@^3.13.0: + version "3.13.0" + resolved "https://registry.npmmirror.com/eslint-plugin-compat/-/eslint-plugin-compat-3.13.0.tgz#fade6f2ad25263cf93f8d23c988533551ced8663" + integrity sha512-cv8IYMuTXm7PIjMVDN2y4k/KVnKZmoNGHNq27/9dLstOLydKblieIv+oe2BN2WthuXnFNhaNvv3N1Bvl4dbIGA== + dependencies: + "@mdn/browser-compat-data" "^3.3.14" + ast-metadata-inferer "^0.7.0" + browserslist "^4.16.8" + caniuse-lite "^1.0.30001251" + core-js "^3.16.2" + find-up "^5.0.0" + lodash.memoize "4.1.2" + semver "7.3.5" + +eslint-plugin-compat@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz#b058627a7d25d352adf0ec16dca8fcf92d9c7af7" + integrity sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg== + dependencies: + "@mdn/browser-compat-data" "^4.1.5" + ast-metadata-inferer "^0.7.0" + browserslist "^4.16.8" + caniuse-lite "^1.0.30001304" + core-js "^3.16.2" + find-up "^5.0.0" + lodash.memoize "4.1.2" + semver "7.3.5" + +eslint-plugin-import@^2.24.1, eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^24.4.0: + version "24.7.0" + resolved "https://registry.npmmirror.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889" + integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-jest@^26.2.2: + version "26.5.3" + resolved "https://registry.npmmirror.com/eslint-plugin-jest/-/eslint-plugin-jest-26.5.3.tgz#a3ceeaf4a757878342b8b00eca92379b246e5505" + integrity sha512-sICclUqJQnR1bFRZGLN2jnSVsYOsmPYYnroGCIMVSvTS3y8XR3yjzy1EcTQmk6typ5pRgyIWzbjqxK6cZHEZuQ== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-jsx-a11y@6.4.1: + version "6.4.1" + resolved "https://registry.npmmirror.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.5.1" + resolved "https://registry.npmmirror.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" + integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== + dependencies: + "@babel/runtime" "^7.16.3" + aria-query "^4.2.2" + array-includes "^3.1.4" + ast-types-flow "^0.0.7" + axe-core "^4.3.5" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.7" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.2.1" + language-tags "^1.0.5" + minimatch "^3.0.4" + +eslint-plugin-prettier@^3.4.1: + version "3.4.1" + resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" + integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-promise@^5.1.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" + integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== + +eslint-plugin-promise@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" + integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== + +eslint-plugin-react-hooks@^4.2.0, eslint-plugin-react-hooks@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" + integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== + +eslint-plugin-react@^7.24.0, eslint-plugin-react@^7.29.4: + version "7.30.0" + resolved "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz#8e7b1b2934b8426ac067a0febade1b13bd7064e3" + integrity sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.15.0: + version "8.17.0" + resolved "https://registry.npmmirror.com/eslint/-/eslint-8.17.0.tgz#1cfc4b6b6912f77d24b874ca1506b0fe09328c21" + integrity sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.npmmirror.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^5.0.0, execa@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +express@^4.17.3, express@^4.18.1: + version "4.18.1" + resolved "https://registry.npmmirror.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extract-zip@^1.0.3: + version "1.7.0" + resolved "https://registry.npmmirror.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.12: + version "3.2.12" + resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.npmmirror.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.npmmirror.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== + +filenamify@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" + integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" + trim-repeated "^1.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +follow-redirects@^1.0.0: + version "1.15.1" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.npmmirror.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-port@5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +gh-pages@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/gh-pages/-/gh-pages-5.0.0.tgz#e0893272a0e33f0453e53a3c017c33b91ddd6394" + integrity sha512-Nqp1SjkPIB94Xw/3yYNTUL+G2dxlhjvv1zeN/4kMC1jfViTEqhtVz/Ba1zSXHuvXCN9ADNS1dN4r5/J/nZWEQQ== + dependencies: + async "^3.2.4" + commander "^2.18.0" + email-addresses "^5.0.0" + filenamify "^4.3.0" + find-cache-dir "^3.3.1" + fs-extra "^8.1.0" + globby "^6.1.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.npmmirror.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.15.0" + resolved "https://registry.npmmirror.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" + integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.3, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.1.1" + resolved "https://registry.npmmirror.com/globby/-/globby-13.1.1.tgz#7c44a93869b0b7612e38f22ed532bfe37b25ea6f" + integrity sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^11.7.0: + version "11.8.5" + resolved "https://registry.npmmirror.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" + integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.npmmirror.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.npmmirror.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.npmmirror.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^4.0.2: + version "4.1.0" + resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A== + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmmirror.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-tags@^3.1.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== + +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.6" + resolved "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.6.tgz#2e02406ab2df8af8a7abfba62e0da01c62b95afd" + integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + +immer@^10.0.2: + version "10.0.2" + resolved "https://registry.npmmirror.com/immer/-/immer-10.0.2.tgz#11636c5b77acf529e059582d76faf338beb56141" + integrity sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA== + +immutable@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +ip@^1.1.5: + version "1.1.8" + resolved "https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-color-stop@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + 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" + +is-core-module@^2.2.0, is-core-module@^2.7.0, is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.4" + resolved "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@27.5.1, jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-util@^27.0.0, jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +joycon@^3.0.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.npmmirror.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-buffer@3.0.1, json-buffer@~3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== + dependencies: + string-convert "^0.2.0" + +json5@2.x, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0, jsx-ast-utils@^3.2.1: + version "3.3.0" + resolved "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" + integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== + dependencies: + array-includes "^3.1.4" + object.assign "^4.1.2" + +jszip@^3.1.0: + version "3.10.0" + resolved "https://registry.npmmirror.com/jszip/-/jszip-3.10.0.tgz#faf3db2b4b8515425e34effcdbb086750a346061" + integrity sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + +keyboardevent-from-electron-accelerator@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz#ace21b1aa4e47148815d160057f9edb66567c50c" + integrity sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA== + +keyboardevents-areequal@^0.2.1: + version "0.2.2" + resolved "https://registry.npmmirror.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" + integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw== + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.0.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/keyv/-/keyv-4.3.0.tgz#b4352e0e4fe7c94111947d6738a6d3fe7903027c" + integrity sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ== + dependencies: + compress-brotli "^1.3.8" + json-buffer "3.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4, klona@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.npmmirror.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + +less-loader@^10.0.0: + version "10.2.0" + resolved "https://registry.npmmirror.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32" + integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== + dependencies: + klona "^2.0.4" + +less@^4.1.3: + version "4.1.3" + resolved "https://registry.npmmirror.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" + integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +lilconfig@2.0.5, lilconfig@^2.0.3, lilconfig@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^12.4.1: + version "12.5.0" + resolved "https://registry.npmmirror.com/lint-staged/-/lint-staged-12.5.0.tgz#d6925747480ae0e380d13988522f9dd8ef9126e3" + integrity sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.16" + commander "^9.3.0" + debug "^4.3.4" + execa "^5.1.1" + lilconfig "2.0.5" + listr2 "^4.0.5" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.2" + pidtree "^0.5.0" + string-argv "^0.3.1" + supports-color "^9.2.2" + yaml "^1.10.2" + +listr2@^4.0.5: + version "4.0.5" + resolved "https://registry.npmmirror.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" + integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.5" + through "^2.3.8" + wrap-ansi "^7.0.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.memoize@4.1.2, lodash.memoize@4.x, lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.topath@^4.5.2: + version "4.5.2" + resolved "https://registry.npmmirror.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.npmmirror.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== + +lzma-native@^8.0.5: + version "8.0.6" + resolved "https://registry.npmmirror.com/lzma-native/-/lzma-native-8.0.6.tgz#3ea456209d643bafd9b5d911781bdf0b396b2665" + integrity sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA== + dependencies: + node-addon-api "^3.1.0" + node-gyp-build "^4.2.1" + readable-stream "^3.6.0" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.npmmirror.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.4.4" + resolved "https://registry.npmmirror.com/memfs/-/memfs-3.4.4.tgz#e8973cd8060548916adcca58a248e7805c715e89" + integrity sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA== + dependencies: + fs-monkey "1.0.3" + +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + integrity sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.6.0: + version "2.6.0" + resolved "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" + integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.npmmirror.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.1.6" + resolved "https://registry.npmmirror.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + dependencies: + yallist "^4.0.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^0.5.1, mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +modern-normalize@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" + integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA== + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +needle@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/needle/-/needle-3.1.0.tgz#3bf5cd090c28eb15644181ab6699e027bd6c53c9" + integrity sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw== + dependencies: + debug "^3.2.6" + iconv-lite "^0.6.3" + sax "^1.2.4" + +negotiator@0.6.3, negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-abi@^3.0.0: + version "3.22.0" + resolved "https://registry.npmmirror.com/node-abi/-/node-abi-3.22.0.tgz#00b8250e86a0816576258227edbce7bbe0039362" + integrity sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w== + dependencies: + semver "^7.3.5" + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-addon-api@^3.1.0: + version "3.2.1" + resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-api-version@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" + integrity sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g== + dependencies: + semver "^7.3.5" + +node-emoji@^1.11.0: + version "1.11.0" + resolved "https://registry.npmmirror.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-gyp-build@^4.2.1: + version "4.4.0" + resolved "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + +node-gyp@^8.4.0: + version "8.4.1" + resolved "https://registry.npmmirror.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.npmmirror.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-inspect@^1.12.0, object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.2, object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.npmmirror.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.npmmirror.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.1.0: + version "5.4.1" + resolved "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.npmmirror.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1" + integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +plist@^3.0.1, plist@^3.0.4: + version "3.0.5" + resolved "https://registry.npmmirror.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" + integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^9.0.7" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz#31586df4e184c2e8890e8b34a0b9355313f503ab" + integrity sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g== + dependencies: + browserslist "^4.20.3" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-js@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" + integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== + dependencies: + camelcase-css "^2.0.1" + postcss "^8.1.6" + +postcss-load-config@^3.1.0: + version "3.1.4" + resolved "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-loader@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-7.0.0.tgz#367d10eb1c5f1d93700e6b399683a6dc7c3af396" + integrity sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.7" + +postcss-merge-longhand@^5.1.5: + version "5.1.5" + resolved "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz#b0e03bee3b964336f5f33c4fc8eacae608e91c05" + integrity sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" + +postcss-merge-rules@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz#7049a14d4211045412116d79b751def4484473a5" + integrity sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.3: + version "5.1.3" + resolved "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9" + integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== + dependencies: + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@5.0.6: + version "5.0.6" + resolved "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz#902a7cb97cf0b9e8b1b654d4a43d451e48966458" + integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz#f6d6fd5a54f51a741cc84a37f7459e60ef7a6398" + integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== + dependencies: + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-5.1.2.tgz#daffacd4abf327d52d5ac570b59dfbcf4b836614" + integrity sha512-wr2avRbW4HS2XE2ZCqpfp4N/tDC6GZKZ+SVP8UBTOVS8QWrc4TD8MYrebJrvVVlGPKszmiSCzue43NDiVtgDmg== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: + version "6.0.10" + resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.1.6, postcss@^8.2.15, postcss@^8.3.5: + version "8.4.14" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@*, prettier@^2.6.2: + version "2.6.2" + resolved "https://registry.npmmirror.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.npmmirror.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmmirror.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +purgecss@^4.0.3: + version "4.1.3" + resolved "https://registry.npmmirror.com/purgecss/-/purgecss-4.1.3.tgz#683f6a133c8c4de7aa82fe2746d1393b214918f7" + integrity sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw== + dependencies: + commander "^8.0.0" + glob "^7.1.7" + postcss "^8.3.5" + postcss-selector-parser "^6.0.6" + +qrcode.react@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/qrcode.react/-/qrcode.react-3.1.0.tgz#5c91ddc0340f768316fbdb8fff2765134c2aecd8" + integrity sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q== + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-align@^4.0.0: + version "4.0.15" + resolved "https://registry.npmmirror.com/rc-align/-/rc-align-4.0.15.tgz#2bbd665cf85dfd0b0244c5a752b07565e9098577" + integrity sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + dom-align "^1.7.0" + rc-util "^5.26.0" + resize-observer-polyfill "^1.5.1" + +rc-cascader@~3.12.0: + version "3.12.0" + resolved "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.12.0.tgz#709fdbede6c36f7e62d0daea76ba76b825cc7182" + integrity sha512-QTeGPTNYX33alozNy9lYg7YKpvYVwquai/mrFRR8mHlHnK7QlqJyMqbs2p7rc5eeKARKMRTUeoN5CfO+Gr9UBw== + dependencies: + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + classnames "^2.3.1" + rc-select "~14.5.0" + rc-tree "~5.7.0" + rc-util "^5.6.1" + +rc-checkbox@~3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/rc-checkbox/-/rc-checkbox-3.1.0.tgz#6be0d9d8de2cc96fb5e37f9036a1c3e360d0a42d" + integrity sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.3.2" + rc-util "^5.25.2" + +rc-collapse@~3.7.0: + version "3.7.0" + resolved "https://registry.npmmirror.com/rc-collapse/-/rc-collapse-3.7.0.tgz#75116b7142371940ff9fdce61a9e48561b53bbfc" + integrity sha512-Cir1c89cENiK5wryd9ut+XltrIfx/+KH1/63uJIVjuXkgfrIvIy6W1fYGgEYtttbHW2fEfxg1s31W+Vm98fSRw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.3.4" + rc-util "^5.27.0" + +rc-dialog@~9.1.0: + version "9.1.0" + resolved "https://registry.npmmirror.com/rc-dialog/-/rc-dialog-9.1.0.tgz#6bf6fcc0453503b7643e54a5a445e835e3850649" + integrity sha512-5ry+JABAWEbaKyYsmITtrJbZbJys8CtMyzV8Xn4LYuXMeUx5XVHNyJRoqLFE4AzBuXXzOWeaC49cg+XkxK6kHA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.0.0-8" + classnames "^2.2.6" + rc-motion "^2.3.0" + rc-util "^5.21.0" + +rc-drawer@~6.2.0: + version "6.2.0" + resolved "https://registry.npmmirror.com/rc-drawer/-/rc-drawer-6.2.0.tgz#fddf4825b0fa9d60e317b996f70278d594d1f668" + integrity sha512-spPkZ3WvP0U0vy5dyzSwlUJ/+vLFtjP/cTwSwejhQRoDBaexSZHsBhELoCZcEggI7LQ7typmtG30lAue2HEhvA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.1.1" + classnames "^2.2.6" + rc-motion "^2.6.1" + rc-util "^5.21.2" + +rc-dropdown@~4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-4.1.0.tgz#418a68939631520de80d0865d02b440eeeb4168e" + integrity sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw== + dependencies: + "@babel/runtime" "^7.18.3" + "@rc-component/trigger" "^1.7.0" + classnames "^2.2.6" + rc-util "^5.17.0" + +rc-field-form@~1.34.0: + version "1.34.1" + resolved "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.34.1.tgz#31be2ca12c7e37a4873e776dc7aee27965df53d8" + integrity sha512-oohdrjUHYWzY4H5EOw/9xk324oatZOKiCfo3FwnK9G/LswoqflWoxeaAGMkjI5Ug4YxSq80fehoJjVYApSheYA== + dependencies: + "@babel/runtime" "^7.18.0" + async-validator "^4.1.0" + rc-util "^5.32.2" + +rc-image@~5.17.1: + version "5.17.1" + resolved "https://registry.npmmirror.com/rc-image/-/rc-image-5.17.1.tgz#71835b12c30fcef533de0dbbbaf13caa86454612" + integrity sha512-oR4eviLyQxd/5A7pn843w2/Z1wuBA27L2lS4agq0sjl2z97ssNIVEzRzgwgB0ZxVZG/qSu9Glit2Zgzb/n+blQ== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/portal" "^1.0.2" + classnames "^2.2.6" + rc-dialog "~9.1.0" + rc-motion "^2.6.2" + rc-util "^5.0.6" + +rc-input-number@~7.4.0: + version "7.4.2" + resolved "https://registry.npmmirror.com/rc-input-number/-/rc-input-number-7.4.2.tgz#7c52d26b986461aa16e486d469dc0476d97c6ea3" + integrity sha512-yGturTw7WGP+M1GbJ+UTAO7L4buxeW6oilhL9Sq3DezsRS8/9qec4UiXUbeoiX9bzvRXH11JvgskBtxSp4YSNg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/mini-decimal" "^1.0.1" + classnames "^2.2.5" + rc-util "^5.28.0" + +rc-input@~1.0.0, rc-input@~1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/rc-input/-/rc-input-1.0.4.tgz#2f2c73c884f41e80685bb2eb7b9d5533e8540a77" + integrity sha512-clY4oneVHRtKHYf/HCxT/MO+4BGzCIywSNLosXWOm7fcQAS0jQW7n0an8Raa8JMB8kpxc8m28p7SNwFZmlMj6g== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.18.1" + +rc-mentions@~2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/rc-mentions/-/rc-mentions-2.3.0.tgz#bb457c9664093be82baf33628b145f7c2bd49577" + integrity sha512-gNpsSKsBHSXvyAA1ZowVTqXSWUIw7+OI9wmjL87KcYURvtm9nDo8R0KtOc2f1PT7q9McUpFzhm6AvQdIly0aRA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "^2.2.6" + rc-input "~1.0.0" + rc-menu "~9.9.0" + rc-textarea "~1.2.0" + rc-util "^5.22.5" + +rc-menu@~9.9.0, rc-menu@~9.9.2: + version "9.9.2" + resolved "https://registry.npmmirror.com/rc-menu/-/rc-menu-9.9.2.tgz#733aa5b794bd801577726e448b6cfeda0436e1e5" + integrity sha512-kVJwaQn5VUu6DIddxd/jz3QupTPg0tNYq+mpFP8wYsRF5JgzPA9fPVw+CfwlTPwA1w7gzEY42S8pj6M3uev5CQ== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.6.2" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.2.8" + rc-util "^5.27.0" + +rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.0, rc-motion@^2.6.1, rc-motion@^2.6.2, rc-motion@^2.7.3: + version "2.7.3" + resolved "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.7.3.tgz#126155bb3e687174fb3b92fddade2835c963b04d" + integrity sha512-2xUvo8yGHdOHeQbdI8BtBsCIrWKchEmFEIskf0nmHtJsou+meLd/JE+vnvSX2JxcBrJtXY2LuBpxAOxrbY/wMQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.21.0" + +rc-notification@~5.0.4: + version "5.0.4" + resolved "https://registry.npmmirror.com/rc-notification/-/rc-notification-5.0.4.tgz#4ad33d4aa291528fee9095b0be80ae41f1728a38" + integrity sha512-3535oellIRlt1LspERfK8yvCqb8Gio3R02rULciaSc1xe3H7ArTU/khlUTv1ddGzua4HhmF4D4Rwz/+mBxETvg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.6.0" + rc-util "^5.20.1" + +rc-overflow@^1.0.0, rc-overflow@^1.2.8: + version "1.3.1" + resolved "https://registry.npmmirror.com/rc-overflow/-/rc-overflow-1.3.1.tgz#03224cf90c66aa570eb0deeb4eff6cc96401e979" + integrity sha512-RY0nVBlfP9CkxrpgaLlGzkSoh9JhjJLu6Icqs9E7CW6Ewh9s0peF9OHIex4OhfoPsR92LR0fN6BlCY9Z4VoUtA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.19.2" + +rc-pagination@~3.5.0: + version "3.5.0" + resolved "https://registry.npmmirror.com/rc-pagination/-/rc-pagination-3.5.0.tgz#8692a62f3c24d8bfe58f1b3059bc5262ddce5d87" + integrity sha512-lUBVtVVUn7gGsq4mTyVpcZQr+AMcljbMiL/HcCmSdFrcsK0iZVKwwbXDxhz2IV0JXUs9Hzepr5sQFaF+9ad/pQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.32.2" + +rc-picker@~3.8.2: + version "3.8.2" + resolved "https://registry.npmmirror.com/rc-picker/-/rc-picker-3.8.2.tgz#1dc377a628cd94416e03974483daa36940a411b0" + integrity sha512-q6jnMwBoOi6tFA4xohrKIhzq80Fc3dH0Kiw5VRx6Tf1db7y27PBFCLwu6f66niXidZKD8F4R0M9VIui/jkL4cg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "^2.2.1" + rc-util "^5.30.0" + +rc-progress@~3.4.1: + version "3.4.2" + resolved "https://registry.npmmirror.com/rc-progress/-/rc-progress-3.4.2.tgz#f8df9ee95e790490171ab6b31bf07303cdc79980" + integrity sha512-iAGhwWU+tsayP+Jkl9T4+6rHeQTG9kDz8JAHZk4XtQOcYN5fj9H34NXNEdRdZx94VUDHMqCb1yOIvi8eJRh67w== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.16.1" + +rc-rate@~2.12.0: + version "2.12.0" + resolved "https://registry.npmmirror.com/rc-rate/-/rc-rate-2.12.0.tgz#0182deffed3b009cdcc61660da8746c39ed91ed5" + integrity sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + +rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0, rc-resize-observer@^1.3.1: + version "1.3.1" + resolved "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz#b61b9f27048001243617b81f95e53d7d7d7a6a3d" + integrity sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg== + dependencies: + "@babel/runtime" "^7.20.7" + classnames "^2.2.1" + rc-util "^5.27.0" + resize-observer-polyfill "^1.5.1" + +rc-segmented@~2.2.0: + version "2.2.2" + resolved "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.2.2.tgz#a34f12ce6c0975fc3042ae7656bcd18e1744798e" + integrity sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-motion "^2.4.4" + rc-util "^5.17.0" + +rc-select@~14.5.0: + version "14.5.2" + resolved "https://registry.npmmirror.com/rc-select/-/rc-select-14.5.2.tgz#1ac1ab58c874696cfa01cb15e1fc9a7bba81b29e" + integrity sha512-Np/lDHvxCnVhVsheQjSV1I/OMJTWJf1n10wq8q1AGy3ytyYLfjNpi6uaz/pmjsbbiSddSWzJnNZCli9LmgBZsA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "2.x" + rc-motion "^2.0.1" + rc-overflow "^1.0.0" + rc-util "^5.16.1" + rc-virtual-list "^3.5.2" + +rc-slider@~10.1.0: + version "10.1.1" + resolved "https://registry.npmmirror.com/rc-slider/-/rc-slider-10.1.1.tgz#5e82036e60b61021aba3ea0e353744dd7c74e104" + integrity sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.27.0" + +rc-steps@~6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/rc-steps/-/rc-steps-6.0.0.tgz#f7148f8097d5d135f19b96c1b4f4b50ad6093753" + integrity sha512-+KfMZIty40mYCQSDvYbZ1jwnuObLauTiIskT1hL4FFOBHP6ZOr8LK0m143yD3kEN5XKHSEX1DIwCj3AYZpoeNQ== + dependencies: + "@babel/runtime" "^7.16.7" + classnames "^2.2.3" + rc-util "^5.16.1" + +rc-switch@~4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/rc-switch/-/rc-switch-4.1.0.tgz#f37d81b4e0c5afd1274fd85367b17306bf25e7d7" + integrity sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg== + dependencies: + "@babel/runtime" "^7.21.0" + classnames "^2.2.1" + rc-util "^5.30.0" + +rc-table@~7.32.1: + version "7.32.1" + resolved "https://registry.npmmirror.com/rc-table/-/rc-table-7.32.1.tgz#7130a94727ac3870a6ddb9778b6f8496e388bce0" + integrity sha512-fHMQteKMocUC9I9Vex3eBLH7QsiaMR/qtzh3B1Ty2PoNGwVTwVdDFyRL05zch+JU3KnNNczgQeVvtf/p//gdrQ== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/context" "^1.3.0" + classnames "^2.2.5" + rc-resize-observer "^1.1.0" + rc-util "^5.27.1" + +rc-tabs@~12.7.0: + version "12.7.1" + resolved "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-12.7.1.tgz#6bfd11cc7b2bec08600eb0aba41966b230c38906" + integrity sha512-NrltXEYIyiDP5JFu85NQwc9eR+7e50r/6MNXYDyG1EMIFNc7BgDppzdpnD3nW4NHYWw5wLIThCURGib48OCTBg== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "2.x" + rc-dropdown "~4.1.0" + rc-menu "~9.9.0" + rc-motion "^2.6.2" + rc-resize-observer "^1.0.0" + rc-util "^5.16.0" + +rc-textarea@~1.2.0, rc-textarea@~1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/rc-textarea/-/rc-textarea-1.2.3.tgz#bdaea2931ad2571583e9e27e627b8a9b5dbe7de7" + integrity sha512-YvN8IskIVBRRzcS4deT0VAMim31+T3IoVX4yoCJ+b/iVCvw7yf0usR7x8OaHiUOUoURKcn/3lfGjmtzplcy99g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-input "~1.0.4" + rc-resize-observer "^1.0.0" + rc-util "^5.27.0" + +rc-tooltip@~6.0.0: + version "6.0.1" + resolved "https://registry.npmmirror.com/rc-tooltip/-/rc-tooltip-6.0.1.tgz#6a5e33bd6c3f6afe8851ea90e7af43e5c26b3cc6" + integrity sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/trigger" "^1.0.4" + classnames "^2.3.1" + +rc-tree-select@~5.9.0: + version "5.9.0" + resolved "https://registry.npmmirror.com/rc-tree-select/-/rc-tree-select-5.9.0.tgz#e8af859ff7751d22b6f4d98941cf13f775686475" + integrity sha512-oh3blESzLfLCBPSiVDtZ2irzrWWZUMeHvnSwRvFo79br8Z+K/1OhXhXBZmROvfKwaH8YUugAQy8B2j5EGQbdyA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "~14.5.0" + rc-tree "~5.7.0" + rc-util "^5.16.1" + +rc-tree@~5.7.0, rc-tree@~5.7.4: + version "5.7.8" + resolved "https://registry.npmmirror.com/rc-tree/-/rc-tree-5.7.8.tgz#778599d9a1052f25e2588dba7fddaf66257651b5" + integrity sha512-Ei+wID0SWA8BNCdEMO6UMblHs/jnSRDqz7csWXZ0o5VB08iDhxVnF+VHYTGDsJ9pARJ2xEXfjyTksOkEx5R4RQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.1" + +rc-upload@~4.3.0: + version "4.3.4" + resolved "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.3.4.tgz#83ff7d3867631c37adbfd72ea3d1fd7e97ca84af" + integrity sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.5" + rc-util "^5.2.0" + +rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.15.0, rc-util@^5.16.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.2, rc-util@^5.22.5, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.26.0, rc-util@^5.27.0, rc-util@^5.27.1, rc-util@^5.28.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.0, rc-util@^5.32.2, rc-util@^5.33.0, rc-util@^5.34.1, rc-util@^5.6.1: + version "5.34.1" + resolved "https://registry.npmmirror.com/rc-util/-/rc-util-5.34.1.tgz#0becf411d8f09bdb0f1b61322964f27efeeba642" + integrity sha512-SqiUT8Ssgh5C+hu4y887xwCrMNcxLm6ScOo8AFlWYYF3z9uNNiPpwwSjvicqOlWd79rNw1g44rnP7tz9MrO1ZQ== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^16.12.0" + +rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: + version "3.5.2" + resolved "https://registry.npmmirror.com/rc-virtual-list/-/rc-virtual-list-3.5.2.tgz#5e1028869bae900eacbae6788d4eca7210736006" + integrity sha512-sE2G9hTPjVmatQni8OP2Kx33+Oth6DMKm67OblBBmgMBJDJQOOFpSGH7KZ6Pm85rrI2IGxDRXZCr0QhYOH2pfQ== + dependencies: + "@babel/runtime" "^7.20.0" + classnames "^2.2.6" + rc-resize-observer "^1.0.0" + rc-util "^5.15.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^18.1.0: + version "18.1.0" + resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" + integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.22.0" + +react-is@^16.12.0, react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.1.0: + version "18.1.0" + resolved "https://registry.npmmirror.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-refresh@^0.13.0: + version "0.13.0" + resolved "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.13.0.tgz#cbd01a4482a177a5da8d44c9755ebb1f26d5a1c1" + integrity sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg== + +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.npmmirror.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + +react-test-renderer@^18.1.0: + version "18.1.0" + resolved "https://registry.npmmirror.com/react-test-renderer/-/react-test-renderer-18.1.0.tgz#35b75754834cf9ab517b6813db94aee0a6b545c3" + integrity sha512-OfuueprJFW7h69GN+kr4Ywin7stcuqaYAt1g7airM5cUgP0BoF5G5CXsPGmXeDeEkncb2fqYNECO4y18sSqphg== + dependencies: + react-is "^18.1.0" + react-shallow-renderer "^16.15.0" + scheduler "^0.22.0" + +react@^18.1.0: + version "18.1.0" + resolved "https://registry.npmmirror.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" + integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== + dependencies: + loose-envify "^1.1.0" + +read-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.npmmirror.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" + integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== + dependencies: + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + +readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.npmmirror.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reduce-css-calc@^2.1.8: + version "2.1.8" + resolved "https://registry.npmmirror.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.1.0, regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.npmmirror.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: + version "1.22.0" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w== + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +runtime-required@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/runtime-required/-/runtime-required-1.1.0.tgz#a000a50c2748dba123f4dac5105e66d4599519c4" + integrity sha512-yX97f5E0WfNpcQnfVjap6vzQcvErkYYCx6eTK4siqGEdC8lglwypUFgZVTX7ShvIlgfkC4XGFl9O1KTYcff0pw== + +rxjs@^7.0.0: + version "7.8.0" + resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +rxjs@^7.5.5: + version "7.5.5" + resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.npmmirror.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sass-loader@^12.6.0: + version "12.6.0" + resolved "https://registry.npmmirror.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sass@^1.51.0: + version "1.52.3" + resolved "https://registry.npmmirror.com/sass/-/sass-1.52.3.tgz#b7cc7ffea2341ccc9a0c4fd372bf1b3f9be1b6cb" + integrity sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.22.0: + version "0.22.0" + resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" + integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== + dependencies: + loose-envify "^1.1.0" + +schema-utils@^2.0.1: + version "2.7.1" + resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +scroll-into-view-if-needed@^3.0.3: + version "3.0.10" + resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz#38fbfe770d490baff0fb2ba34ae3539f6ec44e13" + integrity sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg== + dependencies: + compute-scroll-into-view "^3.0.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== + dependencies: + node-forge "^1" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.5: + version "7.3.5" + resolved "https://registry.npmmirror.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmmirror.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.7.3" + resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.npmmirror.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +smart-buffer@^4.0.2, smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.6.2" + resolved "https://registry.npmmirror.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" + integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.2.0" + +source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-ref-core@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/source-ref-core/-/source-ref-core-1.0.7.tgz#0a05fd2589d0942c254a99e57284a0dfeb2c71a5" + integrity sha512-mf4xriHN9Xeb8FP74672Y5CZV8AmN+qaeopeqPHd4PsZLUxgI4u+A6MwJn5MX7uQLoGXivGbWXE5z1FgiBb6yg== + dependencies: + "@babel/generator" "^7.17.7" + "@babel/parser" "^7.17.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.10" + +source-ref-loader@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/source-ref-loader/-/source-ref-loader-1.0.7.tgz#2814b3e7a08e412433f3f9ca18c2a0c2e51b92ef" + integrity sha512-1PEIA9bJpYyUwWPEpdeCG8FN+qj6i0JeEe3UCOy6MqjJ1g5CKFzSQCCYtqbUSwyT5uS8bss7mE+Zq/WP9++buQ== + dependencies: + source-ref-core "^1.0.7" + +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-http@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strip-outer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +style-loader@^3.3.1: + version "3.3.1" + resolved "https://registry.npmmirror.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +stylehacks@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== + dependencies: + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" + +stylis@^4.0.13: + version "4.3.0" + resolved "https://registry.npmmirror.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" + integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0, supports-color@^8.1.0: + version "8.1.1" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^9.2.2: + version "9.2.2" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-9.2.2.tgz#502acaf82f2b7ee78eb7c83dcac0f89694e5a7bb" + integrity sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA== + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.npmmirror.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^2.5.0, svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tailwindcss@^2.2.4: + version "2.2.19" + resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-2.2.19.tgz#540e464832cd462bb9649c1484b0a38315c2653c" + integrity sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw== + dependencies: + arg "^5.0.1" + bytes "^3.0.0" + chalk "^4.1.2" + chokidar "^3.5.2" + color "^4.0.1" + cosmiconfig "^7.0.1" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.7" + fs-extra "^10.0.0" + glob-parent "^6.0.1" + html-tags "^3.1.0" + is-color-stop "^1.1.0" + is-glob "^4.0.1" + lodash "^4.17.21" + lodash.topath "^4.5.2" + modern-normalize "^1.1.0" + node-emoji "^1.11.0" + normalize-path "^3.0.0" + object-hash "^2.2.0" + postcss-js "^3.0.3" + postcss-load-config "^3.1.0" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.6" + postcss-value-parser "^4.1.0" + pretty-hrtime "^1.0.3" + purgecss "^4.0.3" + quick-lru "^5.1.1" + reduce-css-calc "^2.1.8" + resolve "^1.20.0" + tmp "^0.2.1" + +tapable@^0.1.8: + version "0.1.10" + resolved "https://registry.npmmirror.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + integrity sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.0.2, tar@^6.0.5, tar@^6.1.2: + version "6.1.11" + resolved "https://registry.npmmirror.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.npmmirror.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@*, terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: + version "5.3.3" + resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" + integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.7.2" + +terser@^5.10.0, terser@^5.7.2: + version "5.14.1" + resolved "https://registry.npmmirror.com/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" + integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + +throttle-debounce@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz#a17a4039e82a2ed38a5e7268e4132d6960d41933" + integrity sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0, tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== + dependencies: + escape-string-regexp "^1.0.2" + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + +ts-jest@27.1.4: + version "27.1.4" + resolved "https://registry.npmmirror.com/ts-jest/-/ts-jest-27.1.4.tgz#84d42cf0f4e7157a52e7c64b1492c46330943e00" + integrity sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-loader@^9.3.0: + version "9.3.0" + resolved "https://registry.npmmirror.com/ts-loader/-/ts-loader-9.3.0.tgz#980f4dbfb60e517179e15e10ed98e454b132159f" + integrity sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-node@^10.7.0: + version "10.8.1" + resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" + integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths-webpack-plugin@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.1.tgz#a24651d0f69668a1abad38d3c2489855c257460d" + integrity sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.1.2" + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.npmmirror.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmmirror.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typescript@^4.6.4: + version "4.7.3" + resolved "https://registry.npmmirror.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" + integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + 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" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.1.0, universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unixify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== + dependencies: + normalize-path "^2.1.1" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unzip-crx-3@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz#d5324147b104a8aed9ae8639c95521f6f7cda292" + integrity sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ== + dependencies: + jszip "^3.1.0" + mkdirp "^0.5.1" + yaku "^0.16.6" + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.npmmirror.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchboy@^0.4.3: + version "0.4.3" + resolved "https://registry.npmmirror.com/watchboy/-/watchboy-0.4.3.tgz#4b766e7923d8122e5811a6b9736a8e3e5943838c" + integrity sha512-GHs1HxwvxSMBsqd/WfTOZhj5gBdMqf5HQpfgtKxDfZRxrlYPDdVLRB61LCeRzJaWANmvSIMlfmRVDwVmJFgAKA== + dependencies: + lodash.difference "^4.5.0" + micromatch "^4.0.2" + pify "^4.0.1" + unixify "^1.0.0" + +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-bundle-analyzer@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-cli@^4.9.2: + version "4.9.2" + resolved "https://registry.npmmirror.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.9.0: + version "4.9.2" + resolved "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz#c188db28c7bff12f87deda2a5595679ebbc3c9bc" + integrity sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-merge@^5.7.3, webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@5.73.0, webpack@^5: + version "5.73.0" + resolved "https://registry.npmmirror.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.npmmirror.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.8" + resolved "https://registry.npmmirror.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" + integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.4.2: + version "8.8.0" + resolved "https://registry.npmmirror.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" + integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlbuilder@>=11.0.1: + version "15.1.1" + resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yaku@^0.16.6: + version "0.16.7" + resolved "https://registry.npmmirror.com/yaku/-/yaku-0.16.7.tgz#1d195c78aa9b5bf8479c895b9504fd4f0847984e" + integrity sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.x, yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.1, yargs@^17.3.1: + version "17.5.1" + resolved "https://registry.npmmirror.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zustand@^4.3.8: + version "4.3.8" + resolved "https://registry.npmmirror.com/zustand/-/zustand-4.3.8.tgz#37113df8e9e1421b0be1b2dca02b49b76210e7c4" + integrity sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg== + dependencies: + use-sync-external-store "1.2.0" diff --git a/client/mobile/.bundle/config b/client/mobile/.bundle/config new file mode 100644 index 00000000000..848943bb527 --- /dev/null +++ b/client/mobile/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/client/mobile/.env.example b/client/mobile/.env.example new file mode 100644 index 00000000000..f81c1184abe --- /dev/null +++ b/client/mobile/.env.example @@ -0,0 +1,9 @@ +TAILCHAT_UPLOAD_STORE_FILE= +TAILCHAT_UPLOAD_STORE_PASSWORD= +TAILCHAT_UPLOAD_KEY_ALIAS= +TAILCHAT_UPLOAD_KEY_PASSWORD= + +GETUI_APPID= +GETUI_APPKEY= +GETUI_APPSECRET= +GETUI_HUAWEI_APP_ID= diff --git a/client/mobile/.eslintrc.js b/client/mobile/.eslintrc.js new file mode 100644 index 00000000000..40c6dcd05f3 --- /dev/null +++ b/client/mobile/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '@react-native-community', +}; diff --git a/client/mobile/.gitignore b/client/mobile/.gitignore new file mode 100644 index 00000000000..048f154a0d9 --- /dev/null +++ b/client/mobile/.gitignore @@ -0,0 +1,66 @@ +android/app/agconnect-services.json +android/app/*.pem + +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +ios/.xcode.env.local + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ +*.keystore +!debug.keystore + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +**/fastlane/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output + +# Bundle artifact +*.jsbundle + +# Ruby / CocoaPods +/ios/Pods/ +/vendor/bundle/ + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* diff --git a/client/mobile/.node-version b/client/mobile/.node-version new file mode 100644 index 00000000000..3c032078a4a --- /dev/null +++ b/client/mobile/.node-version @@ -0,0 +1 @@ +18 diff --git a/web/e2e/playwright/.npmrc b/client/mobile/.npmrc similarity index 100% rename from web/e2e/playwright/.npmrc rename to client/mobile/.npmrc diff --git a/client/mobile/.prettierrc.js b/client/mobile/.prettierrc.js new file mode 100644 index 00000000000..f004026c764 --- /dev/null +++ b/client/mobile/.prettierrc.js @@ -0,0 +1 @@ +module.exports = require('../../.prettierrc.json'); diff --git a/client/mobile/.ruby-version b/client/mobile/.ruby-version new file mode 100644 index 00000000000..49cdd668e1c --- /dev/null +++ b/client/mobile/.ruby-version @@ -0,0 +1 @@ +2.7.6 diff --git a/client/mobile/.watchmanconfig b/client/mobile/.watchmanconfig new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/client/mobile/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/client/mobile/Gemfile b/client/mobile/Gemfile new file mode 100644 index 00000000000..567e59805c4 --- /dev/null +++ b/client/mobile/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org/' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby File.read(File.join(__dir__, '.ruby-version')).strip + +gem 'cocoapods', '~> 1.11', '>= 1.11.3' diff --git a/client/mobile/Gemfile.lock b/client/mobile/Gemfile.lock new file mode 100644 index 00000000000..a21b02e43da --- /dev/null +++ b/client/mobile/Gemfile.lock @@ -0,0 +1,100 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.6) + rexml + activesupport (6.1.7.2) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + claide (1.1.0) + cocoapods (1.11.3) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.11.3) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 1.4.0, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.4.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 1.0, < 3.0) + xcodeproj (>= 1.21.0, < 2.0) + cocoapods-core (1.11.3) + activesupport (>= 5.0, < 7) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (1.6.3) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.2.0) + escape (0.0.4) + ethon (0.16.0) + ffi (>= 1.15.0) + ffi (1.15.5) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.8.3) + i18n (1.12.0) + concurrent-ruby (~> 1.0) + json (2.6.3) + minitest (5.17.0) + molinillo (0.8.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + public_suffix (4.0.7) + rexml (3.2.5) + ruby-macho (2.5.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcodeproj (1.22.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + zeitwerk (2.6.6) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods (~> 1.11, >= 1.11.3) + +RUBY VERSION + ruby 2.7.6p219 + +BUNDLED WITH + 2.1.4 diff --git a/client/mobile/__tests__/App-test.tsx b/client/mobile/__tests__/App-test.tsx new file mode 100644 index 00000000000..4edaa0a8d85 --- /dev/null +++ b/client/mobile/__tests__/App-test.tsx @@ -0,0 +1,14 @@ +/** + * @format + */ + +import 'react-native'; +import React from 'react'; +import App from '../src/App'; + +// Note: test renderer must be required after react-native. +import renderer from 'react-test-renderer'; + +it('renders correctly', () => { + renderer.create(); +}); diff --git a/client/mobile/android/app/build.gradle b/client/mobile/android/app/build.gradle new file mode 100644 index 00000000000..5cef6e9dd12 --- /dev/null +++ b/client/mobile/android/app/build.gradle @@ -0,0 +1,218 @@ +apply plugin: "com.android.application" +apply plugin: "com.facebook.react" +apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" +apply plugin: 'com.huawei.agconnect' // huawei push + +import com.android.build.OutputFile + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '..' + // root = file("../") + // The folder where the react-native NPM package is. Default is ../node_modules/react-native + // reactNativeDir = file("../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen + // codegenDir = file("../node_modules/react-native-codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js + // cliFile = file("../node_modules/react-native/cli.js") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] +} + +/** + * Set this to true to create four separate APKs instead of one, + * one for each native architecture. This is useful if you don't + * use App Bundles (https://developer.android.com/guide/app-bundle/) + * and want to have separate APKs to upload to the Play Store. + */ +def enableSeparateBuildPerCPUArchitecture = false + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = false + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'org.webkit:android-jsc:+' + +/** + * Private function to get the list of Native Architectures you want to build. + * This reads the value from reactNativeArchitectures in your gradle.properties + * file and works together with the --active-arch-only flag of react-native run-android. + */ +def reactNativeArchitectures() { + def value = project.getProperties().get("reactNativeArchitectures") + return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] +} + +android { + ndkVersion rootProject.ext.ndkVersion + + compileSdkVersion rootProject.ext.compileSdkVersion + + namespace "com.msgbyte.tailchat" + defaultConfig { + applicationId "com.msgbyte.tailchat" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0.0" + + manifestPlaceholders = [ + GETUI_APPID: project.env.get("GETUI_APPID"), + + MEIZU_APP_ID : "", + MEIZU_APP_KEY : "", + + HUAWEI_APP_ID : project.env.get("GETUI_HUAWEI_APP_ID"), + + XIAOMI_APP_ID : "", + XIAOMI_APP_KEY : "", + + VIVO_APP_ID : "", + VIVO_APP_KEY : "", + + OPPO_APP_KEY : "", + OPPO_APP_SECRET : "" + ] + } + + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include (*reactNativeArchitectures()) + } + } + signingConfigs { + debug { + if (project.env.get('TAILCHAT_UPLOAD_STORE_FILE')) { + storeFile file(project.env.get('TAILCHAT_UPLOAD_STORE_FILE')) + storePassword project.env.get('TAILCHAT_UPLOAD_STORE_PASSWORD') + keyAlias project.env.get('TAILCHAT_UPLOAD_KEY_ALIAS') + keyPassword project.env.get('TAILCHAT_UPLOAD_KEY_PASSWORD') + } else { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } + + lintOptions { + // https://stackoverflow.com/questions/49286268/error-execution-failed-for-task-app-lintvitalrelease-any-one-can-solve-it + checkReleaseBuilds false + } + + // applicationVariants are e.g. debug, release + applicationVariants.all { variant -> + variant.outputs.each { output -> + // For each separate APK per architecture, set a unique version code as described here: + // https://developer.android.com/studio/build/configure-apk-splits.html + // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. + def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] + def abi = output.getFilter(OutputFile.ABI) + if (abi != null) { // null for the universal-debug, universal-release variants + output.versionCodeOverride = + defaultConfig.versionCode * 1000 + versionCodes.get(abi) + } + + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") + + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") + debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { + exclude group:'com.squareup.okhttp3', module:'okhttp' + } + + debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } + + // Push + implementation 'com.getui:gtsdk:3.2.15.0' //个推SDK + implementation 'com.getui:gtc:3.2.1.0' //个推核心组件 + + // 根据所需厂商选择集成 + implementation 'com.getui.opt:hwp:3.1.1' // 华为 + // implementation 'com.getui.opt:xmp:3.3.0' // 小米 + // implementation 'com.assist-v3:oppo:3.3.0' // oppo + // implementation 'com.assist-v3:vivo:3.1.1' // vivo + // implementation 'com.getui.opt:mzp:3.2.2' // 魅族 + // implementation 'com.getui.opt:ups:3.0.3' // ups,ups目前支持坚果,索尼,海信手机 + // implementation 'com.getui.opt:honor:3.3.0' // 荣耀 + + implementation 'com.huawei.agconnect:agconnect-core:1.8.1.300' + implementation 'com.huawei.hms:push:6.9.0.300' +} + +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/client/mobile/android/app/debug.keystore b/client/mobile/android/app/debug.keystore new file mode 100644 index 00000000000..364e105ed39 Binary files /dev/null and b/client/mobile/android/app/debug.keystore differ diff --git a/client/mobile/android/app/proguard-rules.pro b/client/mobile/android/app/proguard-rules.pro new file mode 100644 index 00000000000..a1569dd66c2 --- /dev/null +++ b/client/mobile/android/app/proguard-rules.pro @@ -0,0 +1,13 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +-keep class com.swmansion.reanimated.** { *; } +-keep class com.facebook.react.turbomodule.** { *; } diff --git a/client/mobile/android/app/src/debug/AndroidManifest.xml b/client/mobile/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000000..2da469b97ea --- /dev/null +++ b/client/mobile/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/client/mobile/android/app/src/debug/java/com/msgbyte/tailchat/ReactNativeFlipper.java b/client/mobile/android/app/src/debug/java/com/msgbyte/tailchat/ReactNativeFlipper.java new file mode 100644 index 00000000000..c3ec4845dc5 --- /dev/null +++ b/client/mobile/android/app/src/debug/java/com/msgbyte/tailchat/ReactNativeFlipper.java @@ -0,0 +1,75 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.msgbyte.tailchat; + +import android.content.Context; +import com.facebook.flipper.android.AndroidFlipperClient; +import com.facebook.flipper.android.utils.FlipperUtils; +import com.facebook.flipper.core.FlipperClient; +import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; +import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; +import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; +import com.facebook.flipper.plugins.inspector.DescriptorMapping; +import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; +import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; +import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; +import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; +import com.facebook.react.ReactInstanceEventListener; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.modules.network.NetworkingModule; +import okhttp3.OkHttpClient; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the debug + * flavor of it. Here you can add your own plugins and customize the Flipper setup. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + if (FlipperUtils.shouldEnableFlipper(context)) { + final FlipperClient client = AndroidFlipperClient.getInstance(context); + + client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); + client.addPlugin(new DatabasesFlipperPlugin(context)); + client.addPlugin(new SharedPreferencesFlipperPlugin(context)); + client.addPlugin(CrashReporterPlugin.getInstance()); + + NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); + NetworkingModule.setCustomClientBuilder( + new NetworkingModule.CustomClientBuilder() { + @Override + public void apply(OkHttpClient.Builder builder) { + builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); + } + }); + client.addPlugin(networkFlipperPlugin); + client.start(); + + // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized + // Hence we run if after all native modules have been initialized + ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); + if (reactContext == null) { + reactInstanceManager.addReactInstanceEventListener( + new ReactInstanceEventListener() { + @Override + public void onReactContextInitialized(ReactContext reactContext) { + reactInstanceManager.removeReactInstanceEventListener(this); + reactContext.runOnNativeModulesQueueThread( + new Runnable() { + @Override + public void run() { + client.addPlugin(new FrescoFlipperPlugin()); + } + }); + } + }); + } else { + client.addPlugin(new FrescoFlipperPlugin()); + } + } + } +} diff --git a/client/mobile/android/app/src/main/AndroidManifest.xml b/client/mobile/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..9f2a4d5ed6d --- /dev/null +++ b/client/mobile/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiLogger.java b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiLogger.java new file mode 100644 index 00000000000..384eed83872 --- /dev/null +++ b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiLogger.java @@ -0,0 +1,16 @@ +package com.msgbyte.tailchat; + +import android.util.Log; + +public class GetuiLogger { + + public static boolean ENABLE = true; + + public static final String TAG = "GetuiLogger"; + + public static void log(String message){ + if (ENABLE){ + Log.d(TAG, message); + } + } +} diff --git a/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiModule.java b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiModule.java new file mode 100644 index 00000000000..c53c3f776c8 --- /dev/null +++ b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiModule.java @@ -0,0 +1,349 @@ +package com.msgbyte.tailchat; + +import android.content.Context; + +import androidx.annotation.Nullable; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.igexin.sdk.PushManager; +import com.igexin.sdk.Tag; + +public class GetuiModule extends ReactContextBaseJavaModule { + private static final String TAG = "GetuiModule"; + + public static final String EVENT_RECEIVE_REMOTE_NOTIFICATION = "receiveRemoteNotification"; + + public static final String EVENT_TYPE_RECEIVE_CID = "cid"; + public static final String EVENT_TYPE_PAYLOAD = "payload"; + public static final String EVENT_TYPE_CMD = "cmd"; + public static final String EVENT_TYPE_NOTIFICATION_ARRIVED = "notificationArrived"; + public static final String EVENT_TYPE_NOTIFICATION_CLICKED = "notificationClicked"; + + private static ReactApplicationContext mRAC; + + private static GetuiModule mModule; + + private static Context mContext; + + public GetuiModule(ReactApplicationContext reactContext) { + super(reactContext); + mRAC = reactContext; + } + + @Override + public boolean canOverrideExistingModule() { + return true; + } + + @Override + public String getName() { + return "GetuiModule"; + } + + @Override + public void initialize() { + super.initialize(); + mModule = this; + } + + @Override + public void onCatalystInstanceDestroy() { + super.onCatalystInstanceDestroy(); + mModule = null; + } + + /** + * 初始化推送服务 + */ + public static void initPush(Context context) { + mContext = context; + GetuiLogger.log("initPush, mContext = " + mContext); + PushManager.getInstance().initialize(mContext, TailchatPushService.class); + PushManager.getInstance().registerPushIntentService(mContext, PushIntentService.class); + } + + /** + * Android 不存在 destroy方法,仅停止推送服务 + */ + @ReactMethod + public void destroy() { + // PushManager.getInstance().stopService(mContext); + } + + /** + * 停止SDK服务 + */ + @ReactMethod + public void stop() { + // PushManager.getInstance().stopService(mContext); + } + + /** + * 恢复SDK运行,重新接收推送 + */ + @ReactMethod + public void resume() { + PushManager.getInstance().turnOnPush(mContext); + } + + /** + * 打开SDK的推送. + */ + @ReactMethod + public void turnOnPush() { + PushManager.getInstance().turnOnPush(mContext); + } + + /** + * 关闭SDK的推送. + */ + @ReactMethod + public void turnOffPush() { + PushManager.getInstance().turnOffPush(mContext); + } + + /** + * 获取SDK的Cid + * + * @return Cid值 + */ + @ReactMethod + public void clientId(Callback callback) { + String clientId = PushManager.getInstance().getClientid(mContext); + GetuiLogger.log("clientId = " + clientId); + callback.invoke(clientId); + } + + /** + * 获取SDK运行状态, + * + * @return 运行状态 1为已开启推送,2为已停止推送 + */ + @ReactMethod + public void status(Callback callback) { + boolean isPushTurnOn = PushManager.getInstance().isPushTurnedOn(mContext); + GetuiLogger.log("isPushTurnOn = " + isPushTurnOn); + callback.invoke(isPushTurnOn ? "1" : "2"); + } + + /** + * 获取SDK版本号 + * + * @return 版本号 + */ + @ReactMethod + public void version(Callback callback) { + String version = PushManager.getInstance().getVersion(mContext); + GetuiLogger.log("version = " + version); + callback.invoke(version); + } + + + /** + * 是否允许SDK 后台运行(默认为true) + * 该方法在Android中无效,仅在iOS有效 + * + * @param isEnable + */ + @ReactMethod + public void runBackgroundEnable(boolean isEnable) { + // Empty + } + + + /** + * 地理围栏功能,设置地理围栏是否运行 + * 该方法在Android中无效,仅在iOS有效,在AndroidManifest.xml开启相应地权限 + * + * + * + * @param isEnable 设置地理围栏功能是否运行(默认值:NO) + * @param isVerify 设置是否SDK主动弹出用户定位请求(默认值:NO) + */ + @ReactMethod + public void lbsLocationEnable(boolean isEnable, boolean isVerify) { + // Empty + } + + + /** + * 设置渠道 + * 该方法在Android中无效,仅在iOS有效Ø + * + * @param channelId 渠道值,可以为空值 + */ + @ReactMethod + public void setChannelId(String channelId) { + // Empty + } + + + /** + * 向个推服务器注册DeviceToken + * 该方法在Android中无效,仅在iOS有效 + * + * @param deviceToken + */ + @ReactMethod + public void registerDeviceToken(String deviceToken) { + // Empty + + } + + /** + * 绑定别名功能:后台可以根据别名进行推送 + * + * @param alias 别名字符串 + * @param aSn 绑定序列码, Android中无效,仅在iOS有效 + */ + @ReactMethod + public void bindAlias(String alias, String aSn) { + PushManager.getInstance().bindAlias(mContext, alias); + } + + /** + * 取消绑定别名功能 + * + * @param alias 别名字符串 + * @param aSn 绑定序列码, Android中无效,仅在iOS有效 + */ + @ReactMethod + public void unbindAlias(String alias, String aSn) { + PushManager.getInstance().unBindAlias(mContext, alias, false); + } + + /** + * 给用户打标签 , 后台可以根据标签进行推送 + * + * @param tags 别名数组 + */ + @ReactMethod + public void setTag(ReadableArray tags) { + if (tags == null || tags.size() == 0) { + return; + } + + Tag[] tagArray = new Tag[tags.size()]; + for (int i = 0; i < tags.size(); i++) { + Tag tag = new Tag(); + tag.setName(tags.getString(i)); + tagArray[i] = tag; + } + + PushManager.getInstance().setTag(mContext, tagArray, "setTag"); + } + + /** + * 设置关闭推送模式 + * Android中无效,仅在iOS有效 + * + * @param isValue + */ + @ReactMethod + public void setPushModeForOff(boolean isValue) { + // Empty + } + + /** + * 同步角标值到个推服务器 + * Android中无效,仅在iOS有效 + * + * @param value + */ + @ReactMethod + public void setBadge(int value) { + // Empty + } + + /** + * 重置角标值到个推服务器 + * Android中无效,仅在iOS有效 + * + * @param badge + */ + @ReactMethod + public void resetBadge(int badge) { + //Empty + } + + + /** + * SDK发送上行消息结果 + * Android中无效,仅在iOS有效 + * + * @param body 需要发送的消息数据 + * @param error 如果发送成功返回messageid + */ + @ReactMethod + public void sendMessage(String body, String error) { + // Empty + + } + + /** + * 上行第三方自定义回执actionid + * + * @param actionId 用户自定义的actionid,int类型,取值90001-90999。 + * @param taskId 下发任务的任务ID + * @param msgId 下发任务的消息ID + * @return 上行成功或失败,若上行失败,可能上行失败;taskid为空或者 messageid 为空 或者 actionid 不在取值范围以内 + */ + @ReactMethod + public void sendFeedbackMessage(int actionId, String taskId, String msgId, Callback callback) { + callback.invoke(PushManager.getInstance().sendFeedbackMessage(mContext, taskId, msgId, actionId)); + } + + /** + * 设置静默时间 + * + * @param beginHour 开始时间,设置范围在0-23小时之间,单位 h + * @param duration 持续时间,设置范围在0-23小时之间。持续时间为0则不静默,单位 h + */ + @ReactMethod + public void sendSilentTime(int beginHour, int duration, Callback callback) { + callback.invoke(PushManager.getInstance().setSilentTime(mContext, beginHour, duration)); + } + + + /** + * 设置Socket超时时间 + * + * @param times 超时时间 + */ + @ReactMethod + public void setSocketTimeout(int times) { + PushManager.getInstance().setSocketTimeout(mContext, times); + } + + /** + * 往JavaScript发送事件通知 + * + * @param eventName + * @param type + * @param value + */ + public static void sendEvent(String eventName, String type, String key, String value) { + WritableMap param = Arguments.createMap(); + param.putString("type", type); + param.putString(key, value); + sendEvent(eventName, param); + } + + /** + * 往JavaScript发送事件通知 + * + * @param eventName + * @param params + */ + public static void sendEvent(String eventName, @Nullable WritableMap params) { + mRAC.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, params); + } +} + diff --git a/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiPackage.java b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiPackage.java new file mode 100644 index 00000000000..3449541af76 --- /dev/null +++ b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/GetuiPackage.java @@ -0,0 +1,37 @@ +package com.msgbyte.tailchat; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.JavaScriptModule; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class GetuiPackage implements ReactPackage { + public GetuiPackage(boolean logEnable) { + GetuiLogger.ENABLE = logEnable; + } + + public GetuiPackage(){ + GetuiLogger.ENABLE = true; + } + + @Override + public List createNativeModules(ReactApplicationContext reactContext) { + return Arrays.asList(new NativeModule[]{ + new GetuiModule(reactContext) + }); + } + + public List> createJSModules() { + return Collections.emptyList(); + } + + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + return Collections.emptyList(); + } +} diff --git a/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/MainActivity.java b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/MainActivity.java new file mode 100644 index 00000000000..e65ff1e773b --- /dev/null +++ b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/MainActivity.java @@ -0,0 +1,35 @@ +package com.msgbyte.tailchat; + +import com.facebook.react.ReactActivity; +import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; +import com.facebook.react.defaults.DefaultReactActivityDelegate; + +public class MainActivity extends ReactActivity { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "Tailchat"; + } + + /** + * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link + * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React + * (aka React 18) with two boolean flags. + */ + @Override + protected ReactActivityDelegate createReactActivityDelegate() { + return new DefaultReactActivityDelegate( + this, + getMainComponentName(), + // If you opted-in for the New Architecture, we enable the Fabric Renderer. + DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled + // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18). + DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled + ); + } +} diff --git a/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/MainApplication.java b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/MainApplication.java new file mode 100644 index 00000000000..59295ec957c --- /dev/null +++ b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/MainApplication.java @@ -0,0 +1,63 @@ +package com.msgbyte.tailchat; + +import android.app.Application; +import com.facebook.react.PackageList; +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; +import com.facebook.react.defaults.DefaultReactNativeHost; +import com.facebook.soloader.SoLoader; +import java.util.List; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = + new DefaultReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + @SuppressWarnings("UnnecessaryLocalVariable") + List packages = new PackageList(this).getPackages(); + // Packages that cannot be autolinked yet can be added manually here, for example: + packages.add(new GetuiPackage()); + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + + @Override + protected boolean isNewArchEnabled() { + return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + } + + @Override + protected Boolean isHermesEnabled() { + return BuildConfig.IS_HERMES_ENABLED; + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); + GetuiModule.initPush(this); + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + DefaultNewArchitectureEntryPoint.load(); + } + ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); + } +} diff --git a/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/PushIntentService.java b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/PushIntentService.java new file mode 100644 index 00000000000..5a0d7697157 --- /dev/null +++ b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/PushIntentService.java @@ -0,0 +1,103 @@ +package com.msgbyte.tailchat; + +import android.content.Context; +import androidx.annotation.RequiresPermission; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.WritableMap; +import com.igexin.sdk.GTIntentService; +import com.igexin.sdk.message.GTCmdMessage; +import com.igexin.sdk.message.GTNotificationMessage; +import com.igexin.sdk.message.GTTransmitMessage; + +/** + * 继承 GTIntentService 接收来自个推的消息, 所有消息在线程中回调
+ * onReceiveMessageData 处理透传消息
+ * onReceiveClientId 接收 cid
+ * onReceiveOnlineState cid 离线上线通知
+ * onReceiveCommandResult 各种事件处理回执
+ */ +public class PushIntentService extends GTIntentService { + + public PushIntentService() { + } + + @Override + public void onReceiveServicePid(Context context, int pid) { + GetuiLogger.log("onReceiveServicePid = " + pid); + } + + @Override + public void onReceiveClientId(Context context, String clientId) { + GetuiLogger.log("onReceiveClientId = " + clientId); + WritableMap param = Arguments.createMap(); + param.putString("type", GetuiModule.EVENT_TYPE_RECEIVE_CID); + param.putString("cid", clientId); + GetuiModule.sendEvent(GetuiModule.EVENT_RECEIVE_REMOTE_NOTIFICATION, param); + } + + @Override + public void onReceiveMessageData(Context context, GTTransmitMessage msg) { + String message = new String(msg.getPayload()); + GetuiLogger.log("onReceiveMessageData msg = " + message); + WritableMap param = Arguments.createMap(); + param.putString("type", GetuiModule.EVENT_TYPE_PAYLOAD); + param.putString("payload", message); + GetuiModule.sendEvent(GetuiModule.EVENT_RECEIVE_REMOTE_NOTIFICATION, param ); + } + + @Override + public void onReceiveOnlineState(Context context, boolean online) { + GetuiLogger.log("onReceiveOnlineState online = " + online); + } + + @Override + public void onReceiveCommandResult(Context context, GTCmdMessage cmdMessage) { + GetuiLogger.log("onReceiveCommandResult cmdMessage action = " + cmdMessage.getAction()); + + GetuiModule.sendEvent(GetuiModule.EVENT_RECEIVE_REMOTE_NOTIFICATION, + GetuiModule.EVENT_TYPE_CMD, "action", String.valueOf(cmdMessage.getAction())); + } + + + // 通知到达 + @Override + public void onNotificationMessageArrived(Context context, GTNotificationMessage message) { + GetuiLogger.log("onNotificationMessageArrived -> " + "appid = " + message.getAppid() + "\ntaskid = " + message.getTaskId() + "\nmessageid = " + + message.getMessageId() + "\npkg = " + message.getPkgName() + "\ncid = " + message.getClientId() + "\ntitle = " + + message.getTitle() + "\ncontent = " + message.getContent()); + /* + GetuiModule.sendEvent(GetuiModule.EVENT_RECEIVE_REMOTE_NOTIFICATION,GetuiModule.EVENT_TYPE_CMD,"NotificationArrived",String.valueOf("appid = " + message.getAppid() + "\ntaskid = " + message.getTaskId() + "\nmessageid = " + + message.getMessageId() + "\npkg = " + message.getPkgName() + "\ncid = " + message.getClientId() + "\ntitle = " + + message.getTitle() + "\ncontent = " + message.getContent())); + */ + WritableMap param = Arguments.createMap(); + param.putString("type",GetuiModule.EVENT_TYPE_NOTIFICATION_ARRIVED); + param.putString("taskId",message.getTaskId()); + param.putString("messageId",message.getMessageId()); + param.putString("title",message.getTitle()); + param.putString("content",message.getContent()); + GetuiModule.sendEvent(GetuiModule.EVENT_RECEIVE_REMOTE_NOTIFICATION,param); + } + + // 点击回调 + @Override + public void onNotificationMessageClicked(Context context, GTNotificationMessage message) { + GetuiLogger.log("onNotificationMessageClicked -> " + "appid = " + message.getAppid() + "\ntaskid = " + message.getTaskId() + "\nmessageid = " + + message.getMessageId() + "\npkg = " + message.getPkgName() + "\ncid = " + message.getClientId() + "\ntitle = " + + message.getTitle() + "\ncontent = " + message.getContent()); + /* + GetuiModule.sendEvent(GetuiModule.EVENT_RECEIVE_REMOTE_NOTIFICATION,GetuiModule.EVENT_TYPE_CMD,"NotificatioClicked","appid = " + message.getAppid() + "\ntaskid = " + message.getTaskId() + "\nmessageid = " + + message.getMessageId() + "\npkg = " + message.getPkgName() + "\ncid = " + message.getClientId() + "\ntitle = " + + message.getTitle() + "\ncontent = " + message.getContent()); + */ + WritableMap param = Arguments.createMap(); + param.putString("type",GetuiModule.EVENT_TYPE_NOTIFICATION_CLICKED); + param.putString("taskId",message.getTaskId()); + param.putString("messageId",message.getMessageId()); + param.putString("title",message.getTitle()); + param.putString("content",message.getContent()); + GetuiModule.sendEvent(GetuiModule.EVENT_RECEIVE_REMOTE_NOTIFICATION,param); + } + +} diff --git a/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/TailchatPushService.java b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/TailchatPushService.java new file mode 100644 index 00000000000..544e9058e2b --- /dev/null +++ b/client/mobile/android/app/src/main/java/com/msgbyte/tailchat/TailchatPushService.java @@ -0,0 +1,6 @@ +package com.msgbyte.tailchat; + +import com.igexin.sdk.PushService; + +public class TailchatPushService extends PushService { +} diff --git a/client/mobile/android/app/src/main/res/drawable/rn_edit_text_material.xml b/client/mobile/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 00000000000..f35d9962026 --- /dev/null +++ b/client/mobile/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 00000000000..98fec8d0ce4 Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 00000000000..98fec8d0ce4 Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 00000000000..99e58d9b88b Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 00000000000..99e58d9b88b Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 00000000000..2806127c243 Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 00000000000..2806127c243 Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 00000000000..9e8d9f6d172 Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 00000000000..9e8d9f6d172 Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000000..9b4a59e0330 Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 00000000000..9b4a59e0330 Binary files /dev/null and b/client/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/client/mobile/android/app/src/main/res/values/strings.xml b/client/mobile/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000000..50fd400170b --- /dev/null +++ b/client/mobile/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Tailchat + diff --git a/client/mobile/android/app/src/main/res/values/styles.xml b/client/mobile/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000000..7ba83a2ad5a --- /dev/null +++ b/client/mobile/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/client/mobile/android/app/src/release/java/com/tailchat/ReactNativeFlipper.java b/client/mobile/android/app/src/release/java/com/tailchat/ReactNativeFlipper.java new file mode 100644 index 00000000000..480eeec6000 --- /dev/null +++ b/client/mobile/android/app/src/release/java/com/tailchat/ReactNativeFlipper.java @@ -0,0 +1,20 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.msgbyte.tailchat; + +import android.content.Context; +import com.facebook.react.ReactInstanceManager; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the release + * flavor of it so it's empty as we don't want to load Flipper. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + // Do nothing as we don't want to initialize Flipper on Release. + } +} diff --git a/client/mobile/android/build.gradle b/client/mobile/android/build.gradle new file mode 100644 index 00000000000..075cfc40df5 --- /dev/null +++ b/client/mobile/android/build.gradle @@ -0,0 +1,41 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext { + buildToolsVersion = "33.0.0" + minSdkVersion = 21 + compileSdkVersion = 33 + targetSdkVersion = 33 + + // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. + ndkVersion = "23.1.7779620" + } + repositories { + google() + mavenCentral() + + maven { + url "https://developer.huawei.com/repo/" + } + } + dependencies { + classpath("com.android.tools.build:gradle:7.3.1") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("com.huawei.agconnect:agcp:1.6.0.300") + } +} + +allprojects { + repositories { + maven { + url "https://mvn.getui.com/nexus/content/repositories/releases/" + } + + maven { + url "https://developer.huawei.com/repo/" + } + + google() + mavenCentral() + } +} diff --git a/client/mobile/android/gradle.properties b/client/mobile/android/gradle.properties new file mode 100644 index 00000000000..e4af465e8a1 --- /dev/null +++ b/client/mobile/android/gradle.properties @@ -0,0 +1,44 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + +# Version of flipper SDK to use with React Native +FLIPPER_VERSION=0.125.0 + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=false + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true diff --git a/client/mobile/android/gradle/wrapper/gradle-wrapper.jar b/client/mobile/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000000..41d9927a4d4 Binary files /dev/null and b/client/mobile/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/client/mobile/android/gradle/wrapper/gradle-wrapper.properties b/client/mobile/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..8fad3f5a98b --- /dev/null +++ b/client/mobile/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/client/mobile/android/gradlew b/client/mobile/android/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/client/mobile/android/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/client/mobile/android/gradlew.bat b/client/mobile/android/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/client/mobile/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/client/mobile/android/settings.gradle b/client/mobile/android/settings.gradle new file mode 100644 index 00000000000..1ad803619f6 --- /dev/null +++ b/client/mobile/android/settings.gradle @@ -0,0 +1,5 @@ +rootProject.name = 'Tailchat' +apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) +include ':app' + +includeBuild('../node_modules/react-native-gradle-plugin') diff --git a/client/mobile/app.json b/client/mobile/app.json new file mode 100644 index 00000000000..0ff1bd2699a --- /dev/null +++ b/client/mobile/app.json @@ -0,0 +1,4 @@ +{ + "name": "Tailchat", + "displayName": "Tailchat" +} \ No newline at end of file diff --git a/client/mobile/babel.config.js b/client/mobile/babel.config.js new file mode 100644 index 00000000000..983e075de7b --- /dev/null +++ b/client/mobile/babel.config.js @@ -0,0 +1,4 @@ +module.exports = { + presets: ['module:metro-react-native-babel-preset'], + plugins: ['react-native-reanimated/plugin'], +}; diff --git a/client/mobile/index.js b/client/mobile/index.js new file mode 100644 index 00000000000..752e7ee3c14 --- /dev/null +++ b/client/mobile/index.js @@ -0,0 +1,9 @@ +/** + * @format + */ + +import { AppRegistry } from 'react-native'; +import App from './src/App'; +import { name as appName } from './app.json'; + +AppRegistry.registerComponent(appName, () => App); diff --git a/client/mobile/ios/.xcode.env b/client/mobile/ios/.xcode.env new file mode 100644 index 00000000000..3d5782c7156 --- /dev/null +++ b/client/mobile/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/client/mobile/ios/Podfile b/client/mobile/ios/Podfile new file mode 100644 index 00000000000..c95beafda18 --- /dev/null +++ b/client/mobile/ios/Podfile @@ -0,0 +1,84 @@ +require_relative '../node_modules/react-native/scripts/react_native_pods' +require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' +require_relative '../node_modules/react-native-permissions/scripts/setup' + +platform :ios, min_ios_version_supported +prepare_react_native_project! + +setup_permissions([ + # 'AppTrackingTransparency', + # 'BluetoothPeripheral', + # 'Calendars', + 'Camera', + # 'Contacts', + # 'FaceID', + # 'LocationAccuracy', + # 'LocationAlways', + # 'LocationWhenInUse', + # 'MediaLibrary', + 'Microphone', + # 'Motion', + 'Notifications', + # 'PhotoLibrary', + # 'PhotoLibraryAddOnly', + # 'Reminders', + # 'Siri', + # 'SpeechRecognition', + # 'StoreKit', +]) + + +# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. +# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded +# +# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` +# ```js +# module.exports = { +# dependencies: { +# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), +# ``` +flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled + +linkage = ENV['USE_FRAMEWORKS'] +if linkage != nil + Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green + use_frameworks! :linkage => linkage.to_sym +end + +target 'Tailchat' do + config = use_native_modules! + + # Flags change depending on the env values. + flags = get_default_flags() + + use_react_native!( + :path => config[:reactNativePath], + # Hermes is now enabled by default. Disable by setting this flag to false. + # Upcoming versions of React Native may rely on get_default_flags(), but + # we make it explicit here to aid in the React Native upgrade process. + :hermes_enabled => flags[:hermes_enabled], + :fabric_enabled => flags[:fabric_enabled], + # Enables Flipper. + # + # Note that if you have use_frameworks! enabled, Flipper will not work and + # you should disable the next line. + :flipper_configuration => flipper_config, + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) + + target 'TailchatTests' do + inherit! :complete + # Pods for testing + end + + post_install do |installer| + react_native_post_install( + installer, + # Set `mac_catalyst_enabled` to `true` in order to apply patches + # necessary for Mac Catalyst builds + :mac_catalyst_enabled => false + ) + __apply_Xcode_12_5_M1_post_install_workaround(installer) + end +end diff --git a/client/mobile/ios/Podfile.lock b/client/mobile/ios/Podfile.lock new file mode 100644 index 00000000000..44d6f756132 --- /dev/null +++ b/client/mobile/ios/Podfile.lock @@ -0,0 +1,707 @@ +PODS: + - boost (1.76.0) + - CocoaAsyncSocket (7.6.5) + - DoubleConversion (1.1.6) + - FBLazyVector (0.71.2) + - FBReactNativeSpec (0.71.2): + - RCT-Folly (= 2021.07.22.00) + - RCTRequired (= 0.71.2) + - RCTTypeSafety (= 0.71.2) + - React-Core (= 0.71.2) + - React-jsi (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - Flipper (0.125.0): + - Flipper-Folly (~> 2.6) + - Flipper-RSocket (~> 1.4) + - Flipper-Boost-iOSX (1.76.0.1.11) + - Flipper-DoubleConversion (3.2.0.1) + - Flipper-Fmt (7.1.7) + - Flipper-Folly (2.6.10): + - Flipper-Boost-iOSX + - Flipper-DoubleConversion + - Flipper-Fmt (= 7.1.7) + - Flipper-Glog + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - Flipper-Glog (0.5.0.5) + - Flipper-PeerTalk (0.0.4) + - Flipper-RSocket (1.4.3): + - Flipper-Folly (~> 2.6) + - FlipperKit (0.125.0): + - FlipperKit/Core (= 0.125.0) + - FlipperKit/Core (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/CppBridge + - FlipperKit/FBCxxFollyDynamicConvert + - FlipperKit/FBDefines + - FlipperKit/FKPortForwarding + - SocketRocket (~> 0.6.0) + - FlipperKit/CppBridge (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (0.125.0): + - Flipper-Folly (~> 2.6) + - FlipperKit/FBDefines (0.125.0) + - FlipperKit/FKPortForwarding (0.125.0): + - CocoaAsyncSocket (~> 7.6) + - Flipper-PeerTalk (~> 0.0.4) + - FlipperKit/FlipperKitHighlightOverlay (0.125.0) + - FlipperKit/FlipperKitLayoutHelpers (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutTextSearchable + - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - FlipperKit/FlipperKitLayoutIOSDescriptors + - FlipperKit/FlipperKitLayoutTextSearchable + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitReactPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/SKIOSNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitNetworkPlugin + - fmt (6.2.1) + - glog (0.3.5) + - hermes-engine (0.71.2): + - hermes-engine/Pre-built (= 0.71.2) + - hermes-engine/Pre-built (0.71.2) + - libevent (2.1.12) + - OpenSSL-Universal (1.1.1100) + - RCT-Folly (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Default (= 2021.07.22.00) + - RCT-Folly/Default (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Futures (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - libevent + - RCTRequired (0.71.2) + - RCTTypeSafety (0.71.2): + - FBLazyVector (= 0.71.2) + - RCTRequired (= 0.71.2) + - React-Core (= 0.71.2) + - React (0.71.2): + - React-Core (= 0.71.2) + - React-Core/DevSupport (= 0.71.2) + - React-Core/RCTWebSocket (= 0.71.2) + - React-RCTActionSheet (= 0.71.2) + - React-RCTAnimation (= 0.71.2) + - React-RCTBlob (= 0.71.2) + - React-RCTImage (= 0.71.2) + - React-RCTLinking (= 0.71.2) + - React-RCTNetwork (= 0.71.2) + - React-RCTSettings (= 0.71.2) + - React-RCTText (= 0.71.2) + - React-RCTVibration (= 0.71.2) + - React-callinvoker (0.71.2) + - React-Codegen (0.71.2): + - FBReactNativeSpec + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-jsi + - React-jsiexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-Core (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.71.2) + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/CoreModulesHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/Default (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/DevSupport (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.71.2) + - React-Core/RCTWebSocket (= 0.71.2) + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-jsinspector (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTActionSheetHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTAnimationHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTBlobHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTImageHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTLinkingHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTNetworkHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTSettingsHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTTextHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTVibrationHeaders (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-Core/RCTWebSocket (0.71.2): + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.71.2) + - React-cxxreact (= 0.71.2) + - React-hermes + - React-jsi (= 0.71.2) + - React-jsiexecutor (= 0.71.2) + - React-perflogger (= 0.71.2) + - Yoga + - React-CoreModules (0.71.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.2) + - React-Codegen (= 0.71.2) + - React-Core/CoreModulesHeaders (= 0.71.2) + - React-jsi (= 0.71.2) + - React-RCTBlob + - React-RCTImage (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - React-cxxreact (0.71.2): + - boost (= 1.76.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.71.2) + - React-jsi (= 0.71.2) + - React-jsinspector (= 0.71.2) + - React-logger (= 0.71.2) + - React-perflogger (= 0.71.2) + - React-runtimeexecutor (= 0.71.2) + - React-hermes (0.71.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - RCT-Folly/Futures (= 2021.07.22.00) + - React-cxxreact (= 0.71.2) + - React-jsi + - React-jsiexecutor (= 0.71.2) + - React-jsinspector (= 0.71.2) + - React-perflogger (= 0.71.2) + - React-jsi (0.71.2): + - boost (= 1.76.0) + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-jsiexecutor (0.71.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-cxxreact (= 0.71.2) + - React-jsi (= 0.71.2) + - React-perflogger (= 0.71.2) + - React-jsinspector (0.71.2) + - React-logger (0.71.2): + - glog + - react-native-config (1.5.0): + - react-native-config/App (= 1.5.0) + - react-native-config/App (1.5.0): + - React-Core + - react-native-webview (11.26.1): + - React-Core + - React-perflogger (0.71.2) + - React-RCTActionSheet (0.71.2): + - React-Core/RCTActionSheetHeaders (= 0.71.2) + - React-RCTAnimation (0.71.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.2) + - React-Codegen (= 0.71.2) + - React-Core/RCTAnimationHeaders (= 0.71.2) + - React-jsi (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - React-RCTAppDelegate (0.71.2): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - ReactCommon/turbomodule/core + - React-RCTBlob (0.71.2): + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.71.2) + - React-Core/RCTBlobHeaders (= 0.71.2) + - React-Core/RCTWebSocket (= 0.71.2) + - React-jsi (= 0.71.2) + - React-RCTNetwork (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - React-RCTImage (0.71.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.2) + - React-Codegen (= 0.71.2) + - React-Core/RCTImageHeaders (= 0.71.2) + - React-jsi (= 0.71.2) + - React-RCTNetwork (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - React-RCTLinking (0.71.2): + - React-Codegen (= 0.71.2) + - React-Core/RCTLinkingHeaders (= 0.71.2) + - React-jsi (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - React-RCTNetwork (0.71.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.2) + - React-Codegen (= 0.71.2) + - React-Core/RCTNetworkHeaders (= 0.71.2) + - React-jsi (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - React-RCTSettings (0.71.2): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.71.2) + - React-Codegen (= 0.71.2) + - React-Core/RCTSettingsHeaders (= 0.71.2) + - React-jsi (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - React-RCTText (0.71.2): + - React-Core/RCTTextHeaders (= 0.71.2) + - React-RCTVibration (0.71.2): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.71.2) + - React-Core/RCTVibrationHeaders (= 0.71.2) + - React-jsi (= 0.71.2) + - ReactCommon/turbomodule/core (= 0.71.2) + - React-runtimeexecutor (0.71.2): + - React-jsi (= 0.71.2) + - ReactCommon/turbomodule/bridging (0.71.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.71.2) + - React-Core (= 0.71.2) + - React-cxxreact (= 0.71.2) + - React-jsi (= 0.71.2) + - React-logger (= 0.71.2) + - React-perflogger (= 0.71.2) + - ReactCommon/turbomodule/core (0.71.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.71.2) + - React-Core (= 0.71.2) + - React-cxxreact (= 0.71.2) + - React-jsi (= 0.71.2) + - React-logger (= 0.71.2) + - React-perflogger (= 0.71.2) + - ReactNativeUiLib (3.0.9): + - React + - RNCAsyncStorage (1.17.11): + - React-Core + - RNDeviceInfo (10.5.1): + - React-Core + - RNGestureHandler (2.9.0): + - React-Core + - RNLocalize (2.2.6): + - React-Core + - RNNotifee (7.6.1): + - React-Core + - RNNotifee/NotifeeCore (= 7.6.1) + - RNNotifee/NotifeeCore (7.6.1): + - React-Core + - RNReanimated (2.14.4): + - DoubleConversion + - FBLazyVector + - FBReactNativeSpec + - glog + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-callinvoker + - React-Core + - React-Core/DevSupport + - React-Core/RCTWebSocket + - React-CoreModules + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-RCTActionSheet + - React-RCTAnimation + - React-RCTBlob + - React-RCTImage + - React-RCTLinking + - React-RCTNetwork + - React-RCTSettings + - React-RCTText + - ReactCommon/turbomodule/core + - Yoga + - SocketRocket (0.6.0) + - Yoga (1.14.0) + - YogaKit (1.18.1): + - Yoga (~> 1.14) + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - Flipper (= 0.125.0) + - Flipper-Boost-iOSX (= 1.76.0.1.11) + - Flipper-DoubleConversion (= 3.2.0.1) + - Flipper-Fmt (= 7.1.7) + - Flipper-Folly (= 2.6.10) + - Flipper-Glog (= 0.5.0.5) + - Flipper-PeerTalk (= 0.0.4) + - Flipper-RSocket (= 1.4.3) + - FlipperKit (= 0.125.0) + - FlipperKit/Core (= 0.125.0) + - FlipperKit/CppBridge (= 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0) + - FlipperKit/FBDefines (= 0.125.0) + - FlipperKit/FKPortForwarding (= 0.125.0) + - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0) + - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0) + - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0) + - FlipperKit/FlipperKitReactPlugin (= 0.125.0) + - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0) + - FlipperKit/SKIOSNetworkPlugin (= 0.125.0) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Codegen (from `build/generated/ios`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/DevSupport (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - react-native-config (from `../node_modules/react-native-config`) + - react-native-webview (from `../node_modules/react-native-webview`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativeUiLib (from `../node_modules/react-native-ui-lib`) + - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" + - RNDeviceInfo (from `../node_modules/react-native-device-info`) + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNLocalize (from `../node_modules/react-native-localize`) + - "RNNotifee (from `../node_modules/@notifee/react-native`)" + - RNReanimated (from `../node_modules/react-native-reanimated`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - CocoaAsyncSocket + - Flipper + - Flipper-Boost-iOSX + - Flipper-DoubleConversion + - Flipper-Fmt + - Flipper-Folly + - Flipper-Glog + - Flipper-PeerTalk + - Flipper-RSocket + - FlipperKit + - fmt + - libevent + - OpenSSL-Universal + - SocketRocket + - YogaKit + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/React/FBReactNativeSpec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Codegen: + :path: build/generated/ios + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + react-native-config: + :path: "../node_modules/react-native-config" + react-native-webview: + :path: "../node_modules/react-native-webview" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + ReactNativeUiLib: + :path: "../node_modules/react-native-ui-lib" + RNCAsyncStorage: + :path: "../node_modules/@react-native-async-storage/async-storage" + RNDeviceInfo: + :path: "../node_modules/react-native-device-info" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" + RNLocalize: + :path: "../node_modules/react-native-localize" + RNNotifee: + :path: "../node_modules/@notifee/react-native" + RNReanimated: + :path: "../node_modules/react-native-reanimated" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: 57d2868c099736d80fcd648bf211b4431e51a558 + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + FBLazyVector: d58428b28fe1f5070fe993495b0e2eaf701d3820 + FBReactNativeSpec: 225fb0f0ab00493ce0731f954da3658638d9b191 + Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0 + Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c + Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 + Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b + Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3 + Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446 + Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 + Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 + FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + hermes-engine: 6351580c827b3b03e5f25aadcf989f582d0b0a86 + libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c + RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 + RCTRequired: c154ebcfbf41d6fef86c52674fc1aa08837ff538 + RCTTypeSafety: 3063e5a1e5b1dc2cbeda5c8f8926c0ad1a6b0871 + React: 0a1a36e8e81cfaac244ed88b97f23ab56e5434f0 + React-callinvoker: 679a09fbfe1a8bbf0c8588b588bf3ef85e7e4922 + React-Codegen: 78f8966839f22b54d3303a6aca2679bce5723c3f + React-Core: 679e5ff1eb0e3122463976d0b2049bebcb7b33d6 + React-CoreModules: 06cbf15185e6daf9fb3aec02c963f4807bd794b3 + React-cxxreact: 645dc75c9deba4c15698b1b5902236d6a766461f + React-hermes: bc7bcfeaaa7cb98dc9f9252f2f3eca66f06f01e2 + React-jsi: 82625f9f1f8d7abf716d897612a9ea06ecf6db6e + React-jsiexecutor: c7e028406112db456ac3cf5720d266bc7bc20938 + React-jsinspector: ea8101acf525ec08b2d87ddf0637d45f8e3b4148 + React-logger: 97987f46779d8dd24656474ad0c43a5b459f31d6 + react-native-config: 5330c8258265c1e5fdb8c009d2cabd6badd96727 + react-native-webview: 9f111dfbcfc826084d6c507f569e5e03342ee1c1 + React-perflogger: c7ccda3d1d1da837f7ff4e54e816022a6803ee87 + React-RCTActionSheet: 01c125aebbad462a24228f68c584c7a921d6c28e + React-RCTAnimation: 5277a9440acffc4a5b7baa6ae3880fe467277ae6 + React-RCTAppDelegate: 3977201606125157aa94872b4171ca316478939b + React-RCTBlob: 8e15fc9091d8947f406ba706f11505b38b1b5e40 + React-RCTImage: 65319acfe82b85219b2d410725a593abe19ac795 + React-RCTLinking: a5fc2b9d7a346d6e7d34de8093bb5d1064042508 + React-RCTNetwork: 5d1efcd01ca7f08ebf286d68be544f747a5d315a + React-RCTSettings: fa760b0add819ac3ad73b06715f9547316acdf20 + React-RCTText: 05c244b135d75d4395eb35c012949a5326f8ab70 + React-RCTVibration: 0af3babdeee1b2d052811a2f86977d1e1c81ebd1 + React-runtimeexecutor: 4bf9a9086d27f74065fce1dddac274aa95216952 + ReactCommon: f697c0ac52e999aa818e43e2b6f277787c735e2d + ReactNativeUiLib: 8d3804947431a465a69f09c5e785c988314612a9 + RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 + RNDeviceInfo: fb81318c9cd5ebe30ebf12bcd046d818c87f9b53 + RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39 + RNLocalize: d4b8af4e442d4bcca54e68fc687a2129b4d71a81 + RNNotifee: bdc064c29f4d558046f51f0c3ae02bab4fd3cd85 + RNReanimated: cc5e3aa479cb9170bcccf8204291a6950a3be128 + SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 + Yoga: 5b0304b3dbef2b52e078052138e23a19c7dacaef + YogaKit: f782866e155069a2cca2517aafea43200b01fd5a + +PODFILE CHECKSUM: 9aaf3e7752d79b6a889333eec3c3b53e8133916b + +COCOAPODS: 1.11.3 diff --git a/client/mobile/ios/Tailchat.xcodeproj/project.pbxproj b/client/mobile/ios/Tailchat.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..9343447e5b7 --- /dev/null +++ b/client/mobile/ios/Tailchat.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 00E356F31AD99517003FC87E /* TailchatTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* TailchatTests.m */; }; + 0C80B921A6F3F58F76C31292 /* libPods-Tailchat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-Tailchat.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 7699B88040F8A987B510C191 /* libPods-Tailchat-TailchatTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Tailchat-TailchatTests.a */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = Tailchat; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00E356EE1AD99517003FC87E /* TailchatTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TailchatTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* TailchatTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TailchatTests.m; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* Tailchat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tailchat.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Tailchat/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Tailchat/AppDelegate.mm; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Tailchat/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Tailchat/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Tailchat/main.m; sourceTree = ""; }; + 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Tailchat-TailchatTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Tailchat-TailchatTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B4392A12AC88292D35C810B /* Pods-Tailchat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tailchat.debug.xcconfig"; path = "Target Support Files/Pods-Tailchat/Pods-Tailchat.debug.xcconfig"; sourceTree = ""; }; + 5709B34CF0A7D63546082F79 /* Pods-Tailchat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tailchat.release.xcconfig"; path = "Target Support Files/Pods-Tailchat/Pods-Tailchat.release.xcconfig"; sourceTree = ""; }; + 5B7EB9410499542E8C5724F5 /* Pods-Tailchat-TailchatTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tailchat-TailchatTests.debug.xcconfig"; path = "Target Support Files/Pods-Tailchat-TailchatTests/Pods-Tailchat-TailchatTests.debug.xcconfig"; sourceTree = ""; }; + 5DCACB8F33CDC322A6C60F78 /* libPods-Tailchat.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Tailchat.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = Tailchat/LaunchScreen.storyboard; sourceTree = ""; }; + 89C6BE57DB24E9ADA2F236DE /* Pods-Tailchat-TailchatTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tailchat-TailchatTests.release.xcconfig"; path = "Target Support Files/Pods-Tailchat-TailchatTests/Pods-Tailchat-TailchatTests.release.xcconfig"; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7699B88040F8A987B510C191 /* libPods-Tailchat-TailchatTests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0C80B921A6F3F58F76C31292 /* libPods-Tailchat.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00E356EF1AD99517003FC87E /* TailchatTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* TailchatTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = TailchatTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* Tailchat */ = { + isa = PBXGroup; + children = ( + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = Tailchat; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 5DCACB8F33CDC322A6C60F78 /* libPods-Tailchat.a */, + 19F6CBCC0A4E27FBF8BF4A61 /* libPods-Tailchat-TailchatTests.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* Tailchat */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* TailchatTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + BBD78D7AC51CEA395F1C20DB /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* Tailchat.app */, + 00E356EE1AD99517003FC87E /* TailchatTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + BBD78D7AC51CEA395F1C20DB /* Pods */ = { + isa = PBXGroup; + children = ( + 3B4392A12AC88292D35C810B /* Pods-Tailchat.debug.xcconfig */, + 5709B34CF0A7D63546082F79 /* Pods-Tailchat.release.xcconfig */, + 5B7EB9410499542E8C5724F5 /* Pods-Tailchat-TailchatTests.debug.xcconfig */, + 89C6BE57DB24E9ADA2F236DE /* Pods-Tailchat-TailchatTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* TailchatTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "TailchatTests" */; + buildPhases = ( + A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, + F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = TailchatTests; + productName = TailchatTests; + productReference = 00E356EE1AD99517003FC87E /* TailchatTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* Tailchat */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Tailchat" */; + buildPhases = ( + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, + FD10A7F022414F080027D42C /* Start Packager */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Tailchat; + productName = Tailchat; + productReference = 13B07F961A680F5B00A75B9A /* Tailchat.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1120; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Tailchat" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + "zh-Hans", + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* Tailchat */, + 00E356ED1AD99517003FC87E /* TailchatTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + }; + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Tailchat/Pods-Tailchat-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Tailchat/Pods-Tailchat-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Tailchat/Pods-Tailchat-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Tailchat-TailchatTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Tailchat-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Tailchat-TailchatTests/Pods-Tailchat-TailchatTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Tailchat-TailchatTests/Pods-Tailchat-TailchatTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Tailchat-TailchatTests/Pods-Tailchat-TailchatTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Tailchat/Pods-Tailchat-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Tailchat/Pods-Tailchat-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Tailchat/Pods-Tailchat-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Tailchat-TailchatTests/Pods-Tailchat-TailchatTests-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Tailchat-TailchatTests/Pods-Tailchat-TailchatTests-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Tailchat-TailchatTests/Pods-Tailchat-TailchatTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + FD10A7F022414F080027D42C /* Start Packager */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Start Packager"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* TailchatTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* Tailchat */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-Tailchat-TailchatTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = TailchatTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Tailchat.app/Tailchat"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-Tailchat-TailchatTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = TailchatTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Tailchat.app/Tailchat"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-Tailchat.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Tailchat/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = Tailchat; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-Tailchat.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = Tailchat/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = Tailchat; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "TailchatTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Tailchat" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Tailchat" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..919434a6254 --- /dev/null +++ b/client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000000..18d981003d6 --- /dev/null +++ b/client/mobile/ios/Tailchat.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/client/mobile/ios/Tailchat.xcodeproj/xcshareddata/xcschemes/Tailchat.xcscheme b/client/mobile/ios/Tailchat.xcodeproj/xcshareddata/xcschemes/Tailchat.xcscheme new file mode 100644 index 00000000000..be63f52c864 --- /dev/null +++ b/client/mobile/ios/Tailchat.xcodeproj/xcshareddata/xcschemes/Tailchat.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/mobile/ios/Tailchat.xcworkspace/contents.xcworkspacedata b/client/mobile/ios/Tailchat.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..7255f0a6c7f --- /dev/null +++ b/client/mobile/ios/Tailchat.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/client/mobile/ios/Tailchat/AppDelegate.h b/client/mobile/ios/Tailchat/AppDelegate.h new file mode 100644 index 00000000000..fd40ab896df --- /dev/null +++ b/client/mobile/ios/Tailchat/AppDelegate.h @@ -0,0 +1,14 @@ +#import +#import +#if __has_include() +#import +#elif __has_include("RCTGetuiModule.h") +#import "RCTGetuiModule.h" +#elif __has_include() +#import +#endif + + +@interface AppDelegate : RCTAppDelegate + +@end diff --git a/client/mobile/ios/Tailchat/AppDelegate.mm b/client/mobile/ios/Tailchat/AppDelegate.mm new file mode 100644 index 00000000000..e57004e140e --- /dev/null +++ b/client/mobile/ios/Tailchat/AppDelegate.mm @@ -0,0 +1,42 @@ +#import "AppDelegate.h" +#import "RNCConfig.h" + +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + // 接入个推 + [GeTuiSdk startSdkWithAppId:[RNCConfig envFor:@"GETUI_APPID"] appKey:[RNCConfig envFor:@"GETUI_APPKEY"] appSecret:[RNCConfig envFor:@"GETUI_APPSECRET"] delegate:[RCTGetuiModule sharedGetuiModule] launchingOptions:launchOptions]; + // APNs + [GeTuiSdk registerRemoteNotification: (UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge)]; + + self.moduleName = @"Tailchat"; + // You can add your custom initial props in the dictionary below. + // They will be passed down to the ViewController used by React Native. + self.initialProps = @{}; + + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. +/// +/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html +/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). +/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`. +- (BOOL)concurrentRootEnabled +{ + return true; +} + +@end diff --git a/client/mobile/ios/Tailchat/Images.xcassets/AppIcon.appiconset/Contents.json b/client/mobile/ios/Tailchat/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..81213230deb --- /dev/null +++ b/client/mobile/ios/Tailchat/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/client/mobile/ios/Tailchat/Images.xcassets/Contents.json b/client/mobile/ios/Tailchat/Images.xcassets/Contents.json new file mode 100644 index 00000000000..2d92bd53fdb --- /dev/null +++ b/client/mobile/ios/Tailchat/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/client/mobile/ios/Tailchat/Info.plist b/client/mobile/ios/Tailchat/Info.plist new file mode 100644 index 00000000000..4cb6910a8ed --- /dev/null +++ b/client/mobile/ios/Tailchat/Info.plist @@ -0,0 +1,55 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Tailchat + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocationWhenInUseUsageDescription + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/client/mobile/ios/Tailchat/LaunchScreen.storyboard b/client/mobile/ios/Tailchat/LaunchScreen.storyboard new file mode 100644 index 00000000000..235c46b2a2e --- /dev/null +++ b/client/mobile/ios/Tailchat/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/mobile/ios/Tailchat/main.m b/client/mobile/ios/Tailchat/main.m new file mode 100644 index 00000000000..d645c7246c4 --- /dev/null +++ b/client/mobile/ios/Tailchat/main.m @@ -0,0 +1,10 @@ +#import + +#import "AppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/client/mobile/ios/TailchatTests/Info.plist b/client/mobile/ios/TailchatTests/Info.plist new file mode 100644 index 00000000000..ba72822e872 --- /dev/null +++ b/client/mobile/ios/TailchatTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/client/mobile/ios/TailchatTests/TailchatTests.m b/client/mobile/ios/TailchatTests/TailchatTests.m new file mode 100644 index 00000000000..ba4e7d221ec --- /dev/null +++ b/client/mobile/ios/TailchatTests/TailchatTests.m @@ -0,0 +1,66 @@ +#import +#import + +#import +#import + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React" + +@interface TailchatTests : XCTestCase + +@end + +@implementation TailchatTests + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen +{ + UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + + __block NSString *redboxError = nil; +#ifdef DEBUG + RCTSetLogFunction( + ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); +#endif + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + foundElement = [self findSubviewInView:vc.view + matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + +#ifdef DEBUG + RCTSetLogFunction(RCTDefaultLogFunction); +#endif + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + +@end diff --git a/client/mobile/metro.config.js b/client/mobile/metro.config.js new file mode 100644 index 00000000000..e91aba937cd --- /dev/null +++ b/client/mobile/metro.config.js @@ -0,0 +1,17 @@ +/** + * Metro configuration for React Native + * https://github.com/facebook/react-native + * + * @format + */ + +module.exports = { + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), + }, +}; diff --git a/client/mobile/package.json b/client/mobile/package.json new file mode 100644 index 00000000000..6ca845e25f1 --- /dev/null +++ b/client/mobile/package.json @@ -0,0 +1,66 @@ +{ + "name": "tailchat-mobile", + "version": "0.0.1", + "private": true, + "scripts": { + "GetuiConfigure": "node node_modules/react-native-getui/GetuiConfiguration.js", + "android": "react-native run-android", + "ios": "react-native run-ios", + "lint": "eslint .", + "start": "react-native start", + "doctor": "react-native doctor", + "patch-package": "patch-package", + "postinstall": "patch-package", + "plugins:all": "ministar buildPlugin all", + "test": "jest" + }, + "dependencies": { + "@formatjs/intl": "^2.6.9", + "@notifee/react-native": "^7.6.1", + "@react-native-async-storage/async-storage": "^1.17.11", + "@react-native-community/clipboard": "^1.5.1", + "immer": "^9.0.19", + "lodash": "^4.17.21", + "mini-star": "^2.0.8", + "patch-package": "^6.5.1", + "postinstall-postinstall": "^2.1.0", + "react": "18.2.0", + "react-native": "0.71.2", + "react-native-config": "^1.5.0", + "react-native-device-info": "^10.5.1", + "react-native-gesture-handler": "^2.9.0", + "react-native-localize": "^2.2.6", + "react-native-permissions": "^3.10.1", + "react-native-reanimated": "^2.14.4", + "react-native-ui-lib": "^6.29.1", + "react-native-webview": "^11.26.1", + "socket.io-client": "^4.6.1", + "socket.io-msgpack-parser": "^3.0.2", + "tailchat-client-sdk": "^1.0.0", + "url-regex": "^5.0.0", + "zustand": "^4.3.2" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@babel/preset-env": "^7.20.0", + "@babel/runtime": "^7.20.0", + "@react-native-community/eslint-config": "^3.2.0", + "@tsconfig/react-native": "^2.0.2", + "@types/fs-extra": "^11.0.1", + "@types/jest": "^29.2.1", + "@types/lodash": "^4.14.191", + "@types/react": "^18.0.24", + "@types/react-test-renderer": "^18.0.0", + "babel-jest": "^29.2.1", + "eslint": "^8.19.0", + "fs-extra": "^11.1.0", + "jest": "^29.2.1", + "metro-react-native-babel-preset": "0.73.7", + "prettier": "^2.4.1", + "react-test-renderer": "18.2.0", + "typescript": "4.8.4" + }, + "jest": { + "preset": "react-native" + } +} diff --git a/client/mobile/scripts/notify-links.js b/client/mobile/scripts/notify-links.js new file mode 100644 index 00000000000..3914ddf72cf --- /dev/null +++ b/client/mobile/scripts/notify-links.js @@ -0,0 +1,56 @@ +const tailchat = require('tailchat-client-sdk'); +const fs = require('fs-extra'); +const os = require('os'); +const path = require('path'); + +// reference: https://docs.codemagic.io/yaml-basic-configuration/environment-variables/#artifact-links +const artifactLinks = process.env['CM_ARTIFACT_LINKS']; +const tailchatSubscribeId = process.env['TAILCHAT_SUBSCRIBE_ID']; +const branch = process.env['CM_BRANCH']; + +console.log('artifactLinks:', artifactLinks); + +if (tailchatSubscribeId) { + try { + if (fs.existsSync(path.join(os.homedir(), './SUCCESS'))) { + const links = JSON.parse(artifactLinks) ?? []; + const text = + '[b]App Building Success:[/b]\n' + + links + .map((link) => { + const { name, url, md5, versionName } = link; + const pagesUrl = + branch === 'master' + ? 'https://tailchat-app.msgbyte.com/app-release.apk' + : `https://${branch}.tailchat.pages.dev/app-release.apk`; + + return ( + `${name}\n` + + `version: ${versionName}(${md5})\n` + + `[url=${pagesUrl}]Download from Pages[/url] or [url=${url}]Download from CI[/url]` + ); + }) + .join('\n=========\n'); + + tailchat.sendSimpleNotify( + 'https://tailchat-nightly.moonrailgun.com/', + tailchatSubscribeId, + text + ); + } else { + const text = + '[b]App Building Failed:[/b]\n' + + `[url=https://codemagic.io/app/${process.env['CM_PROJECT_ID']}/build/${process.env['CM_BUILD_ID']}]View Detail[/url]`; + + tailchat.sendSimpleNotify( + 'https://tailchat-nightly.moonrailgun.com/', + tailchatSubscribeId, + text + ); + } + } catch (e) { + console.error(e); + } +} else { + console.error('Not found tailchatSubscribeId'); +} diff --git a/client/mobile/src/App.tsx b/client/mobile/src/App.tsx new file mode 100644 index 00000000000..5ae084b0dc2 --- /dev/null +++ b/client/mobile/src/App.tsx @@ -0,0 +1,46 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * + * @format + */ + +import React from 'react'; +import { SafeAreaView, StatusBar, useColorScheme } from 'react-native'; +import { AppMain } from './AppMain'; +import { Entry } from './Entry'; +import { useServerStore } from './store/server'; +import { useUIStore } from './store/ui'; +import { theme } from './theme'; + +function App(): JSX.Element { + const { colorScheme } = useUIStore(); + const systemColorScheme = useColorScheme(); + const finalColorScheme = + colorScheme === 'auto' ? systemColorScheme : colorScheme; + const isDarkMode = finalColorScheme === 'dark'; + const selectedServerInfo = useServerStore( + (state) => state.selectedServerInfo + ); + + const backgroundStyle = { + backgroundColor: isDarkMode ? theme.contentBg.dark : theme.contentBg.light, + }; + + return ( + + + + {selectedServerInfo ? ( + + ) : ( + + )} + + ); +} + +export default App; diff --git a/client/mobile/src/AppMain.tsx b/client/mobile/src/AppMain.tsx new file mode 100644 index 00000000000..18f910931d2 --- /dev/null +++ b/client/mobile/src/AppMain.tsx @@ -0,0 +1,55 @@ +import React, { useRef } from 'react'; +import { StyleSheet, View } from 'react-native'; +import { WebView } from 'react-native-webview'; +import { generateInjectedScript } from './lib/inject'; +import { handleTailchatMessage } from './lib/inject/message-handler'; + +/** + * Tailchat的主要内容 + * + * 由webview提供 + */ + +interface Props { + host: string; +} +export const AppMain: React.FC = React.memo((props) => { + const webviewRef = useRef(null); + + return ( + + { + if (!webviewRef.current) { + return; + } + + try { + const raw = e.nativeEvent.data as string; + const data = JSON.parse(raw); + if (typeof data === 'object' && data._isTailchat === true) { + handleTailchatMessage( + data.type, + data.payload, + webviewRef.current + ); + } + } catch (err) { + console.error('webview onmessage:', err); + } + }} + /> + + ); +}); +AppMain.displayName = 'AppMain'; + +const styles = StyleSheet.create({ + root: { + height: '100%', + }, +}); diff --git a/client/mobile/src/Entry.tsx b/client/mobile/src/Entry.tsx new file mode 100644 index 00000000000..9e36e8cdf39 --- /dev/null +++ b/client/mobile/src/Entry.tsx @@ -0,0 +1,162 @@ +import React, { useEffect, useState } from 'react'; +import { Alert, StyleSheet, ScrollView } from 'react-native'; +import Clipboard from '@react-native-community/clipboard'; +import { ServerCard } from './components/ServerCard'; +import { useServerStore } from './store/server'; +import { + Button, + PanningProvider, + Text, + View, + ActionSheet, + TextField, + TouchableOpacity, + Dialog, +} from 'react-native-ui-lib'; +import { isValidUrl } from './lib/utils'; +import { translate } from './lib/i18n'; +import { getClientId } from './lib/notifications/getui'; +import { useToast } from './hooks/useToast'; + +export const Entry: React.FC = React.memo(() => { + const { serverList, selectServer, addServer, removeServer } = + useServerStore(); + const [dialogVisible, setDialogVisible] = useState(false); + const [serverUrl, setServerUrl] = useState(''); + const [loading, setLoading] = useState(false); + const [selectedServer, setSelectedServer] = useState(''); + const [cid, setCid] = useState(''); + const { toastEl, showToast } = useToast(); + + useEffect(() => { + getClientId().then((cid) => { + setCid(cid); + }); + }, []); + + return ( + + + {serverList.map((serverInfo, i) => { + return ( + selectServer(serverInfo)} + onLongPress={() => { + if (i !== 0) { + setSelectedServer(serverInfo.url); + } + }} + /> + ); + })} + + setDialogVisible(true)} + /> + + setSelectedServer('')} + destructiveButtonIndex={0} + options={[ + { + label: translate('core.deleteServer'), + onPress: () => { + removeServer(selectedServer); + }, + }, + ]} + showCancelButton={true} + /> + +

setDialogVisible(false)} + > + + {translate('core.inputServerUrl')}: + + + + + + + + { + Clipboard.setString(cid); + showToast(translate('core.copySuccess')); + }} + > + + cid: {cid} + + + + + {toastEl} + + ); +}); +Entry.displayName = 'Entry'; + +const styles = StyleSheet.create({ + root: { + height: '100%', + padding: 20, + }, + main: { + flex: 1, + }, + item: { + marginBottom: 8, + }, + dialog: { + borderRadius: 8, + padding: 10, + }, + textInput: { + fontSize: 20, + borderColor: '#ccc', + borderWidth: 1, + marginTop: 4, + marginBottom: 10, + paddingHorizontal: 8, + paddingVertical: 4, + }, +}); diff --git a/client/mobile/src/components/ServerCard.tsx b/client/mobile/src/components/ServerCard.tsx new file mode 100644 index 00000000000..83c65a5a250 --- /dev/null +++ b/client/mobile/src/components/ServerCard.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { StyleProp, StyleSheet, ViewStyle } from 'react-native'; +import { TouchableOpacity, Text } from 'react-native-ui-lib'; + +interface ServerCardProps { + style?: StyleProp; + name: string; + url?: string; + version?: string; + onPress?: () => void; + onLongPress?: () => void; +} +export const ServerCard: React.FC = React.memo((props) => { + return ( + + {props.name} + + {props.url && ( + + {props.url} + + )} + + {props.version && ( + + version: {props.version} + + )} + + ); +}); +ServerCard.displayName = 'ServerCard'; + +const styles = StyleSheet.create({ + root: { + height: 56, + padding: 8, + backgroundColor: 'white', + borderRadius: 4, + borderColor: '#ccc', + borderWidth: 1, + justifyContent: 'center', + }, + name: { + fontSize: 16, + textAlign: 'center', + }, + version: { + // color: '#999', + textAlign: 'center', + fontSize: 10, + }, + url: { + // color: '#999', + textAlign: 'center', + }, +}); diff --git a/client/mobile/src/hooks/useToast.tsx b/client/mobile/src/hooks/useToast.tsx new file mode 100644 index 00000000000..5bfbe272e42 --- /dev/null +++ b/client/mobile/src/hooks/useToast.tsx @@ -0,0 +1,28 @@ +import React, { useCallback, useState } from 'react'; +import { Incubator, ToastPresets } from 'react-native-ui-lib'; + +const { Toast } = Incubator; + +export function useToast() { + const [visible, setVisible] = useState(false); + const [message, setMessage] = useState(''); + + const showToast = useCallback((text: string) => { + setVisible(true); + setMessage(text); + }, []); + + return { + showToast, + toastEl: ( + setVisible(false)} + autoDismiss={3500} + swipeable={true} + /> + ), + }; +} diff --git a/client/mobile/src/lib/i18n/index.ts b/client/mobile/src/lib/i18n/index.ts new file mode 100644 index 00000000000..16de8e7badb --- /dev/null +++ b/client/mobile/src/lib/i18n/index.ts @@ -0,0 +1,33 @@ +import * as RNLocalize from 'react-native-localize'; +import { createIntl, createIntlCache } from '@formatjs/intl'; +import { I18nManager } from 'react-native'; + +const translations = { + en: require('./translations/en.json'), + zh: require('./translations/zh.json'), +} as const; + +type Translation = keyof typeof translations; + +const fallback = { languageTag: 'en', isRTL: false }; + +const { languageTag, isRTL } = + RNLocalize.findBestAvailableLanguage(Object.keys(translations)) ?? fallback; + +I18nManager.forceRTL(isRTL); + +const intl = createIntl( + { + defaultLocale: 'en', + locale: languageTag, + messages: translations[languageTag as Translation], + }, + createIntlCache() +); + +type TranslationParams = Parameters<(typeof intl)['formatMessage']>[1]; + +export const translate = (key: string, params?: TranslationParams) => + intl + .formatMessage({ id: key, defaultMessage: translations.en[key] }, params) + .toString(); diff --git a/client/mobile/src/lib/i18n/translations/en.json b/client/mobile/src/lib/i18n/translations/en.json new file mode 100644 index 00000000000..ff5e209ad14 --- /dev/null +++ b/client/mobile/src/lib/i18n/translations/en.json @@ -0,0 +1,13 @@ +{ + "core.addServer": "Add Server", + "core.selectedServer": "Selected Server", + "core.deleteServer": "Delete Server", + "core.inputServerUrl": "Input Server Url", + "core.confirm": "Confirm", + "core.copySuccess": "Copy Success", + "core.invalidUrl": "Input is not a valid url", + "core.addServerError": "Failed to add server, maybe the address entered is not a Tailchat service address", + "core.foregroundServiceTip": "Continue to keep the service running normally, and may not be able to receive message pushes after closing", + "core.foregroundServiceStopAction": "Stop Foreground Service" + +} diff --git a/client/mobile/src/lib/i18n/translations/zh.json b/client/mobile/src/lib/i18n/translations/zh.json new file mode 100644 index 00000000000..98df03f1377 --- /dev/null +++ b/client/mobile/src/lib/i18n/translations/zh.json @@ -0,0 +1,12 @@ +{ + "core.addServer": "添加服务器", + "core.selectedServer": "选中服务器", + "core.deleteServer": "删除服务器", + "core.inputServerUrl": "输入服务器地址", + "core.confirm": "确认", + "core.copySuccess": "复制成功", + "core.invalidUrl": "输入不是一个有效的url", + "core.addServerError": "添加服务器失败, 可能输入的地址不是一个Tailchat服务地址", + "core.foregroundServiceTip": "持续保持服务正常运行, 关闭后可能无法正常接受到消息推送", + "core.foregroundServiceStopAction": "停止前台服务" +} diff --git a/client/mobile/src/lib/inject/index.ts b/client/mobile/src/lib/inject/index.ts new file mode 100644 index 00000000000..6994363a28b --- /dev/null +++ b/client/mobile/src/lib/inject/index.ts @@ -0,0 +1,68 @@ +import { getVersion, getReadableVersion } from 'react-native-device-info'; + +/** + * 生成注入到Webview中的js代码 + */ +export function generateInstallPluginScript() { + /** + * manifest copy from: + * com.msgbyte.env.rn/manifest.json + */ + const inner = `function main() { + window.tailchat + .installPlugin({ + label: 'React Native Support', + 'label.zh-CN': 'ReactNative 支持', + name: 'com.msgbyte.env.rn', + url: '/plugins/com.msgbyte.env.rn/index.js', + version: '0.0.0', + author: 'moonrailgun', + description: 'Add support for ReactNative environment in Tailchat', + 'description.zh-CN': '在 Tailchat 添加对 ReactNative 环境的支持', + requireRestart: true, + }); + }`; + + const raw = `(${inner})()`; + return raw; +} + +export function generateDebugScript() { + const inner = `function main() { + console.error = (...args) => { + window.ReactNativeWebView.postMessage( + JSON.stringify({ + _isTailchat: true, + type: 'console:error', + payload: args, + }) + ); + }; + console.log = (...args) => { + window.ReactNativeWebView.postMessage( + JSON.stringify({ + _isTailchat: true, + type: 'console:log', + payload: JSON.stringify(args), + }) + ); + }; + }`; + + const raw = `(${inner})()`; + return raw; +} + +export function generateInjectedScript(): string { + return [generateDeviceInfo(), generatePostMessageScript()].join(';'); +} + +function generateDeviceInfo() { + return `window.__rnDeviceInfo = { version: "${getVersion()}", readableVersion: "${getReadableVersion()}" }`; +} + +function generatePostMessageScript() { + return `window.postMessage = function (data) { + window.ReactNativeWebView.postMessage(JSON.stringify(data)); + };`; +} diff --git a/client/mobile/src/lib/inject/message-handler.ts b/client/mobile/src/lib/inject/message-handler.ts new file mode 100644 index 00000000000..5103f3a4ec4 --- /dev/null +++ b/client/mobile/src/lib/inject/message-handler.ts @@ -0,0 +1,66 @@ +import type WebView from 'react-native-webview'; +import { generateDebugScript, generateInstallPluginScript } from '.'; +import { useUIStore } from '../../store/ui'; +import type { UserBaseInfo } from '../../types'; +import { initNotificationEnv, showNotification } from '../notifications'; +// import { bindSocketEvent, createSocket } from '../socket'; +import { AppState } from 'react-native'; +import { ensureWebRTCPermission } from '../permissions'; +import { isDev } from '../utils'; + +export function handleTailchatMessage( + type: string, + payload: any, + webview: WebView +) { + console.log('onMessage receive:', type, payload); + + if (type === 'init') { + webview.injectJavaScript(generateInstallPluginScript()); + + if (isDev()) { + webview.injectJavaScript(generateDebugScript()); + } + + return; + } + + if (type === 'loadColorScheme') { + // 设置颜色 + useUIStore.getState().setColorScheme(payload); + return; + } + + if (type === 'showNotification') { + if (AppState.currentState !== 'active') { + showNotification({ + title: payload.title, + body: payload.body, + icon: payload.icon, + }); + } + + return; + } + + if (type === 'ensureWebRTCPermission') { + ensureWebRTCPermission(); + } + + if (type === 'bindWebsocket') { + const userInfo = payload.userInfo as UserBaseInfo; + + initNotificationEnv({ + userId: userInfo._id, + nickname: userInfo.nickname ?? userInfo.email, + runService: () => { + // const serviceUrl: string = payload.url; + // const token: string = payload.token; + // createSocket(serviceUrl, token).then((socket) => { + // console.log('[createSocket]', 'socket', socket, 'userInfo', userInfo); + // bindSocketEvent(socket); + // }); + }, + }); + } +} diff --git a/client/mobile/src/lib/notifications/getui.ts b/client/mobile/src/lib/notifications/getui.ts new file mode 100644 index 00000000000..f95d9e06667 --- /dev/null +++ b/client/mobile/src/lib/notifications/getui.ts @@ -0,0 +1,23 @@ +import { NativeModules, Platform } from 'react-native'; +const GetuiModule = NativeModules.GetuiModule; + +/** + * bind alias with userId + * user for server push + */ +export function bindAlias(userId: string) { + getClientId().then((cid) => { + console.log('getui cid:', cid); + }); + if (Platform.OS === 'android') { + GetuiModule.bindAlias(userId, '0'); + } +} + +export function getClientId() { + return new Promise((resolve) => { + GetuiModule.clientId((param: string) => { + resolve(param); + }); + }); +} diff --git a/client/mobile/src/lib/notifications/index.ts b/client/mobile/src/lib/notifications/index.ts new file mode 100644 index 00000000000..c866808a76d --- /dev/null +++ b/client/mobile/src/lib/notifications/index.ts @@ -0,0 +1,97 @@ +import notifee, { EventType } from '@notifee/react-native'; +import { translate } from '../i18n'; +import { bindAlias } from './getui'; + +interface NotificationInfo { + title: string; + body: string; + icon?: string; +} + +// Create a channel (required for Android) +async function createDefaultChannel() { + const channelId = await notifee.createChannel({ + id: 'default', + name: 'Default Channel', + }); + + return channelId; +} + +/** + * 显示本地通知 + */ +export async function showNotification(info: NotificationInfo) { + console.log('call showNotification', info); + + await notifee.requestPermission(); // Request permissions (required for iOS) + + const channelId = await createDefaultChannel(); + + // Display a notification + await notifee.displayNotification({ + title: info.title, + body: info.body, + android: { + channelId, + // largeIcon: info.icon ?? undefined, + // smallIcon: info.icon ?? undefined, + // pressAction is needed if you want the notification to open the app when pressed + pressAction: { + id: 'default', + }, + }, + }); +} + +interface NotificationOptions { + userId: string; + nickname: string; + runService: () => void; +} +export async function initNotificationEnv(options: NotificationOptions) { + await notifee.requestPermission(); + + bindAlias(options.userId); + + // 厂商渠道还没有ready, 推送需要依赖前台服务保活 + // await initForegroundService(options); +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +async function initForegroundService(options: NotificationOptions) { + notifee.registerForegroundService((_notification) => { + return new Promise(() => { + // 一直pending,因此前台服务会一直存在 + options.runService(); + + notifee.onForegroundEvent(async ({ type, detail }) => { + if ( + type === EventType.ACTION_PRESS && + detail.pressAction?.id === 'stop' + ) { + await notifee.stopForegroundService(); + } + }); + }); + }); + + const channelId = await createDefaultChannel(); + + notifee.displayNotification({ + title: `Tailchat: ${options.nickname}`, + body: translate('core.foregroundServiceTip'), + android: { + channelId, + asForegroundService: true, + actions: [ + { + title: translate('core.foregroundServiceStopAction'), + pressAction: { + id: 'stop', + }, + }, + ], + }, + }); +} diff --git a/client/mobile/src/lib/permissions/index.ts b/client/mobile/src/lib/permissions/index.ts new file mode 100644 index 00000000000..3123ce9f4d0 --- /dev/null +++ b/client/mobile/src/lib/permissions/index.ts @@ -0,0 +1,22 @@ +import { request, check, PERMISSIONS } from 'react-native-permissions'; +import { Platform } from 'react-native'; + +export async function ensureWebRTCPermission() { + const cameraPermission = + Platform.OS === 'ios' ? PERMISSIONS.IOS.CAMERA : PERMISSIONS.ANDROID.CAMERA; + const microphonePermission = + Platform.OS === 'ios' + ? PERMISSIONS.IOS.MICROPHONE + : PERMISSIONS.ANDROID.RECORD_AUDIO; + + const [cameraPermissionStatus, microphonePermissionStatus] = + await Promise.all([check(cameraPermission), check(microphonePermission)]); + + if (microphonePermissionStatus !== 'granted') { + await request(microphonePermission); + } + + if (cameraPermissionStatus !== 'granted') { + await request(cameraPermission); + } +} diff --git a/client/mobile/src/lib/socket/index.ts b/client/mobile/src/lib/socket/index.ts new file mode 100644 index 00000000000..7a3de81b556 --- /dev/null +++ b/client/mobile/src/lib/socket/index.ts @@ -0,0 +1,47 @@ +import { io, Socket } from 'socket.io-client'; +import msgpackParser from 'socket.io-msgpack-parser'; +import _isNil from 'lodash/isNil'; +import type { InboxItem } from '../../types'; +import { showNotification } from '../notifications'; + +let _socket: Socket; +/** + * 创建Socket连接 + * 如果已经有Socket连接则关闭上一个 + * @param token Token + */ +export function createSocket(url: string, token: string): Promise { + if (!_isNil(_socket)) { + _socket.close(); + } + + return new Promise((resolve, reject) => { + _socket = io(url, { + transports: ['websocket'], + auth: { + token, + }, + forceNew: true, + parser: msgpackParser, + }); + _socket.once('connect', () => { + // 连接成功 + resolve(_socket); + }); + _socket.once('error', () => { + reject(); + }); + }); +} + +export function bindSocketEvent(socket: Socket): void { + socket.on('notify:chat.inbox.append', (inboxItem: InboxItem) => { + if (inboxItem.type === 'message') { + const payload = inboxItem.message ?? inboxItem.payload; + showNotification({ + title: payload.converseId ?? '', + body: payload.messageSnippet ?? '', + }); + } + }); +} diff --git a/client/mobile/src/lib/utils/index.ts b/client/mobile/src/lib/utils/index.ts new file mode 100644 index 00000000000..a959b3c36f1 --- /dev/null +++ b/client/mobile/src/lib/utils/index.ts @@ -0,0 +1,39 @@ +import urlRegex from 'url-regex'; +import _flatten from 'lodash/flatten'; + +/** + * 判断是否是一个可用的url + */ +export function isValidUrl(str: unknown): str is string { + return typeof str === 'string' && urlRegex({ exact: true }).test(str); +} + +export function normalize(path: string) { + const components: string[] = []; + for (const component of `${path}`.split(/\/+/g)) { + if (component === '.') { + } else if (component === '..') { + components.pop(); + } else { + components.push(component); + } + } + let normalized = ( + (path.startsWith('/') ? '/' : '') + components.join('/') + ).replace(/\/\/+/g, '/'); + return normalized || '.'; +} + +export function urlResolve(...str: string[]) { + const flatten = _flatten(str).reduce((previous, current) => { + if (/^\//.test(current)) { + return current; + } + return `${previous}/${current}`; + }); + return normalize(flatten); +} + +export function isDev(): boolean { + return !!__DEV__; +} diff --git a/client/mobile/src/lib/utils/storage.ts b/client/mobile/src/lib/utils/storage.ts new file mode 100644 index 00000000000..30189f636e1 --- /dev/null +++ b/client/mobile/src/lib/utils/storage.ts @@ -0,0 +1,19 @@ +import type { PersistStorage } from 'zustand/middleware/persist'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +export const zustandRNStorage: PersistStorage = { + async getItem(name) { + const d = await AsyncStorage.getItem(name); + if (!d) { + return null; + } + + return JSON.parse(d); + }, + setItem(name, value) { + return AsyncStorage.setItem(name, JSON.stringify(value)); + }, + removeItem: (name) => { + AsyncStorage.removeItem(name); + }, +}; diff --git a/client/mobile/src/store/server.ts b/client/mobile/src/store/server.ts new file mode 100644 index 00000000000..48cec87fc82 --- /dev/null +++ b/client/mobile/src/store/server.ts @@ -0,0 +1,78 @@ +import { create } from 'zustand'; +import { immer } from 'zustand/middleware/immer'; +import { persist } from 'zustand/middleware'; +import { urlResolve } from '../lib/utils'; +import { zustandRNStorage } from '../lib/utils/storage'; + +interface ServerInfo { + name?: string; + version?: string; + url: string; +} + +interface ServerStoreState { + selectedServerInfo: ServerInfo | null; + serverList: ServerInfo[]; + addServer: (url: string) => Promise; + removeServer: (url: string) => void; + selectServer: (serverInfo: ServerInfo) => void; +} + +const defaultServerList: ServerInfo[] = [ + { + name: 'Tailchat', + url: 'https://nightly.paw.msgbyte.com/', + version: 'nightly', + }, +]; + +export const useServerStore = create()( + persist( + immer((set) => ({ + serverList: defaultServerList, + selectedServerInfo: null, + addServer: async (url: string) => { + try { + // 获取 Tailchat 客户端配置 + const res = await fetch(urlResolve(url, './tailchat.manifest')); + const clientConfig = await res.json(); + const { version, serviceUrl } = clientConfig; + console.log('获取Tailchat客户端配置成功', clientConfig); + + // 获取 Tailchat 服务端配置 + const res2 = await fetch( + urlResolve(serviceUrl ?? url, './api/config/client') + ); + const serviceConfig = (await res2.json()).data; + console.log('获取Tailchat服务端配置成功', serviceConfig); + + set((state) => { + state.serverList.push({ + name: serviceConfig.serverName ?? 'Tailchat', + url, + version, + }); + }); + } catch (err) { + console.error('获取服务器配置失败:', err); + throw err; + } + }, + removeServer: (url: string) => { + set((state) => { + state.serverList = state.serverList.filter((s) => s.url !== url); + }); + }, + selectServer: (serverInfo: ServerInfo) => { + set({ + selectedServerInfo: serverInfo, + }); + }, + })), + { + name: 'server', + storage: zustandRNStorage, + partialize: (state) => ({ serverList: state.serverList }), + } + ) +); diff --git a/client/mobile/src/store/ui.ts b/client/mobile/src/store/ui.ts new file mode 100644 index 00000000000..cf1b520289c --- /dev/null +++ b/client/mobile/src/store/ui.ts @@ -0,0 +1,37 @@ +import { create } from 'zustand'; +import { immer } from 'zustand/middleware/immer'; +import { persist } from 'zustand/middleware'; +import { zustandRNStorage } from '../lib/utils/storage'; + +interface UIStoreState { + colorScheme: 'dark' | 'light' | 'auto'; + setColorScheme: (colorScheme: 'dark' | 'light' | 'auto' | string) => void; +} + +export const useUIStore = create()( + persist( + immer((set) => ({ + colorScheme: 'dark', + setColorScheme: (colorScheme) => { + if (colorScheme === 'dark') { + set({ + colorScheme: 'dark', + }); + } else if (colorScheme === 'light') { + set({ + colorScheme: 'light', + }); + } else { + set({ + colorScheme: 'auto', + }); + } + }, + })), + { + name: 'ui', + storage: zustandRNStorage, + partialize: (state) => ({ colorScheme: state.colorScheme }), + } + ) +); diff --git a/client/mobile/src/theme.ts b/client/mobile/src/theme.ts new file mode 100644 index 00000000000..c174613b270 --- /dev/null +++ b/client/mobile/src/theme.ts @@ -0,0 +1,6 @@ +export const theme = { + contentBg: { + light: 'rgba(243, 244, 246, 1)', + dark: 'rgba(55, 65, 81, 1)', + }, +}; diff --git a/client/mobile/src/types.ts b/client/mobile/src/types.ts new file mode 100644 index 00000000000..9a6a67c219d --- /dev/null +++ b/client/mobile/src/types.ts @@ -0,0 +1 @@ +export * from '../../../packages/types'; diff --git a/client/mobile/tsconfig.json b/client/mobile/tsconfig.json new file mode 100644 index 00000000000..ba9f3e3e2ee --- /dev/null +++ b/client/mobile/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "@tsconfig/react-native/tsconfig.json", + "compilerOptions": { + "importsNotUsedAsValues": "error" + } +} diff --git a/client/mobile/yarn.lock b/client/mobile/yarn.lock new file mode 100644 index 00000000000..713c8381b75 --- /dev/null +++ b/client/mobile/yarn.lock @@ -0,0 +1,8784 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.20.14" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" + integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.20.0": + version "7.20.12" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/eslint-parser@^7.18.2": + version "7.19.1" + resolved "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" + integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.20.0", "@babel/generator@^7.20.7", "@babel/generator@^7.7.2": + version "7.20.14" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.12", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.12" + resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" + integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@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" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@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.20.10" + "@babel/types" "^7.20.7" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.20.7": + version "7.20.13" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": + version "7.20.15" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" + integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + +"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.18.10" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz#091f4794dbce4027c03cf4ebc64d3fb96b75c206" + integrity sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-default-from" "^7.18.6" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + dependencies: + "@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/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz#8df076711a4818c4ce4f23e61d622b0ba2ff84bc" + integrity sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.15" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz#3e1b2aa9cbbe1eb8d644c823141a9c5c2a22392d" + integrity sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.20.2": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.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.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.18.6": + version "7.19.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-flow" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.20.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" + integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-assign@^7.16.7": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.18.6.tgz#7830b4b6f83e1374a5afb9f6111bcfaea872cdd2" + integrity sha512-mQisZ3JfqWh2gVXvfqYCAAyRs6+7oev+myBsTwW5RnPhYXOTuCEw2oe3YgxlXMViXUS53lG8koulI7mJ+8JE+A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" + integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.19.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" + integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.20.13" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz#f950f0b0c36377503d29a712f16287cedf886cbb" + integrity sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.20.7" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.19.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.19.0": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.18.6", "@babel/plugin-transform-typescript@^7.5.0": + version "7.20.13" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz#e3581b356b8694f6ff450211fe6774eaff8d25ab" + integrity sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.12" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.20.0": + version "7.20.2" + resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-flow@^7.13.13": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/preset-flow/-/preset-flow-7.18.6.tgz#83f7602ba566e72a9918beefafef8ef16d2810cb" + integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-flow-strip-types" "^7.18.6" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7": + version "7.18.6" + resolved "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/register@^7.13.16": + version "7.18.9" + resolved "https://registry.npmmirror.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c" + integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.0", "@babel/runtime@^7.8.4": + version "7.20.13" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2", "@babel/traverse@^7.7.4": + version "7.20.13" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.20.7" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@egjs/hammerjs@^2.0.17": + version "2.0.17" + resolved "https://registry.npmmirror.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124" + integrity sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A== + dependencies: + "@types/hammerjs" "^2.0.36" + +"@eslint/eslintrc@^1.4.1": + version "1.4.1" + resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@formatjs/ecma402-abstract@1.14.3": + version "1.14.3" + resolved "https://registry.npmmirror.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz#6428f243538a11126180d121ce8d4b2f17465738" + integrity sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg== + dependencies: + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" + +"@formatjs/fast-memoize@2.0.1": + version "2.0.1" + resolved "https://registry.npmmirror.com/@formatjs/fast-memoize/-/fast-memoize-2.0.1.tgz#f15aaa73caad5562899c69bdcad8db82adcd3b0b" + integrity sha512-M2GgV+qJn5WJQAYewz7q2Cdl6fobQa69S1AzSM2y0P68ZDbK5cWrJIcPCO395Of1ksftGZoOt4LYCO/j9BKBSA== + dependencies: + tslib "^2.4.0" + +"@formatjs/icu-messageformat-parser@2.3.0": + version "2.3.0" + resolved "https://registry.npmmirror.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.3.0.tgz#8e8fd577c3e39454ef14bba4963f2e1d5f2cc46c" + integrity sha512-xqtlqYAbfJDF4b6e4O828LBNOWXrFcuYadqAbYORlDRwhyJ2bH+xpUBPldZbzRGUN2mxlZ4Ykhm7jvERtmI8NQ== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/icu-skeleton-parser" "1.3.18" + tslib "^2.4.0" + +"@formatjs/icu-skeleton-parser@1.3.18": + version "1.3.18" + resolved "https://registry.npmmirror.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz#7aed3d60e718c8ad6b0e64820be44daa1e29eeeb" + integrity sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + tslib "^2.4.0" + +"@formatjs/intl-displaynames@6.2.6": + version "6.2.6" + resolved "https://registry.npmmirror.com/@formatjs/intl-displaynames/-/intl-displaynames-6.2.6.tgz#6bc02fe0bf6571391aac0e01e74ecbf38542ff32" + integrity sha512-scf5AQTk9EjpvPhboo5sizVOvidTdMOnajv9z+0cejvl7JNl9bl/aMrNBgC72UH+bP3l45usPUKAGskV6sNIrA== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" + +"@formatjs/intl-listformat@7.1.9": + version "7.1.9" + resolved "https://registry.npmmirror.com/@formatjs/intl-listformat/-/intl-listformat-7.1.9.tgz#0c2ce67b610054f215dd2635a6da7da308cfbe3d" + integrity sha512-5YikxwRqRXTVWVujhswDOTCq6gs+m9IcNbNZLa6FLtyBStAjEsuE2vAU+lPsbz9ZTST57D5fodjIh2JXT6sMWQ== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" + +"@formatjs/intl-localematcher@0.2.32": + version "0.2.32" + resolved "https://registry.npmmirror.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz#00d4d307cd7d514b298e15a11a369b86c8933ec1" + integrity sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ== + dependencies: + tslib "^2.4.0" + +"@formatjs/intl@^2.6.9": + version "2.6.9" + resolved "https://registry.npmmirror.com/@formatjs/intl/-/intl-2.6.9.tgz#d4bdd8c21888f579a95341580141d0aafe761610" + integrity sha512-EtcMZ9O24YSASu/jGOaTQtArx7XROjlKiO4KmkxJ/3EyAQLCr5hrS+KKvNud0a7GIwBucOb3IFrZ7WiSm2A/Cw== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/fast-memoize" "2.0.1" + "@formatjs/icu-messageformat-parser" "2.3.0" + "@formatjs/intl-displaynames" "6.2.6" + "@formatjs/intl-listformat" "7.1.9" + intl-messageformat "10.3.3" + tslib "^2.4.0" + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/console/-/console-29.4.2.tgz#f78374905c2454764152904a344a2d5226b0ef09" + integrity sha512-0I/rEJwMpV9iwi9cDEnT71a5nNGK9lj8Z4+1pRAU2x/thVXCDnaTGrvxyK+cAqZTFVFCiR+hfVrP4l2m+dCmQg== + dependencies: + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.4.2" + jest-util "^29.4.2" + slash "^3.0.0" + +"@jest/core@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/core/-/core-29.4.2.tgz#6e999b67bdc2df9d96ba9b142465bda71ee472c2" + integrity sha512-KGuoQah0P3vGNlaS/l9/wQENZGNKGoWb+OPxh3gz+YzG7/XExvYu34MzikRndQCdM2S0tzExN4+FL37i6gZmCQ== + dependencies: + "@jest/console" "^29.4.2" + "@jest/reporters" "^29.4.2" + "@jest/test-result" "^29.4.2" + "@jest/transform" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.4.2" + jest-config "^29.4.2" + jest-haste-map "^29.4.2" + jest-message-util "^29.4.2" + jest-regex-util "^29.4.2" + jest-resolve "^29.4.2" + jest-resolve-dependencies "^29.4.2" + jest-runner "^29.4.2" + jest-runtime "^29.4.2" + jest-snapshot "^29.4.2" + jest-util "^29.4.2" + jest-validate "^29.4.2" + jest-watcher "^29.4.2" + micromatch "^4.0.4" + pretty-format "^29.4.2" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^29.2.1": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/create-cache-key-function/-/create-cache-key-function-29.4.2.tgz#cc8e966c28fd3bed309b0487de2e0bd12cbf519f" + integrity sha512-o2weIg3h8/7+jXF6EjcOiz9TAlNMtcmeH5IARTVgHs3IoQGbh5E/ZLLskfEsHVIYoCKgx+v093Vf8hOgMWggvg== + dependencies: + "@jest/types" "^29.4.2" + +"@jest/environment@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/environment/-/environment-29.4.2.tgz#ee92c316ee2fbdf0bcd9d2db0ef42d64fea26b56" + integrity sha512-JKs3VUtse0vQfCaFGJRX1bir9yBdtasxziSyu+pIiEllAQOe4oQhdCYIf3+Lx+nGglFktSKToBnRJfD5QKp+NQ== + dependencies: + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + jest-mock "^29.4.2" + +"@jest/expect-utils@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.4.2.tgz#cd0065dfdd8e8a182aa350cc121db97b5eed7b3f" + integrity sha512-Dd3ilDJpBnqa0GiPN7QrudVs0cczMMHtehSo2CSTjm3zdHx0RcpmhFNVEltuEFeqfLIyWKFI224FsMSQ/nsJQA== + dependencies: + jest-get-type "^29.4.2" + +"@jest/expect@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/expect/-/expect-29.4.2.tgz#2d4a6a41b29380957c5094de19259f87f194578b" + integrity sha512-NUAeZVApzyaeLjfWIV/64zXjA2SS+NuUPHpAlO7IwVMGd5Vf9szTl9KEDlxY3B4liwLO31os88tYNHl6cpjtKQ== + dependencies: + expect "^29.4.2" + jest-snapshot "^29.4.2" + +"@jest/fake-timers@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.4.2.tgz#af43ee1a5720b987d0348f80df98f2cb17d45cd0" + integrity sha512-Ny1u0Wg6kCsHFWq7A/rW/tMhIedq2siiyHyLpHCmIhP7WmcAmd2cx95P+0xtTZlj5ZbJxIRQi4OPydZZUoiSQQ== + dependencies: + "@jest/types" "^29.4.2" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.4.2" + jest-mock "^29.4.2" + jest-util "^29.4.2" + +"@jest/globals@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/globals/-/globals-29.4.2.tgz#73f85f5db0e17642258b25fd0b9fc89ddedb50eb" + integrity sha512-zCk70YGPzKnz/I9BNFDPlK+EuJLk21ur/NozVh6JVM86/YYZtZHqxFFQ62O9MWq7uf3vIZnvNA0BzzrtxD9iyg== + dependencies: + "@jest/environment" "^29.4.2" + "@jest/expect" "^29.4.2" + "@jest/types" "^29.4.2" + jest-mock "^29.4.2" + +"@jest/reporters@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/reporters/-/reporters-29.4.2.tgz#6abfa923941daae0acc76a18830ee9e79a22042d" + integrity sha512-10yw6YQe75zCgYcXgEND9kw3UZZH5tJeLzWv4vTk/2mrS1aY50A37F+XT2hPO5OqQFFnUWizXD8k1BMiATNfUw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.4.2" + "@jest/test-result" "^29.4.2" + "@jest/transform" "^29.4.2" + "@jest/types" "^29.4.2" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.4.2" + jest-util "^29.4.2" + jest-worker "^29.4.2" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.4.2.tgz#cf7cfe97c5649f518452b176c47ed07486270fc1" + integrity sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/source-map/-/source-map-29.4.2.tgz#f9815d59e25cd3d6828e41489cd239271018d153" + integrity sha512-tIoqV5ZNgYI9XCKXMqbYe5JbumcvyTgNN+V5QW4My033lanijvCD0D4PI9tBw4pRTqWOc00/7X3KVvUh+qnF4Q== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/test-result/-/test-result-29.4.2.tgz#34b0ba069f2e3072261e4884c8fb6bd15ed6fb8d" + integrity sha512-HZsC3shhiHVvMtP+i55MGR5bPcc3obCFbA5bzIOb8pCjwBZf11cZliJncCgaVUbC5yoQNuGqCkC0Q3t6EItxZA== + dependencies: + "@jest/console" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.4.2.tgz#8b48e5bc4af80b42edacaf2a733d4f295edf28fb" + integrity sha512-9Z2cVsD6CcObIVrWigHp2McRJhvCxL27xHtrZFgNC1RwnoSpDx6fZo8QYjJmziFlW9/hr78/3sxF54S8B6v8rg== + dependencies: + "@jest/test-result" "^29.4.2" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" + slash "^3.0.0" + +"@jest/transform@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/transform/-/transform-29.4.2.tgz#b24b72dbab4c8675433a80e222d6a8ef4656fb81" + integrity sha512-kf1v5iTJHn7p9RbOsBuc/lcwyPtJaZJt5885C98omWz79NIeD3PfoiiaPSu7JyCyFzNOIzKhmMhQLUhlTL9BvQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.4.2" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" + jest-regex-util "^29.4.2" + jest-util "^29.4.2" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.npmmirror.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.npmmirror.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^29.4.2": + version "29.4.2" + resolved "https://registry.npmmirror.com/@jest/types/-/types-29.4.2.tgz#8f724a414b1246b2bfd56ca5225d9e1f39540d82" + integrity sha512-CKlngyGP0fwlgC1BRUtPZSiWLBhyS9dKwKmyGxk8Z6M82LBEGB2aLQSg+U1MyLsU+M7UjnlLllBM2BLWKVm/Uw== + dependencies: + "@jest/schemas" "^29.4.2" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.npmmirror.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@notifee/react-native@^7.6.1": + version "7.6.1" + resolved "https://registry.npmmirror.com/@notifee/react-native/-/react-native-7.6.1.tgz#e215428787396ec57ea424106cc88666f7efe70d" + integrity sha512-OjhLPODh6FICYZmF9/0UZbcl2JPaPpcrWi1Cvs/OLFbPSJTIEwPZgXFrCHv/cA3wUX4YQCXreSqQGSVQgvNItQ== + +"@react-native-async-storage/async-storage@^1.17.11": + version "1.17.11" + resolved "https://registry.npmmirror.com/@react-native-async-storage/async-storage/-/async-storage-1.17.11.tgz#7ec329c1b9f610e344602e806b04d7c928a2341d" + integrity sha512-bzs45n5HNcDq6mxXnSsOHysZWn1SbbebNxldBXCQs8dSvF8Aor9KCdpm+TpnnGweK3R6diqsT8lFhX77VX0NFw== + dependencies: + merge-options "^3.0.4" + +"@react-native-community/cli-clean@^10.1.1": + version "10.1.1" + resolved "https://registry.npmmirror.com/@react-native-community/cli-clean/-/cli-clean-10.1.1.tgz#4c73ce93a63a24d70c0089d4025daac8184ff504" + integrity sha512-iNsrjzjIRv9yb5y309SWJ8NDHdwYtnCpmxZouQDyOljUdC9MwdZ4ChbtA4rwQyAwgOVfS9F/j56ML3Cslmvrxg== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + prompts "^2.4.0" + +"@react-native-community/cli-config@^10.1.1": + version "10.1.1" + resolved "https://registry.npmmirror.com/@react-native-community/cli-config/-/cli-config-10.1.1.tgz#08dcc5d7ca1915647dc06507ed853fe0c1488395" + integrity sha512-p4mHrjC+s/ayiNVG6T35GdEGdP6TuyBUg5plVGRJfTl8WT6LBfLYLk+fz/iETrEZ/YkhQIsQcEUQC47MqLNHog== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + glob "^7.1.3" + joi "^17.2.1" + +"@react-native-community/cli-debugger-ui@^10.0.0": + version "10.0.0" + resolved "https://registry.npmmirror.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-10.0.0.tgz#4bb6d41c7e46449714dc7ba5d9f5b41ef0ea7c57" + integrity sha512-8UKLcvpSNxnUTRy8CkCl27GGLqZunQ9ncGYhSrWyKrU9SWBJJGeZwi2k2KaoJi5FvF2+cD0t8z8cU6lsq2ZZmA== + dependencies: + serve-static "^1.13.1" + +"@react-native-community/cli-doctor@^10.1.1": + version "10.1.1" + resolved "https://registry.npmmirror.com/@react-native-community/cli-doctor/-/cli-doctor-10.1.1.tgz#6d60a2df74ea112d1f3b41491b6ee0948daa4fb3" + integrity sha512-9uvUhr6aJu4C7pCTsD9iRS/38tx1mzIrWuEQoh2JffTXg9MOq4jesvobkyKFRD90nOvqunEvfpnWnRdWcZO0Wg== + dependencies: + "@react-native-community/cli-config" "^10.1.1" + "@react-native-community/cli-platform-ios" "^10.1.1" + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + command-exists "^1.2.8" + envinfo "^7.7.2" + execa "^1.0.0" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + node-stream-zip "^1.9.1" + ora "^5.4.1" + prompts "^2.4.0" + semver "^6.3.0" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + +"@react-native-community/cli-hermes@^10.1.3": + version "10.1.3" + resolved "https://registry.npmmirror.com/@react-native-community/cli-hermes/-/cli-hermes-10.1.3.tgz#440e2ff0f2ac9aba0ca1daee6ffaaf9c093437cc" + integrity sha512-uYl8MLBtuu6bj0tDUzVGf30nK5i9haBv7F0u+NCOq31+zVjcwiUplrCuLorb2dMLMF+Fno9wDxi66W9MxoW4nA== + dependencies: + "@react-native-community/cli-platform-android" "^10.1.3" + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@10.1.3", "@react-native-community/cli-platform-android@^10.1.3": + version "10.1.3" + resolved "https://registry.npmmirror.com/@react-native-community/cli-platform-android/-/cli-platform-android-10.1.3.tgz#8380799cd4d3f9a0ca568b0f5b4ae9e462ce3669" + integrity sha512-8YZEpBL6yd9l4CIoFcLOgrV8x2GDujdqrdWrNsNERDAbsiFwqAQvfjyyb57GAZVuEPEJCoqUlGlMCwOh3XQb9A== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + glob "^7.1.3" + logkitty "^0.7.1" + +"@react-native-community/cli-platform-ios@10.1.1", "@react-native-community/cli-platform-ios@^10.1.1": + version "10.1.1" + resolved "https://registry.npmmirror.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.1.1.tgz#39ed6810117d8e7330d3aa4d85818fb6ae358785" + integrity sha512-EB9/L8j1LqrqyfJtLRixU+d8FIP6Pr83rEgUgXgya/u8wk3h/bvX70w+Ff2skwjdPLr5dLUQ/n5KFX4r3bsNmA== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + glob "^7.1.3" + ora "^5.4.1" + +"@react-native-community/cli-plugin-metro@^10.1.1": + version "10.1.1" + resolved "https://registry.npmmirror.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.1.1.tgz#8b8689c921f6f0aeafa7ea9aabbde4c482b376b7" + integrity sha512-wEp47le4mzlelDF5sfkaaujUDYcuLep5HZqlcMx7PkL7BA3/fSHdDo1SblqaLgZ1ca6vFU+kfbHueLDct+xwFg== + dependencies: + "@react-native-community/cli-server-api" "^10.1.1" + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + metro "0.73.7" + metro-config "0.73.7" + metro-core "0.73.7" + metro-react-native-babel-transformer "0.73.7" + metro-resolver "0.73.7" + metro-runtime "0.73.7" + readline "^1.3.0" + +"@react-native-community/cli-server-api@^10.1.1": + version "10.1.1" + resolved "https://registry.npmmirror.com/@react-native-community/cli-server-api/-/cli-server-api-10.1.1.tgz#e382269de281bb380c2e685431364fbbb8c1cb3a" + integrity sha512-NZDo/wh4zlm8as31UEBno2bui8+ufzsZV+KN7QjEJWEM0levzBtxaD+4je0OpfhRIIkhaRm2gl/vVf7OYAzg4g== + dependencies: + "@react-native-community/cli-debugger-ui" "^10.0.0" + "@react-native-community/cli-tools" "^10.1.1" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.0" + nocache "^3.0.1" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^7.5.1" + +"@react-native-community/cli-tools@^10.1.1": + version "10.1.1" + resolved "https://registry.npmmirror.com/@react-native-community/cli-tools/-/cli-tools-10.1.1.tgz#fa66e509c0d3faa31f7bb87ed7d42ad63f368ddd" + integrity sha512-+FlwOnZBV+ailEzXjcD8afY2ogFEBeHOw/8+XXzMgPaquU2Zly9B+8W089tnnohO3yfiQiZqkQlElP423MY74g== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + find-up "^5.0.0" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + ora "^5.4.1" + semver "^6.3.0" + shell-quote "^1.7.3" + +"@react-native-community/cli-types@^10.0.0": + version "10.0.0" + resolved "https://registry.npmmirror.com/@react-native-community/cli-types/-/cli-types-10.0.0.tgz#046470c75ec18f8b3bd906e54e43a6f678e01a45" + integrity sha512-31oUM6/rFBZQfSmDQsT1DX/5fjqfxg7sf2u8kTPJK7rXVya5SRpAMaCXsPAG0omsmJxXt+J9HxUi3Ic+5Ux5Iw== + dependencies: + joi "^17.2.1" + +"@react-native-community/cli@10.1.3": + version "10.1.3" + resolved "https://registry.npmmirror.com/@react-native-community/cli/-/cli-10.1.3.tgz#ad610c46da9fc7c717272024ec757dc646726506" + integrity sha512-kzh6bYLGN1q1q0IiczKSP1LTrovFeVzppYRTKohPI9VdyZwp7b5JOgaQMB/Ijtwm3MxBDrZgV9AveH/eUmUcKQ== + dependencies: + "@react-native-community/cli-clean" "^10.1.1" + "@react-native-community/cli-config" "^10.1.1" + "@react-native-community/cli-debugger-ui" "^10.0.0" + "@react-native-community/cli-doctor" "^10.1.1" + "@react-native-community/cli-hermes" "^10.1.3" + "@react-native-community/cli-plugin-metro" "^10.1.1" + "@react-native-community/cli-server-api" "^10.1.1" + "@react-native-community/cli-tools" "^10.1.1" + "@react-native-community/cli-types" "^10.0.0" + chalk "^4.1.2" + commander "^9.4.1" + execa "^1.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + graceful-fs "^4.1.3" + prompts "^2.4.0" + semver "^6.3.0" + +"@react-native-community/clipboard@^1.5.1": + version "1.5.1" + resolved "https://registry.npmmirror.com/@react-native-community/clipboard/-/clipboard-1.5.1.tgz#32abb3ea2eb91ee3f9c5fb1d32d5783253c9fabe" + integrity sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA== + +"@react-native-community/eslint-config@^3.2.0": + version "3.2.0" + resolved "https://registry.npmmirror.com/@react-native-community/eslint-config/-/eslint-config-3.2.0.tgz#42f677d5fff385bccf1be1d3b8faa8c086cf998d" + integrity sha512-ZjGvoeiBtCbd506hQqwjKmkWPgynGUoJspG8/MuV/EfKnkjCtBmeJvq2n+sWbWEvL9LWXDp2GJmPzmvU5RSvKQ== + dependencies: + "@babel/core" "^7.14.0" + "@babel/eslint-parser" "^7.18.2" + "@react-native-community/eslint-plugin" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.30.5" + "@typescript-eslint/parser" "^5.30.5" + eslint-config-prettier "^8.5.0" + eslint-plugin-eslint-comments "^3.2.0" + eslint-plugin-ft-flow "^2.0.1" + eslint-plugin-jest "^26.5.3" + eslint-plugin-prettier "^4.2.1" + eslint-plugin-react "^7.30.1" + eslint-plugin-react-hooks "^4.6.0" + eslint-plugin-react-native "^4.0.0" + +"@react-native-community/eslint-plugin@^1.1.0": + version "1.3.0" + resolved "https://registry.npmmirror.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz#9e558170c106bbafaa1ef502bd8e6d4651012bf9" + integrity sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg== + +"@react-native/assets@1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" + integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== + +"@react-native/normalize-color@*", "@react-native/normalize-color@2.1.0": + version "2.1.0" + resolved "https://registry.npmmirror.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91" + integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== + +"@react-native/polyfills@2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" + integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== + +"@rollup/plugin-commonjs@^19.0.0": + version "19.0.2" + resolved "https://registry.npmmirror.com/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.2.tgz#1ccc3d63878d1bc9846f8969f09dd3b3e4ecc244" + integrity sha512-gBjarfqlC7qs0AutpRW/hrFNm+cd2/QKxhwyFa+srbg1oX7rDsEU3l+W7LAUhsAp9mPJMAkXDhLbQaVwEaE8bA== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-json@^4.1.0": + version "4.1.0" + resolved "https://registry.npmmirror.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@^13.0.0": + version "13.3.0" + resolved "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" + integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + deepmerge "^4.2.2" + is-builtin-module "^3.1.0" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-url@^6.0.0": + version "6.1.0" + resolved "https://registry.npmmirror.com/@rollup/plugin-url/-/plugin-url-6.1.0.tgz#1234bba9aa30b5972050bdfcf8fcbb1cb8070465" + integrity sha512-FJNWBnBB7nLzbcaGmu1no+U/LlRR67TtgfRFP+VEKSrWlDTE6n9jMns/N4Q/VL6l4x6kTHQX4HQfwTcldaAfHQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + make-dir "^3.1.0" + mime "^2.4.6" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^4.1.0", "@rollup/pluginutils@^4.1.1": + version "4.2.1" + resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.1" + resolved "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== + +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@tsconfig/react-native@^2.0.2": + version "2.0.3" + resolved "https://registry.npmmirror.com/@tsconfig/react-native/-/react-native-2.0.3.tgz#79ad8efc6d3729152da6cb23725b6c364a7349b2" + integrity sha512-jE58snEKBd9DXfyR4+ssZmYJ/W2mOSnNrvljR0aLyQJL9JKX6vlWELHkRjb3HBbcM9Uy0hZGijXbqEAjOERW2A== + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/cssnano@^4.0.0": + version "4.0.1" + resolved "https://registry.npmmirror.com/@types/cssnano/-/cssnano-4.0.1.tgz#67fa912753d80973a016e7684a47fedf338aacff" + integrity sha512-hGOroxRTBkYl5gSBRJOffhV4+io+Y2bFX1VP7LgKEVHJt/LPPJaWUIuDAz74Vlp7l7hCDZfaDi7iPxwNwuVA4Q== + dependencies: + postcss "5 - 7" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/fs-extra@^11.0.1": + version "11.0.1" + resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" + integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== + dependencies: + "@types/jsonfile" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/hammerjs@^2.0.36": + version "2.0.41" + resolved "https://registry.npmmirror.com/@types/hammerjs/-/hammerjs-2.0.41.tgz#f6ecf57d1b12d2befcce00e928a6a097c22980aa" + integrity sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.2.1": + version "29.4.0" + resolved "https://registry.npmmirror.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/jsonfile@*": + version "6.1.1" + resolved "https://registry.npmmirror.com/@types/jsonfile/-/jsonfile-6.1.1.tgz#ac84e9aefa74a2425a0fb3012bdea44f58970f1b" + integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.191": + version "4.14.191" + resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== + +"@types/node@*": + version "18.13.0" + resolved "https://registry.npmmirror.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" + integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.npmmirror.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.npmmirror.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/react-test-renderer@^18.0.0": + version "18.0.0" + resolved "https://registry.npmmirror.com/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz#7b7f69ca98821ea5501b21ba24ea7b6139da2243" + integrity sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.24": + version "18.0.27" + resolved "https://registry.npmmirror.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" + integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^15.0.0": + version "15.0.15" + resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.22" + resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.30.5": + version "5.51.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz#da3f2819633061ced84bb82c53bba45a6fe9963a" + integrity sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ== + dependencies: + "@typescript-eslint/scope-manager" "5.51.0" + "@typescript-eslint/type-utils" "5.51.0" + "@typescript-eslint/utils" "5.51.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.30.5": + version "5.51.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.51.0.tgz#2d74626652096d966ef107f44b9479f02f51f271" + integrity sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA== + dependencies: + "@typescript-eslint/scope-manager" "5.51.0" + "@typescript-eslint/types" "5.51.0" + "@typescript-eslint/typescript-estree" "5.51.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.51.0": + version "5.51.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz#ad3e3c2ecf762d9a4196c0fbfe19b142ac498990" + integrity sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ== + dependencies: + "@typescript-eslint/types" "5.51.0" + "@typescript-eslint/visitor-keys" "5.51.0" + +"@typescript-eslint/type-utils@5.51.0": + version "5.51.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz#7af48005531700b62a20963501d47dfb27095988" + integrity sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ== + dependencies: + "@typescript-eslint/typescript-estree" "5.51.0" + "@typescript-eslint/utils" "5.51.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.51.0": + version "5.51.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.51.0.tgz#e7c1622f46c7eea7e12bbf1edfb496d4dec37c90" + integrity sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw== + +"@typescript-eslint/typescript-estree@5.51.0": + version "5.51.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz#0ec8170d7247a892c2b21845b06c11eb0718f8de" + integrity sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA== + dependencies: + "@typescript-eslint/types" "5.51.0" + "@typescript-eslint/visitor-keys" "5.51.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.51.0", "@typescript-eslint/utils@^5.10.0": + version "5.51.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.51.0.tgz#074f4fabd5b12afe9c8aa6fdee881c050f8b4d47" + integrity sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.51.0" + "@typescript-eslint/types" "5.51.0" + "@typescript-eslint/typescript-estree" "5.51.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.51.0": + version "5.51.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz#c0147dd9a36c0de758aaebd5b48cae1ec59eba87" + integrity sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ== + dependencies: + "@typescript-eslint/types" "5.51.0" + eslint-visitor-keys "^3.3.0" + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abs-svg-path@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" + integrity sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA== + +absolute-path@^0.0.0: + version "0.0.0" + resolved "https://registry.npmmirror.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" + integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== + +accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.8" + resolved "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.5.0, acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ== + +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.npmmirror.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-fragments@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" + integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== + dependencies: + colorette "^1.0.7" + slice-ansi "^2.0.0" + strip-ansi "^5.0.0" + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +appdirsjs@^1.2.4: + version "1.2.7" + resolved "https://registry.npmmirror.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3" + integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-back@^1.0.3, array-back@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" + integrity sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw== + dependencies: + typical "^2.6.0" + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +ast-types@0.14.2: + version "0.14.2" + resolved "https://registry.npmmirror.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^3.2.2: + version "3.2.4" + resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@^1.3.2: + version "1.3.2" + resolved "https://registry.npmmirror.com/axios/-/axios-1.3.2.tgz#7ac517f0fa3ec46e0e636223fd973713a09c72b3" + integrity sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.npmmirror.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-jest@^29.2.1, babel-jest@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.4.2.tgz#b17b9f64be288040877cbe2649f91ac3b63b2ba6" + integrity sha512-vcghSqhtowXPG84posYkkkzcZsdayFkubUgbE3/1tuGbX7AQtwCkkNA/wIbB0BMjuCPoqTkiDyKN7Ty7d3uwNQ== + dependencies: + "@jest/transform" "^29.4.2" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.4.2" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.2.tgz#22aa43e255230f02371ffef1cac7eedef58f60bc" + integrity sha512-5HZRCfMeWypFEonRbEkwWXtNS1sQK159LhRVyRuLzyfVBxDy/34Tr/rg4YVi0SScSJ4fqeaR/OIeceJ/LaQ0pQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.npmmirror.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-plugin-transform-inline-environment-variables@^0.0.2: + version "0.0.2" + resolved "https://registry.npmmirror.com/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.0.2.tgz#1372475c6c87f3c4ce6046587730ee041bc784b9" + integrity sha512-8gobU7uuTIjz62aXTEZOH5yhuIPojNVAgLK0xnepdGS19aqOEphy7FVWBsojPa14yrQGM/w63uDox4thYcHCnA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.npmmirror.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +babel-preset-jest@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.4.2.tgz#f0b20c6a79a9f155515e72a2d4f537fe002a4e38" + integrity sha512-ecWdaLY/8JyfUDr0oELBMpj3R5I1L6ZqG+kRJmwqfHtLWuPrJStR0LUkvUhfykJWTsXXMnohsayN/twltBbDrQ== + dependencies: + babel-plugin-jest-hoist "^29.4.2" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.1.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npmmirror.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +bower-auto-release@^1.1.358: + version "1.1.358" + resolved "https://registry.npmmirror.com/bower-auto-release/-/bower-auto-release-1.1.358.tgz#578f8ce3dc2f62f0b54380814266ff8717775bc1" + integrity sha512-uWpR29K93+Ue3UJJPiVH9Q3L5+kpAQN7LlB8zdQe0unvVn4sTIIzrdSYkuIml55TEvSFewtov6OB3jmpAY4jsQ== + dependencies: + bower "^1.7.9" + command-line-args "^3.0.0" + optionalDependencies: + wnpm-ci "*" + +bower@^1.7.9: + version "1.8.14" + resolved "https://registry.npmmirror.com/bower/-/bower-1.8.14.tgz#985722a3c1fcd35c93d4136ecbeafbeaaea74e86" + integrity sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + 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.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.21.3, browserslist@^4.21.4: + version "4.21.5" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449: + version "1.0.30001451" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz#2e197c698fc1373d63e1406d6607ea4617c613f1" + integrity sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w== + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.7.1" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" + integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmmirror.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0, color@^3.1.0: + version "3.2.1" + resolved "https://registry.npmmirror.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^1.0.7: + version "1.4.0" + resolved "https://registry.npmmirror.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +command-line-args@^3.0.0: + version "3.0.5" + resolved "https://registry.npmmirror.com/command-line-args/-/command-line-args-3.0.5.tgz#5bd4ad45e7983e5c1344918e40280ee2693c5ac0" + integrity sha512-M29kjOI24VF4HqatnqVyDqyeq3SYYZbq6LWv/AdVZ5LvrcqVNSN2XeYPrBxcO19T8YkGmyCqTUqYR07DFjVhyg== + dependencies: + array-back "^1.0.4" + feature-detect-es6 "^1.3.1" + find-replace "^1.0.2" + typical "^2.6.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.npmmirror.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +commons-validator-js@^1.0.237: + version "1.0.1668" + resolved "https://registry.npmmirror.com/commons-validator-js/-/commons-validator-js-1.0.1668.tgz#8b00d1c2878084cd495e0ac29d73567f33677295" + integrity sha512-zGSjqN958s9P9nFyK0qs8ipKnh+g+DFMpcnz7BajJrzsPDd8KdbyfostuZiT1l6Vm/WxiMHTxAzWFLGiMRpUCA== + dependencies: + bower-auto-release "^1.1.358" + lodash.includes "^4.3.0" + punycode "^1.4.1" + wnpm-ci "^8.0.131" + +component-emitter@^1.2.1, component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.1: + version "1.7.4" + resolved "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.6.5: + version "3.7.0" + resolved "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +core-js-compat@^3.25.1: + version "3.27.2" + resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" + integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== + dependencies: + browserslist "^4.21.4" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.0, cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.npmmirror.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q== + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.npmmirror.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.3" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw== + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw== + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.11" + resolved "https://registry.npmmirror.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.8" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +date-fns@^2.29.3: + version "2.29.3" + resolved "https://registry.npmmirror.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + +dayjs@^1.8.15: + version "1.11.7" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^3.2.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" + integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== + +deepmerge@^4.2.2: + version "4.3.0" + resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + integrity sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +deprecated-react-native-prop-types@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-2.3.0.tgz#c10c6ee75ff2b6de94bb127f142b814e6e08d9ab" + integrity sha512-pWD0voFtNYxrVqvBMYf5gq3NA2GCpfodS1yNynTPc93AYA/KEMGeWDqqeUB6R2Z9ZofVhks2aeJXiuQqKNpesA== + dependencies: + "@react-native/normalize-color" "*" + invariant "*" + prop-types "*" + +deprecated-react-native-prop-types@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-3.0.1.tgz#a275f84cd8519cd1665e8df3c99e9067d57a23ec" + integrity sha512-J0jCJcsk4hMlIb7xwOZKLfMpuJn6l8UtrPEzzQV5ewz5gvKNYakhBuq9h2rWX7YwHHJZFhU5W8ye7dB9oN8VcQ== + dependencies: + "@react-native/normalize-color" "*" + invariant "*" + prop-types "*" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.4.2.tgz#711fe6bd8a5869fe2539cee4a5152425ff671fda" + integrity sha512-R6P0Y6PrsH3n4hUXxL3nns0rbRk6Q33js3ygJBeEpbzLzgcNuJ61+u0RXasFpTKISw99TxUzFnumSnRLsjhLaw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.3.0" + resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.293" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.293.tgz#eaea755ad37a0f1759874a8597b33be62def2781" + integrity sha512-h7vBlhC83NsgC9UO3LOZx91xgstIrHk5iqMbZgnEArL5rHTM6HfsUZhnwb3oRnNetXM1741kB9SO7x9jLshz5A== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~6.4.0: + version "6.4.0" + resolved "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-6.4.0.tgz#88cd3082609ca86d7d3c12f0e746d12db4f47c91" + integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.0.3: + version "5.0.6" + resolved "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" + integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.7.2: + version "7.8.1" + resolved "https://registry.npmmirror.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +errorhandler@^1.5.0: + version "1.5.1" + resolved "https://registry.npmmirror.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" + integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== + dependencies: + accepts "~1.3.7" + escape-html "~1.0.3" + +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.1" + resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" + integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + 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.4" + is-array-buffer "^3.0.1" + 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.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + 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" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-module-lexer@^0.9.3: + version "0.9.3" + resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild@^0.12.9: + version "0.12.29" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.12.29.tgz#be602db7c4dc78944a9dbde0d1ea19d36c1f882d" + integrity sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.6.0" + resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" + integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== + +eslint-plugin-eslint-comments@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-ft-flow@^2.0.1: + version "2.0.3" + resolved "https://registry.npmmirror.com/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz#3b3c113c41902bcbacf0e22b536debcfc3c819e8" + integrity sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-jest@^26.5.3: + version "26.9.0" + resolved "https://registry.npmmirror.com/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz#7931c31000b1c19e57dbfb71bbf71b817d1bf949" + integrity sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react-native-globals@^0.1.1: + version "0.1.2" + resolved "https://registry.npmmirror.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" + integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== + +eslint-plugin-react-native@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.0.0.tgz#eec41984abe4970bdd7c6082dff7a98a5e34d0bb" + integrity sha512-kMmdxrSY7A1WgdqaGC+rY/28rh7kBGNBRsk48ovqkQmdg5j4K+DaFmegENDzMrdLkoufKGRNkKX6bgSwQTCAxQ== + dependencies: + "@babel/traverse" "^7.7.4" + eslint-plugin-react-native-globals "^0.1.1" + +eslint-plugin-react@^7.30.1: + version "7.32.2" + resolved "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.19.0: + version "8.33.0" + resolved "https://registry.npmmirror.com/eslint/-/eslint-8.33.0.tgz#02f110f32998cb598c6461f24f4d306e41ca33d7" + integrity sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA== + dependencies: + "@eslint/eslintrc" "^1.4.1" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.1" + resolved "https://registry.npmmirror.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0, event-target-shim@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^2.0.3: + version "2.1.0" + resolved "https://registry.npmmirror.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^29.0.0, expect@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/expect/-/expect-29.4.2.tgz#2ae34eb88de797c64a1541ad0f1e2ea8a7a7b492" + integrity sha512-+JHYg9O3hd3RlICG90OPVjRkPBoiUH7PxvDVMnRiaq1g6JUgZStX514erMl0v2Dc5SkfVbm7ztqbd6qHHPn+mQ== + dependencies: + "@jest/expect-utils" "^29.4.2" + jest-get-type "^29.4.2" + jest-matcher-utils "^29.4.2" + jest-message-util "^29.4.2" + jest-util "^29.4.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +feature-detect-es6@^1.3.1: + version "1.5.0" + resolved "https://registry.npmmirror.com/feature-detect-es6/-/feature-detect-es6-1.5.0.tgz#a69bb7662c65f64f89f07eac5a461b649a1e0a00" + integrity sha512-DzWPIGzTnfp3/KK1d/YPfmgLqeDju9F2DQYBL35VusgSApcA7XGqVtXfR4ETOOFEzdFJ3J7zh0Gkk011TiA4uQ== + dependencies: + array-back "^1.0.4" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-replace@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" + integrity sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA== + dependencies: + array-back "^1.0.4" + test-value "^2.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +flow-parser@0.*: + version "0.199.1" + resolved "https://registry.npmmirror.com/flow-parser/-/flow-parser-0.199.1.tgz#d2e37d3ccd3a4301738a429079a41320a54ada57" + integrity sha512-Mt+GFUQYij3miM7Z6o8E3aHTGXZKSOhvlCFgdQRoi6fkWfhyijnoX51zpOxM5PmZuiV6gallWhDZzwOsWxRutg== + +flow-parser@^0.185.0: + version "0.185.2" + resolved "https://registry.npmmirror.com/flow-parser/-/flow-parser-0.185.2.tgz#cb7ee57f77377d6c5d69a469e980f6332a15e492" + integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^11.1.0: + version "11.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hermes-estree@0.8.0: + version "0.8.0" + resolved "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.8.0.tgz#530be27243ca49f008381c1f3e8b18fb26bf9ec0" + integrity sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q== + +hermes-parser@0.8.0: + version "0.8.0" + resolved "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.8.0.tgz#116dceaba32e45b16d6aefb5c4c830eaeba2d257" + integrity sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA== + dependencies: + hermes-estree "0.8.0" + +hermes-profile-transformer@^0.0.6: + version "0.0.6" + resolved "https://registry.npmmirror.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" + integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== + dependencies: + source-map "^0.7.3" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A== + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.0.5, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-size@^0.6.0: + version "0.6.3" + resolved "https://registry.npmmirror.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" + integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== + +immer@^9.0.19: + version "9.0.19" + resolved "https://registry.npmmirror.com/immer/-/immer-9.0.19.tgz#67fb97310555690b5f9cd8380d38fc0aabb6b38b" + integrity sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^8.2.2: + version "8.2.5" + resolved "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +internal-slot@^1.0.3, internal-slot@^1.0.4: + version "1.0.5" + resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +intl-messageformat@10.3.3: + version "10.3.3" + resolved "https://registry.npmmirror.com/intl-messageformat/-/intl-messageformat-10.3.3.tgz#576798d31c9f8d90f9beadaa5a3878b8d30177a2" + integrity sha512-un/f07/g2e/3Q8e1ghDKET+el22Bi49M7O/rHxd597R+oLpPOMykSv5s51cABVfu3FZW+fea4hrzf2MHu1W4hw== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/fast-memoize" "2.0.1" + "@formatjs/icu-messageformat-parser" "2.3.0" + tslib "^2.4.0" + +invariant@*, invariant@2.2.4, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip@^1.1.5: + version "1.1.8" + resolved "https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-array-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-builtin-module@^3.1.0: + version "3.2.1" + resolved "https://registry.npmmirror.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + 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" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.npmmirror.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + 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-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.4.2.tgz#bee1fafc8b620d6251423d1978a0080546bc4376" + integrity sha512-Qdd+AXdqD16PQa+VsWJpxR3kN0JyOCX1iugQfx5nUgAsI4gwsKviXkpclxOK9ZnwaY2IQVHz+771eAvqeOlfuw== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-circus/-/jest-circus-29.4.2.tgz#2d00c04baefd0ee2a277014cd494d4b5970663ed" + integrity sha512-wW3ztp6a2P5c1yOc1Cfrt5ozJ7neWmqeXm/4SYiqcSriyisgq63bwFj1NuRdSR5iqS0CMEYwSZd89ZA47W9zUg== + dependencies: + "@jest/environment" "^29.4.2" + "@jest/expect" "^29.4.2" + "@jest/test-result" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.4.2" + jest-matcher-utils "^29.4.2" + jest-message-util "^29.4.2" + jest-runtime "^29.4.2" + jest-snapshot "^29.4.2" + jest-util "^29.4.2" + p-limit "^3.1.0" + pretty-format "^29.4.2" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-cli/-/jest-cli-29.4.2.tgz#94a2f913a0a7a49d11bee98ad88bf48baae941f4" + integrity sha512-b+eGUtXq/K2v7SH3QcJvFvaUaCDS1/YAZBYz0m28Q/Ppyr+1qNaHmVYikOrbHVbZqYQs2IeI3p76uy6BWbXq8Q== + dependencies: + "@jest/core" "^29.4.2" + "@jest/test-result" "^29.4.2" + "@jest/types" "^29.4.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.4.2" + jest-util "^29.4.2" + jest-validate "^29.4.2" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-config/-/jest-config-29.4.2.tgz#15386dd9ed2f7059516915515f786b8836a98f07" + integrity sha512-919CtnXic52YM0zW4C1QxjG6aNueX1kBGthuMtvFtRTAxhKfJmiXC9qwHmi6o2josjbDz8QlWyY55F1SIVmCWA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.4.2" + "@jest/types" "^29.4.2" + babel-jest "^29.4.2" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.4.2" + jest-environment-node "^29.4.2" + jest-get-type "^29.4.2" + jest-regex-util "^29.4.2" + jest-resolve "^29.4.2" + jest-runner "^29.4.2" + jest-util "^29.4.2" + jest-validate "^29.4.2" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.4.2" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.4.2.tgz#b88502d5dc02d97f6512d73c37da8b36f49b4871" + integrity sha512-EK8DSajVtnjx9sa1BkjZq3mqChm2Cd8rIzdXkQMA8e0wuXq53ypz6s5o5V8HRZkoEt2ywJ3eeNWFKWeYr8HK4g== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.2" + jest-get-type "^29.4.2" + pretty-format "^29.4.2" + +jest-docblock@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.4.2.tgz#c78a95eedf9a24c0a6cc16cf2abdc4b8b0f2531b" + integrity sha512-dV2JdahgClL34Y5vLrAHde3nF3yo2jKRH+GIYJuCpfqwEJZcikzeafVTGAjbOfKPG17ez9iWXwUYp7yefeCRag== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-each/-/jest-each-29.4.2.tgz#e1347aff1303f4c35470827a62c029d389c5d44a" + integrity sha512-trvKZb0JYiCndc55V1Yh0Luqi7AsAdDWpV+mKT/5vkpnnFQfuQACV72IoRV161aAr6kAVIBpmYzwhBzm34vQkA== + dependencies: + "@jest/types" "^29.4.2" + chalk "^4.0.0" + jest-get-type "^29.4.2" + jest-util "^29.4.2" + pretty-format "^29.4.2" + +jest-environment-node@^29.2.1, jest-environment-node@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.4.2.tgz#0eab835b41e25fd0c1a72f62665fc8db08762ad2" + integrity sha512-MLPrqUcOnNBc8zTOfqBbxtoa8/Ee8tZ7UFW7hRDQSUT+NGsvS96wlbHGTf+EFAT9KC3VNb7fWEM6oyvmxtE/9w== + dependencies: + "@jest/environment" "^29.4.2" + "@jest/fake-timers" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + jest-mock "^29.4.2" + jest-util "^29.4.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-get-type@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.4.2.tgz#7cb63f154bca8d8f57364d01614477d466fa43fe" + integrity sha512-vERN30V5i2N6lqlFu4ljdTqQAgrkTFMC9xaIIfOPYBw04pufjXRty5RuXBiB1d72tGbURa/UgoiHB90ruOSivg== + +jest-haste-map@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.4.2.tgz#9112df3f5121e643f1b2dcbaa86ab11b0b90b49a" + integrity sha512-WkUgo26LN5UHPknkezrBzr7lUtV1OpGsp+NfXbBwHztsFruS3gz+AMTTBcEklvi8uPzpISzYjdKXYZQJXBnfvw== + dependencies: + "@jest/types" "^29.4.2" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.2" + jest-util "^29.4.2" + jest-worker "^29.4.2" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.4.2.tgz#8f05c6680e0cb46a1d577c0d3da9793bed3ea97b" + integrity sha512-Wa62HuRJmWXtX9F00nUpWlrbaH5axeYCdyRsOs/+Rb1Vb6+qWTlB5rKwCCRKtorM7owNwKsyJ8NRDUcZ8ghYUA== + dependencies: + jest-get-type "^29.4.2" + pretty-format "^29.4.2" + +jest-matcher-utils@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.4.2.tgz#08d0bf5abf242e3834bec92c7ef5071732839e85" + integrity sha512-EZaAQy2je6Uqkrm6frnxBIdaWtSYFoR8SVb2sNLAtldswlR/29JAgx+hy67llT3+hXBaLB0zAm5UfeqerioZyg== + dependencies: + chalk "^4.0.0" + jest-diff "^29.4.2" + jest-get-type "^29.4.2" + pretty-format "^29.4.2" + +jest-message-util@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.4.2.tgz#309a2924eae6ca67cf7f25781a2af1902deee717" + integrity sha512-SElcuN4s6PNKpOEtTInjOAA8QvItu0iugkXqhYyguRvQoXapg5gN+9RQxLAkakChZA7Y26j6yUCsFWN+hlKD6g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.4.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.4.2" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.4.2.tgz#e1054be66fb3e975d26d4528fcde6979e4759de8" + integrity sha512-x1FSd4Gvx2yIahdaIKoBjwji6XpboDunSJ95RpntGrYulI1ByuYQCKN/P7hvk09JB74IonU3IPLdkutEWYt++g== + dependencies: + "@jest/types" "^29.4.2" + "@types/node" "*" + jest-util "^29.4.2" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^27.0.6: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-regex-util@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.4.2.tgz#19187cca35d301f8126cf7a021dd4dcb7b58a1ca" + integrity sha512-XYZXOqUl1y31H6VLMrrUL1ZhXuiymLKPz0BO1kEeR5xER9Tv86RZrjTm74g5l9bPJQXA/hyLdaVPN/sdqfteig== + +jest-resolve-dependencies@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.2.tgz#6359db606f5967b68ca8bbe9dbc07a4306c12bf7" + integrity sha512-6pL4ptFw62rjdrPk7rRpzJYgcRqRZNsZTF1VxVTZMishbO6ObyWvX57yHOaNGgKoADtAHRFYdHQUEvYMJATbDg== + dependencies: + jest-regex-util "^29.4.2" + jest-snapshot "^29.4.2" + +jest-resolve@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.4.2.tgz#8831f449671d08d161fe493003f61dc9b55b808e" + integrity sha512-RtKWW0mbR3I4UdkOrW7552IFGLYQ5AF9YrzD0FnIOkDu0rAMlA5/Y1+r7lhCAP4nXSBTaE7ueeqj6IOwZpgoqw== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" + jest-pnp-resolver "^1.2.2" + jest-util "^29.4.2" + jest-validate "^29.4.2" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-runner/-/jest-runner-29.4.2.tgz#2bcecf72303369df4ef1e6e983c22a89870d5125" + integrity sha512-wqwt0drm7JGjwdH+x1XgAl+TFPH7poowMguPQINYxaukCqlczAcNLJiK+OLxUxQAEWMdy+e6nHZlFHO5s7EuRg== + dependencies: + "@jest/console" "^29.4.2" + "@jest/environment" "^29.4.2" + "@jest/test-result" "^29.4.2" + "@jest/transform" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.2" + jest-environment-node "^29.4.2" + jest-haste-map "^29.4.2" + jest-leak-detector "^29.4.2" + jest-message-util "^29.4.2" + jest-resolve "^29.4.2" + jest-runtime "^29.4.2" + jest-util "^29.4.2" + jest-watcher "^29.4.2" + jest-worker "^29.4.2" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.4.2.tgz#d86b764c5b95d76cb26ed1f32644e99de5d5c134" + integrity sha512-3fque9vtpLzGuxT9eZqhxi+9EylKK/ESfhClv4P7Y9sqJPs58LjVhTt8jaMp/pRO38agll1CkSu9z9ieTQeRrw== + dependencies: + "@jest/environment" "^29.4.2" + "@jest/fake-timers" "^29.4.2" + "@jest/globals" "^29.4.2" + "@jest/source-map" "^29.4.2" + "@jest/test-result" "^29.4.2" + "@jest/transform" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.4.2" + jest-message-util "^29.4.2" + jest-mock "^29.4.2" + jest-regex-util "^29.4.2" + jest-resolve "^29.4.2" + jest-snapshot "^29.4.2" + jest-util "^29.4.2" + semver "^7.3.5" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.0.6: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.4.2.tgz#ba1fb9abb279fd2c85109ff1757bc56b503bbb3a" + integrity sha512-PdfubrSNN5KwroyMH158R23tWcAXJyx4pvSvWls1dHoLCaUhGul9rsL3uVjtqzRpkxlkMavQjGuWG1newPgmkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.4.2" + "@jest/transform" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.4.2" + graceful-fs "^4.2.9" + jest-diff "^29.4.2" + jest-get-type "^29.4.2" + jest-haste-map "^29.4.2" + jest-matcher-utils "^29.4.2" + jest-message-util "^29.4.2" + jest-util "^29.4.2" + natural-compare "^1.4.0" + pretty-format "^29.4.2" + semver "^7.3.5" + +jest-util@^27.2.0: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-util/-/jest-util-29.4.2.tgz#3db8580b295df453a97de4a1b42dd2578dabd2c2" + integrity sha512-wKnm6XpJgzMUSRFB7YF48CuwdzuDIHenVuoIb1PLuJ6F+uErZsuDkU+EiExkChf6473XcawBrSfDSnXl+/YG4g== + dependencies: + "@jest/types" "^29.4.2" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^26.5.2: + version "26.6.2" + resolved "https://registry.npmmirror.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-validate@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.4.2.tgz#3b3f8c4910ab9a3442d2512e2175df6b3f77b915" + integrity sha512-tto7YKGPJyFbhcKhIDFq8B5od+eVWD/ySZ9Tvcp/NGCvYA4RQbuzhbwYWtIjMT5W5zA2W0eBJwu4HVw34d5G6Q== + dependencies: + "@jest/types" "^29.4.2" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.2" + leven "^3.1.0" + pretty-format "^29.4.2" + +jest-watcher@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.4.2.tgz#09c0f4c9a9c7c0807fcefb1445b821c6f7953b7c" + integrity sha512-onddLujSoGiMJt+tKutehIidABa175i/Ays+QvKxCqBwp7fvxP3ZhKsrIdOodt71dKxqk4sc0LN41mWLGIK44w== + dependencies: + "@jest/test-result" "^29.4.2" + "@jest/types" "^29.4.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.4.2" + string-length "^4.0.1" + +jest-worker@^27.2.0: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.4.2.tgz#d9b2c3bafc69311d84d94e7fb45677fc8976296f" + integrity sha512-VIuZA2hZmFyRbchsUCHEehoSf2HEl0YVF8SDJqtPnKorAaBuh42V8QsLnde0XP5F6TyCynGPEGgBOn3Fc+wZGw== + dependencies: + "@types/node" "*" + jest-util "^29.4.2" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.2.1: + version "29.4.2" + resolved "https://registry.npmmirror.com/jest/-/jest-29.4.2.tgz#4c2127d03a71dc187f386156ef155dbf323fb7be" + integrity sha512-+5hLd260vNIHu+7ZgMIooSpKl7Jp5pHKb51e73AJU3owd5dEo/RfVwHbA/na3C/eozrt3hJOLGf96c7EWwIAzg== + dependencies: + "@jest/core" "^29.4.2" + "@jest/types" "^29.4.2" + import-local "^3.0.2" + jest-cli "^29.4.2" + +joi@^17.2.1: + version "17.7.0" + resolved "https://registry.npmmirror.com/joi/-/joi-17.7.0.tgz#591a33b1fe1aca2bc27f290bcad9b9c1c570a6b3" + integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +joycon@^3.0.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsc-android@^250230.2.1: + version "250230.2.1" + resolved "https://registry.npmmirror.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" + integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== + +jscodeshift@^0.13.1: + version "0.13.1" + resolved "https://registry.npmmirror.com/jscodeshift/-/jscodeshift-0.13.1.tgz#69bfe51e54c831296380585c6d9e733512aecdef" + integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.20.4" + temp "^0.8.4" + write-file-atomic "^2.3.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.3" + resolved "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logkitty@^0.7.1: + version "0.7.1" + resolved "https://registry.npmmirror.com/logkitty/-/logkitty-0.7.1.tgz#8e8d62f4085a826e8d38987722570234e33c6aa7" + integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== + dependencies: + ansi-fragments "^0.2.1" + dayjs "^1.8.15" + yargs "^15.1.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +memoize-one@^5.0.0, memoize-one@^5.0.5: + version "5.2.1" + resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +metro-babel-transformer@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-babel-transformer/-/metro-babel-transformer-0.73.7.tgz#561ffa0336eb6d7d112e7128e957114c729fdb71" + integrity sha512-s7UVkwovGTEXYEQrv5hcmSBbFJ9s9lhCRNMScn4Itgj3UMdqRr9lU8DXKEFlJ7osgRxN6n5+eXqcvhE4B1H1VQ== + dependencies: + "@babel/core" "^7.20.0" + hermes-parser "0.8.0" + metro-source-map "0.73.7" + nullthrows "^1.1.1" + +metro-cache-key@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-cache-key/-/metro-cache-key-0.73.7.tgz#fa3b4ece5f3191ce238a623051a0d03bada2a153" + integrity sha512-GngYzrHwZU9U0Xl81H4aq9Tn5cjQyU12v9/flB0hzpeiYO5A89TIeilb4Kg8jtfC6JcmmsdK9nxYIGEq7odHhQ== + +metro-cache@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-cache/-/metro-cache-0.73.7.tgz#dd2b6a791b2754eae9c0a86dcf714b98e025fd95" + integrity sha512-CPPgI+i9yVzOEDCdmEEZ67JgOvZyNDs8kStmGUFgDuLSjj3//HhkqT5XyfWjGeH6KmyGiS8ip3cgLOVn3IsOSA== + dependencies: + metro-core "0.73.7" + rimraf "^3.0.2" + +metro-config@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-config/-/metro-config-0.73.7.tgz#8935054ece6155d214420c263272cd3a690a82e2" + integrity sha512-pD/F+vK3u37cbj1skYmI6cUsEEscqNRtW2KlDKu1m+n8nooDB2oGTOZatlS5WQa7Ga6jYQRydftlq4CLDexAfA== + dependencies: + cosmiconfig "^5.0.5" + jest-validate "^26.5.2" + metro "0.73.7" + metro-cache "0.73.7" + metro-core "0.73.7" + metro-runtime "0.73.7" + +metro-core@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-core/-/metro-core-0.73.7.tgz#f5abe2448ea72a65f54db9bc90068f3308de1df2" + integrity sha512-H7j1Egj1VnNnsSYf9ZKv0SRwijgtRKIcaGNQq/T+er73vqqb4kR9H+2VIJYPXi6R8lT+QLIMfs6CWSUHAJUgtg== + dependencies: + lodash.throttle "^4.1.1" + metro-resolver "0.73.7" + +metro-file-map@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-file-map/-/metro-file-map-0.73.7.tgz#709f33ac5ea6f87668d454c77973ab296b7a064b" + integrity sha512-BYaCo2e/4FMN4nOajeN+Za5cPfecfikzUYuFWWMyLAmHU6dj7B+PFkaJ4OEJO3vmRoeq5vMOmhpKXgysYbNXJg== + dependencies: + abort-controller "^3.0.0" + anymatch "^3.0.3" + debug "^2.2.0" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + invariant "^2.2.4" + jest-regex-util "^27.0.6" + jest-serializer "^27.0.6" + jest-util "^27.2.0" + jest-worker "^27.2.0" + micromatch "^4.0.4" + nullthrows "^1.1.1" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +metro-hermes-compiler@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-hermes-compiler/-/metro-hermes-compiler-0.73.7.tgz#d1b519c4040423240d89e7816340ca9635deeae8" + integrity sha512-F8PlJ8mWEEumGNH3eMRA3gjgP70ZvH4Ex5F1KY6ofD/gpn7w5HJHSPTeVw8gtUb1pYLN4nevptpyXGg04Jfcog== + +metro-inspector-proxy@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-inspector-proxy/-/metro-inspector-proxy-0.73.7.tgz#edb966c1581a41a3302860d264f3228e1f57a220" + integrity sha512-TsAtQeKr9X7NaQHlpshu+ZkGWlPi5fFKNqieLkfqvT1oXN4PQF/4q38INyiZtWLPvoUzTR6PRnm4pcUbJ7+Nzg== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + ws "^7.5.1" + yargs "^17.5.1" + +metro-minify-terser@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-minify-terser/-/metro-minify-terser-0.73.7.tgz#e45fc05eb2e3bc76c9b4fe4abccee0fffeedcf75" + integrity sha512-gbv1fmMOZm6gJ6dQoD+QktlCi2wk6nlTR8j8lQCjeeXGbs6O9e5XLWNPOexHqo7S69bdbohEnfZnLJFcxgHeNw== + dependencies: + terser "^5.15.0" + +metro-minify-uglify@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-minify-uglify/-/metro-minify-uglify-0.73.7.tgz#3dfd397e8202905731e4a519a58fc334d9232a15" + integrity sha512-DmDCzfdbaPExQuQ7NQozCNOSOAgp5Ux9kWzmKAT8seQ38/3NtUepW+PTgxXIHmwNjJV4oHsHwlBlTwJmYihKXg== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.7.tgz#78e1ce448aa9a5cf3651c0ebe73cb225465211b4" + integrity sha512-RKcmRZREjJCzHKP+JhC9QTCohkeb3xa/DtqHU14U5KWzJHdC0mMrkTZYNXhV0cryxsaVKVEw5873KhbZyZHMVw== + dependencies: + "@babel/core" "^7.20.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.18.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + react-refresh "^0.4.0" + +metro-react-native-babel-transformer@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.7.tgz#a92055fd564cd403255cc34f925c5e99ce457565" + integrity sha512-73HW8betjX+VPm3iqsMBe8F/F2Tt+hONO6YJwcF7FonTqQYW1oTz0dOp0dClZGfHUXxpJBz6Vuo7J6TpdzDD+w== + dependencies: + "@babel/core" "^7.20.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.8.0" + metro-babel-transformer "0.73.7" + metro-react-native-babel-preset "0.73.7" + metro-source-map "0.73.7" + nullthrows "^1.1.1" + +metro-resolver@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-resolver/-/metro-resolver-0.73.7.tgz#1e174cf59eac84c0869172764316042b466daaa5" + integrity sha512-mGW3XPeKBCwZnkHcKo1dhFa9olcx7SyNzG1vb5kjzJYe4Qs3yx04r/qFXIJLcIgLItB69TIGvosznUhpeOOXzg== + dependencies: + absolute-path "^0.0.0" + +metro-runtime@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-runtime/-/metro-runtime-0.73.7.tgz#9f3a7f3ff668c1a87370650e32b47d8f6329fd1e" + integrity sha512-2fxRGrF8FyrwwHY0TCitdUljzutfW6CWEpdvPilfrs8p0PI5X8xOWg8ficeYtw+DldHtHIAL2phT59PqzHTyVA== + dependencies: + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" + +metro-source-map@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-source-map/-/metro-source-map-0.73.7.tgz#8e9f850a72d60ea7ace05b984f981c8ec843e7a0" + integrity sha512-gbC/lfUN52TtQhEsTTA+987MaFUpQlufuCI05blLGLosDcFCsARikHsxa65Gtslm/rG2MqvFLiPA5hviONNv9g== + dependencies: + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + invariant "^2.2.4" + metro-symbolicate "0.73.7" + nullthrows "^1.1.1" + ob1 "0.73.7" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-symbolicate@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-symbolicate/-/metro-symbolicate-0.73.7.tgz#40e4cda81f8030b86afe391b5e686a0b06822b0a" + integrity sha512-571ThWmX5o8yGNzoXjlcdhmXqpByHU/bSZtWKhtgV2TyIAzYCYt4hawJAS5+/qDazUvjHdm8BbdqFUheM0EKNQ== + dependencies: + invariant "^2.2.4" + metro-source-map "0.73.7" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro-transform-plugins@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-transform-plugins/-/metro-transform-plugins-0.73.7.tgz#49ff2571742d557f20301880f55b00054e468e52" + integrity sha512-M5isiWEau0jMudb5ezaNBZnYqXxcATMqnAYc+Cu25IahT1NHi5aWwLok9EBmBpN5641IZUZXScf+KnS7fPxPCQ== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro-transform-worker/-/metro-transform-worker-0.73.7.tgz#be111805e92ea48b7c76dd75830798f318e252e0" + integrity sha512-gZYIu9JAqEI9Rxi0xGMuMW6QsHGbMSptozlTOwOd7T7yXX3WwYS/I3yLPbLhbZTjOhwMHkTt8Nhm2qBo8nh14g== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/types" "^7.20.0" + babel-preset-fbjs "^3.4.0" + metro "0.73.7" + metro-babel-transformer "0.73.7" + metro-cache "0.73.7" + metro-cache-key "0.73.7" + metro-hermes-compiler "0.73.7" + metro-source-map "0.73.7" + metro-transform-plugins "0.73.7" + nullthrows "^1.1.1" + +metro@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/metro/-/metro-0.73.7.tgz#435081339ac209e4d8802c57ac522638140c802b" + integrity sha512-pkRqFhuGUvkiu8HxKPUQelbCuyy6te6okMssTyLzQwsKilNLK4YMI2uD6PHnypg5SiMJ58lwfqkp/t5w72jEvw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + absolute-path "^0.0.0" + accepts "^1.3.7" + async "^3.2.2" + chalk "^4.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + error-stack-parser "^2.0.6" + graceful-fs "^4.2.4" + hermes-parser "0.8.0" + image-size "^0.6.0" + invariant "^2.2.4" + jest-worker "^27.2.0" + lodash.throttle "^4.1.1" + metro-babel-transformer "0.73.7" + metro-cache "0.73.7" + metro-cache-key "0.73.7" + metro-config "0.73.7" + metro-core "0.73.7" + metro-file-map "0.73.7" + metro-hermes-compiler "0.73.7" + metro-inspector-proxy "0.73.7" + metro-minify-terser "0.73.7" + metro-minify-uglify "0.73.7" + metro-react-native-babel-preset "0.73.7" + metro-resolver "0.73.7" + metro-runtime "0.73.7" + metro-source-map "0.73.7" + metro-symbolicate "0.73.7" + metro-transform-plugins "0.73.7" + metro-transform-worker "0.73.7" + mime-types "^2.1.27" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + rimraf "^3.0.2" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^6.0.0" + temp "0.8.3" + throat "^5.0.0" + ws "^7.5.1" + yargs "^17.5.1" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.28, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.1, mime@^2.4.6: + version "2.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mini-star@^2.0.8: + version "2.0.8" + resolved "https://registry.npmmirror.com/mini-star/-/mini-star-2.0.8.tgz#a6c09a1f2a8ec2c962feaafc8a68b6286d9f100e" + integrity sha512-la0VMkkiSLfYwVoc/gtKylrntv7LOOqsFEeo9vHYfPDi31+mFqKa2SFwkV/SU8bah3tScLfMuEvhc1OB3nv9QA== + dependencies: + "@rollup/plugin-commonjs" "^19.0.0" + "@rollup/plugin-json" "^4.1.0" + "@rollup/plugin-node-resolve" "^13.0.0" + "@rollup/plugin-url" "^6.0.0" + cosmiconfig "^7.0.0" + esbuild "^0.12.9" + fs-extra "^9.1.0" + inquirer "^8.2.2" + ora "^5.4.0" + rimraf "^3.0.2" + rollup "^2.48.0" + rollup-plugin-esbuild "^4.5.0" + rollup-plugin-styles "^3.14.1" + yargs "^16.2.0" + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +moment@^2.24.0: + version "2.29.4" + resolved "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + 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.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0: + version "2.6.2" + resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nocache@^3.0.1: + version "3.0.4" + resolved "https://registry.npmmirror.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" + integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.npmmirror.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + +node-fetch@^2.2.0, node-fetch@^2.6.0: + version "2.6.9" + resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +node-stream-zip@^1.9.1: + version "1.15.0" + resolved "https://registry.npmmirror.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-svg-path@^1.0.1: + version "1.1.0" + resolved "https://registry.npmmirror.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" + integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== + dependencies: + svg-arc-to-cubic-bezier "^3.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +notepack.io@~2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/notepack.io/-/notepack.io-2.2.0.tgz#d7ea71d1cb90094f88c6f3c8d84277c2d0cd101c" + integrity sha512-9b5w3t5VSH6ZPosoYnyDONnUTF8o0UkBw7JLA6eBlYJWyGT1Q3vQa8Hmuj1/X6RYvHjjygBDgw6fJhe0JEojfw== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +ob1@0.73.7: + version "0.73.7" + resolved "https://registry.npmmirror.com/ob1/-/ob1-0.73.7.tgz#14c9b6ddc26cf99144f59eb542d7ae956e6b3192" + integrity sha512-DfelfvR843KADhSUATGGhuepVMRcf5VQX+6MQLy5AW0BKDLlO7Usj6YZeAAZP7P86QwsoTxB0RXCFiA7t6S1IQ== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.5" + resolved "https://registry.npmmirror.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmmirror.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^6.2.0: + version "6.4.0" + resolved "https://registry.npmmirror.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + +open@^7.4.2: + version "7.4.2" + resolved "https://registry.npmmirror.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.4.0, ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.npmmirror.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-svg-path@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + integrity sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +patch-package@^6.5.1: + version "6.5.1" + resolved "https://registry.npmmirror.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" + integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^1.10.2" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.4, pirates@^4.0.5: + version "4.0.5" + resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.11" + resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +"postcss@5 - 7", postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27: + version "7.0.39" + resolved "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.2.4: + version "8.4.21" + resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.4.1: + version "2.8.4" + resolved "https://registry.npmmirror.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + +pretty-format@^26.5.2, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^29.0.0, pretty-format@^29.4.2: + version "29.4.2" + resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.4.2.tgz#64bf5ccc0d718c03027d94ac957bdd32b3fb2401" + integrity sha512-qKlHR8yFVCbcEWba0H0TOC8dnLlO4vPlyEjRPw31FZ2Rupy9nLa8ZLbYny8gWEl8CkEhJqAE6IzdNELTBVcBEg== + dependencies: + "@jest/schemas" "^29.4.2" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^8.3.0: + version "8.3.0" + resolved "https://registry.npmmirror.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@*, prop-types@^15.5.10, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.npmmirror.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +query-string@^6.13.8: + version "6.14.1" + resolved "https://registry.npmmirror.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" + integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +react-devtools-core@^4.26.1: + version "4.27.2" + resolved "https://registry.npmmirror.com/react-devtools-core/-/react-devtools-core-4.27.2.tgz#d20fc57e258c656eedabafc2c851d38b33583148" + integrity sha512-8SzmIkpO87alD7Xr6gWIEa1jHkMjawOZ+6egjazlnjB4UUcbnzGDf/vBJ4BzGuWWEM+pzrxuzsPpcMqlQkYK2g== + dependencies: + shell-quote "^1.6.1" + ws "^7" + +react-freeze@^1.0.0: + version "1.0.3" + resolved "https://registry.npmmirror.com/react-freeze/-/react-freeze-1.0.3.tgz#5e3ca90e682fed1d73a7cb50c2c7402b3e85618d" + integrity sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g== + +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-native-codegen@^0.71.3: + version "0.71.3" + resolved "https://registry.npmmirror.com/react-native-codegen/-/react-native-codegen-0.71.3.tgz#75fbc591819050791319ebdb9fe341ee4df5c288" + integrity sha512-5AvdHVU1sAaXg05i0dG664ZTaCaIFaY1znV5vNsj+wUu6MGxNEUNbDKk9dxKUkkxOyk2KZOK5uhzWL0p5H5yZQ== + dependencies: + "@babel/parser" "^7.14.0" + flow-parser "^0.185.0" + jscodeshift "^0.13.1" + nullthrows "^1.1.1" + +react-native-config@^1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/react-native-config/-/react-native-config-1.5.0.tgz#ff5a78fbbc2c2a0525788e5f3c86101110651ba4" + integrity sha512-slecooA/0tCwhb+RuWEbwLqtKirGh9vWPRpgDfH7uPAraCciqHNH2XjS9ylW+Spn4FUrHg5KWTqUGs9BdBADHg== + +react-native-device-info@^10.5.1: + version "10.5.1" + resolved "https://registry.npmmirror.com/react-native-device-info/-/react-native-device-info-10.5.1.tgz#16a24e2b32c14af1b00994019c850ad2088b30f3" + integrity sha512-fOoynmthZnoP7avXpUE/RP8F6Fw/ThFd3aF2C+jbyNCls9+ls4SKU7/opQJvZxd2/9vo//jBJ8AEloEcTpBIqw== + +react-native-gesture-handler@^2.9.0: + version "2.9.0" + resolved "https://registry.npmmirror.com/react-native-gesture-handler/-/react-native-gesture-handler-2.9.0.tgz#2f63812e523c646f25b9ad660fc6f75948e51241" + integrity sha512-a0BcH3Qb1tgVqUutc6d3VuWQkI1AM3+fJx8dkxzZs9t06qA27QgURYFoklpabuWpsUTzuKRpxleykp25E8m7tg== + dependencies: + "@egjs/hammerjs" "^2.0.17" + hoist-non-react-statics "^3.3.0" + invariant "^2.2.4" + lodash "^4.17.21" + prop-types "^15.7.2" + +react-native-gradle-plugin@^0.71.14: + version "0.71.14" + resolved "https://registry.npmmirror.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.14.tgz#cc399662f04fbfcc0e352d03eae1d3efbd5f635a" + integrity sha512-nnLawTZEPPRAKq92UqDkzoGgCBl9aa9zAihFHMwmwzn4WRVdK4O6Cd4XYiyoNOiQzx3Hh9k5WOckHE80C92ivQ== + +react-native-localize@^2.2.6: + version "2.2.6" + resolved "https://registry.npmmirror.com/react-native-localize/-/react-native-localize-2.2.6.tgz#484f8c700bc629f230066e819265f80f6dd3ef58" + integrity sha512-EZETlC1ZlW/4g6xfsNCwAkAw5BDL2A6zk/08JjFR/GRGxYuKRD7iP1hHn1+h6DEu+xROjPpoNeXfMER2vkTVIQ== + +react-native-permissions@^3.10.1: + version "3.10.1" + resolved "https://registry.npmmirror.com/react-native-permissions/-/react-native-permissions-3.10.1.tgz#cb0171c8d12113869deaabbdfb979aad1a44752b" + integrity sha512-Gc5BxxpjZn4QNUDiVeHOO0vXh3AH7ToolmwTJozqC6DsxV7NAf3ttap+8BSmzDR8WxuAM3Cror+YNiBhHJx7/w== + +react-native-reanimated@^2.14.4: + version "2.14.4" + resolved "https://registry.npmmirror.com/react-native-reanimated/-/react-native-reanimated-2.14.4.tgz#3fa3da4e7b99f5dfb28f86bcf24d9d1024d38836" + integrity sha512-DquSbl7P8j4SAmc+kRdd75Ianm8G+IYQ9T4AQ6lrpLVeDkhZmjWI0wkutKWnp6L7c5XNVUrFDUf69dwETLCItQ== + dependencies: + "@babel/plugin-transform-object-assign" "^7.16.7" + "@babel/preset-typescript" "^7.16.7" + convert-source-map "^1.7.0" + invariant "^2.2.4" + lodash.isequal "^4.5.0" + setimmediate "^1.0.5" + string-hash-64 "^1.0.3" + +react-native-redash@^12.0.3: + version "12.6.1" + resolved "https://registry.npmmirror.com/react-native-redash/-/react-native-redash-12.6.1.tgz#26ca12ce01eaafc154fe322b506c48ef1a76197f" + integrity sha512-SChHzssVr512PfZxGCcVMmlAzQ20k5BkC8BiSfZls6bFohLiJT3ih6Of9mPmaTENCQWe7ywTx7gzr3tAnIu2mg== + dependencies: + abs-svg-path "^0.1.1" + normalize-svg-path "^1.0.1" + parse-svg-path "^0.1.2" + use-memo-one "^1.1.1" + +react-native-text-size@4.0.0-rc.1: + version "4.0.0-rc.1" + resolved "https://registry.npmmirror.com/react-native-text-size/-/react-native-text-size-4.0.0-rc.1.tgz#1e048d345dd6a5a8e1269e0585c1a5948c478da5" + integrity sha512-CysqjU2jK6Yc+a+kEI222pUyTY2ywcU2HqbFqf1KHymW6OPTdvBBHqbEJKL0QiLhQaFYDbqicM+h990s9TP00g== + +react-native-ui-lib@^6.29.1: + version "6.30.1" + resolved "https://registry.npmmirror.com/react-native-ui-lib/-/react-native-ui-lib-6.30.1.tgz#a12dad764892a53c3efd4575744d8c746ce90783" + integrity sha512-AmH7LRI22tZarIpsNsLSFAfoO1aXEtLldilKuwtY6rpepG9WSP16Qnrbygo54eOiLDwSdcoXXJz8PlWh2uNsFA== + dependencies: + babel-plugin-transform-inline-environment-variables "^0.0.2" + color "^3.1.0" + commons-validator-js "^1.0.237" + date-fns "^2.29.3" + deprecated-react-native-prop-types "^2.3.0" + hoist-non-react-statics "^3.0.0" + lodash "^4.17.21" + memoize-one "^5.0.5" + moment "^2.24.0" + prop-types "^15.5.10" + react-freeze "^1.0.0" + react-native-redash "^12.0.3" + react-native-text-size "4.0.0-rc.1" + semver "^5.5.0" + tinycolor2 "^1.4.2" + url-parse "^1.2.0" + +react-native-webview@^11.26.1: + version "11.26.1" + resolved "https://registry.npmmirror.com/react-native-webview/-/react-native-webview-11.26.1.tgz#658c09ed5162dc170b361e48c2dd26c9712879da" + integrity sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw== + dependencies: + escape-string-regexp "2.0.0" + invariant "2.2.4" + +react-native@0.71.2: + version "0.71.2" + resolved "https://registry.npmmirror.com/react-native/-/react-native-0.71.2.tgz#b6977eda2a6dc10baa006bf4ab1ee08318607ce9" + integrity sha512-ZSianM+j+09LoEdVIhrAP/uP8sQhT7dH6olCqM2xlpxmfCgA5NubsK6NABIuZiBlmmqjigyijm5Y/GhBIHDvEg== + dependencies: + "@jest/create-cache-key-function" "^29.2.1" + "@react-native-community/cli" "10.1.3" + "@react-native-community/cli-platform-android" "10.1.3" + "@react-native-community/cli-platform-ios" "10.1.1" + "@react-native/assets" "1.0.0" + "@react-native/normalize-color" "2.1.0" + "@react-native/polyfills" "2.0.0" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + deprecated-react-native-prop-types "^3.0.1" + event-target-shim "^5.0.1" + invariant "^2.2.4" + jest-environment-node "^29.2.1" + jsc-android "^250230.2.1" + memoize-one "^5.0.0" + metro-react-native-babel-transformer "0.73.7" + metro-runtime "0.73.7" + metro-source-map "0.73.7" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + pretty-format "^26.5.2" + promise "^8.3.0" + react-devtools-core "^4.26.1" + react-native-codegen "^0.71.3" + react-native-gradle-plugin "^0.71.14" + react-refresh "^0.4.0" + react-shallow-renderer "^16.15.0" + regenerator-runtime "^0.13.2" + scheduler "^0.23.0" + stacktrace-parser "^0.1.3" + use-sync-external-store "^1.0.0" + whatwg-fetch "^3.0.0" + ws "^6.2.2" + +react-refresh@^0.4.0: + version "0.4.3" + resolved "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" + integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== + +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.npmmirror.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + +react-test-renderer@18.2.0: + version "18.2.0" + resolved "https://registry.npmmirror.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" + integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA== + dependencies: + react-is "^18.2.0" + react-shallow-renderer "^16.15.0" + scheduler "^0.23.0" + +react@18.2.0: + version "18.2.0" + resolved "https://registry.npmmirror.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== + +recast@^0.20.4: + version "0.20.5" + resolved "https://registry.npmmirror.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" + integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== + dependencies: + ast-types "0.14.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: + version "0.13.11" + resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.2.1: + version "5.3.0" + resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.0.tgz#4d0d044b76fedbad6238703ae84bfdedee2cf074" + integrity sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== + +resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w== + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== + +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rollup-plugin-esbuild@^4.5.0: + version "4.10.3" + resolved "https://registry.npmmirror.com/rollup-plugin-esbuild/-/rollup-plugin-esbuild-4.10.3.tgz#caa66a99b53b21d4939beffc611d76f57191c4cb" + integrity sha512-RILwUCgnCL5vo8vyZ/ZpwcqRuE5KmLizEv6BujBQfgXFZ6ggcS0FiYvQN+gsTJfWCMaU37l0Fosh4eEufyO97Q== + dependencies: + "@rollup/pluginutils" "^4.1.1" + debug "^4.3.3" + es-module-lexer "^0.9.3" + joycon "^3.0.1" + jsonc-parser "^3.0.0" + +rollup-plugin-styles@^3.14.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/rollup-plugin-styles/-/rollup-plugin-styles-3.14.1.tgz#8a9d13885ac5c82f513099f567b94cff9379728c" + integrity sha512-0JodP26O3WZ8320X3sBn5S2SOPv9Al2tLyOmLco+H2UqLjbmycM9KWGypLjcDuIEWwa0oLYiXpViMmO2yyeqIA== + dependencies: + "@rollup/pluginutils" "^4.1.0" + "@types/cssnano" "^4.0.0" + cosmiconfig "^7.0.0" + cssnano "^4.1.10" + fs-extra "^9.1.0" + icss-utils "^5.1.0" + mime-types "^2.1.28" + p-queue "^6.6.2" + postcss "^8.2.4" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + query-string "^6.13.8" + resolve "^1.19.0" + source-map "^0.7.3" + tslib "^2.1.0" + +rollup@^2.48.0: + version "2.79.1" + resolved "https://registry.npmmirror.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.5: + version "7.8.0" + resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^5.2.0, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5, semver@^7.3.7: + version "7.3.8" + resolved "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmmirror.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + +serve-static@^1.13.1: + version "1.15.0" + resolved "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1, shell-quote@^1.7.3: + version "1.8.0" + resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socket.io-client@^4.6.1: + version "4.6.1" + resolved "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-4.6.1.tgz#80d97d5eb0feca448a0fb6d69a7b222d3d547eab" + integrity sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.4.0" + socket.io-parser "~4.2.1" + +socket.io-msgpack-parser@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/socket.io-msgpack-parser/-/socket.io-msgpack-parser-3.0.2.tgz#34c4d69acd0fa2a0eede98c14e29fa9f6a5b880a" + integrity sha512-1e76bJ1PCKi9H+JiYk+S29PBJvknHjQWM7Mtj0hjF2KxDA6b6rQxv3rTsnwBoz/haZOhlCDIMQvPATbqYeuMxg== + dependencies: + component-emitter "~1.3.0" + notepack.io "~2.2.0" + +socket.io-parser@~4.2.1: + version "4.2.2" + resolved "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" + integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.16, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-parser@^0.1.3: + version "0.1.10" + resolved "https://registry.npmmirror.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + +string-hash-64@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/string-hash-64/-/string-hash-64-1.0.3.tgz#0deb56df58678640db5c479ccbbb597aaa0de322" + integrity sha512-D5OKWKvDhyVWWn2x5Y9b+37NUllks34q1dCDhk/vYcso9fmhs+Tl3KR/gE4v5UNj2UA35cnX4KdVVGkG1deKqw== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^5.0.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +sudo-prompt@^9.0.0: + version "9.2.1" + resolved "https://registry.npmmirror.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-arc-to-cubic-bezier@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" + integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.npmmirror.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +tailchat-client-sdk@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/tailchat-client-sdk/-/tailchat-client-sdk-1.0.0.tgz#930b2d6907fd7aade35b6147f6e0bc28dfc82dd8" + integrity sha512-3Xwieb7xa01QusHh+0HLPBSDasTx86L6a0S4NjEyP0M1oqvnd2gs3goKTOAvZBIIjsFH5kI1UC4N7Dg3b0RloA== + dependencies: + axios "^1.3.2" + +temp@0.8.3: + version "0.8.3" + resolved "https://registry.npmmirror.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.npmmirror.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +terser@^5.15.0: + version "5.16.3" + resolved "https://registry.npmmirror.com/terser/-/terser-5.16.3.tgz#3266017a9b682edfe019b8ecddd2abaae7b39c6b" + integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +test-value@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" + integrity sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w== + dependencies: + array-back "^1.0.3" + typical "^2.6.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A== + +tinycolor2@^1.4.2: + version "1.6.0" + resolved "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== + +tlds@^1.203.0: + version "1.236.0" + resolved "https://registry.npmmirror.com/tlds/-/tlds-1.236.0.tgz#a118eebe33261c577e3a3025144faeabb7dd813c" + integrity sha512-oP2PZ3KeGlgpHgsEfrtva3/K9kzsJUNliQSbCfrJ7JMCWFoCdtG+9YMq/g2AnADQ1v5tVlbtvKJZ4KLpy/P6MA== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0: + version "2.5.0" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@4.8.4: + version "4.8.4" + resolved "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + +typical@^2.6.0: + version "2.6.1" + resolved "https://registry.npmmirror.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" + integrity sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg== + +uglify-es@^3.1.9: + version "3.3.9" + resolved "https://registry.npmmirror.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + 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" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-parse@^1.2.0: + version "1.5.10" + resolved "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" + integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== + dependencies: + ip-regex "^4.1.0" + tlds "^1.203.0" + +use-memo-one@^1.1.1: + version "1.1.3" + resolved "https://registry.npmmirror.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" + integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== + +use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.npmmirror.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + +walker@^1.0.7, walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-fetch@^3.0.0: + version "3.6.2" + resolved "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + 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" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wnpm-ci@*, wnpm-ci@^8.0.131: + version "8.0.131" + resolved "https://registry.npmmirror.com/wnpm-ci/-/wnpm-ci-8.0.131.tgz#06455f58ba13b6b52942091d49672cfdc265140b" + integrity sha512-mC+8NQOleSlx7KPj939eRXNkXzOOPL6R62nX/fb+6TbFd2TXXTdriPQxW9HlpjJ3bnp8nsaezBRlJovJwWSNPg== + dependencies: + execa "^2.0.3" + fs-extra "^8.1.0" + mkdirp "^0.5.1" + semver "^5.2.0" + tmp "^0.0.33" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^6.2.2: + version "6.2.2" + resolved "https://registry.npmmirror.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^7, ws@^7.5.1: + version "7.5.9" + resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.npmmirror.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^15.1.0: + version "15.4.1" + resolved "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1, yargs@^17.5.1: + version "17.6.2" + resolved "https://registry.npmmirror.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zustand@^4.3.2: + version "4.3.2" + resolved "https://registry.npmmirror.com/zustand/-/zustand-4.3.2.tgz#bb121fcad84c5a569e94bd1a2695e1a93ba85d39" + integrity sha512-rd4haDmlwMTVWVqwvgy00ny8rtti/klRoZjFbL/MAcDnmD5qSw/RZc+Vddstdv90M5Lv6RPgWvm1Hivyn0QgJw== + dependencies: + use-sync-external-store "1.2.0" diff --git a/client/package.json b/client/package.json new file mode 100644 index 00000000000..ceaec48d6cd --- /dev/null +++ b/client/package.json @@ -0,0 +1,47 @@ +{ + "name": "tailchat", + "version": "1.0.0", + "main": "index.js", + "workspaces": [ + "web", + "shared" + ], + "repository": "https://github.com/msgbyte/tailchat.git", + "author": "moonrailgun ", + "license": "Apache-2.0", + "private": true, + "scripts": { + "translation": "node build/script/scanTranslation.js", + "test": "cd web && pnpm test" + }, + "pnpm": { + "peerDependencyRules": { + "ignoreMissing": [ + "acorn", + "acorn-dynamic-import" + ] + } + }, + "devDependencies": { + "@commitlint/cli": "^12.1.4", + "@commitlint/config-conventional": "^12.1.4", + "@types/fs-extra": "^9.0.13", + "@types/jest": "^27.0.3", + "@types/node": "^15.12.5", + "commitlint": "^12.1.4", + "dayjs": "^1.10.6", + "esbuild": "^0.12.25", + "fs-extra": "^10.0.0", + "gulp-sort": "^2.0.0", + "i18next-scanner": "^3.0.0", + "identity-obj-proxy": "^3.0.0", + "lint-staged": "^11.0.0", + "prettier": "^2.3.2", + "typescript": "^4.5.2", + "vinyl-fs": "^3.0.3" + }, + "dependencies": { + "crc": "^3.8.0", + "lodash": "^4.17.21" + } +} diff --git a/packages/design/.gitignore b/client/packages/design/.gitignore similarity index 100% rename from packages/design/.gitignore rename to client/packages/design/.gitignore diff --git a/packages/design/.storybook/main.js b/client/packages/design/.storybook/main.js similarity index 100% rename from packages/design/.storybook/main.js rename to client/packages/design/.storybook/main.js diff --git a/packages/design/.storybook/preview.js b/client/packages/design/.storybook/preview.js similarity index 100% rename from packages/design/.storybook/preview.js rename to client/packages/design/.storybook/preview.js diff --git a/packages/design/README.md b/client/packages/design/README.md similarity index 100% rename from packages/design/README.md rename to client/packages/design/README.md diff --git a/packages/design/components/AutoFolder/index.stories.tsx b/client/packages/design/components/AutoFolder/index.stories.tsx similarity index 100% rename from packages/design/components/AutoFolder/index.stories.tsx rename to client/packages/design/components/AutoFolder/index.stories.tsx diff --git a/client/packages/design/components/AutoFolder/index.tsx b/client/packages/design/components/AutoFolder/index.tsx new file mode 100644 index 00000000000..1c4fd899641 --- /dev/null +++ b/client/packages/design/components/AutoFolder/index.tsx @@ -0,0 +1,88 @@ +import React, { + PropsWithChildren, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { useMemoizedFn } from 'ahooks'; + +interface AutoFolderProps extends PropsWithChildren { + maxHeight: number; + showFullText?: React.ReactNode; + backgroundColor?: string; +} +export const AutoFolder: React.FC = React.memo((props) => { + const { showFullText = 'More', backgroundColor = 'white' } = props; + const [isShowFullBtn, setIsShowFullBtn] = useState(false); // 是否显示展示所有内容的按钮 + const [isShowFull, setIsShowFull] = useState(false); // 是否点击按钮展示所有 + const contentRef = useRef(null); + + useEffect(() => { + if (!contentRef.current) { + return; + } + + const observer = new window.ResizeObserver((entries) => { + if (entries[0]) { + const { height } = entries[0].contentRect; + + if (height > maxHeight) { + setIsShowFull(false); + setIsShowFullBtn(true); + + observer.disconnect(); // 触发一次则解除连接 + } + } + }); + observer.observe(contentRef.current); + + return () => { + observer.disconnect(); + }; + }, []); + + const maxHeight = useMemo(() => { + if (isShowFull) { + return 'none'; + } else { + return props.maxHeight; + } + }, [isShowFull, props.maxHeight]); + + const handleClickShowFullBtn = useMemoizedFn(() => { + setIsShowFullBtn(false); + setIsShowFull(true); + }); + + return ( +
+
{props.children}
+ + {isShowFullBtn && ( +
+ {showFullText} +
+ )} +
+ ); +}); +AutoFolder.displayName = 'AutoFolder'; diff --git a/packages/design/components/Avatar/combined.css b/client/packages/design/components/Avatar/combined.css similarity index 76% rename from packages/design/components/Avatar/combined.css rename to client/packages/design/components/Avatar/combined.css index 27eb82277e9..62995096ecd 100644 --- a/packages/design/components/Avatar/combined.css +++ b/client/packages/design/components/Avatar/combined.css @@ -3,7 +3,7 @@ overflow: hidden; } -.td-combined-avatar-2::after { +.td-combined-avatar-2 > .line1 { content: ''; position: absolute; height: 100%; @@ -11,10 +11,9 @@ background-color: white; left: 50%; top: 0; - z-index: 1; } -.td-combined-avatar-3::before { +.td-combined-avatar-3 > .line2 { content: ''; position: absolute; width: 50%; @@ -22,10 +21,9 @@ background-color: white; right: 0; top: 50%; - z-index: 1; } -.td-combined-avatar-3::after { +.td-combined-avatar-3 > .line1 { content: ''; position: absolute; height: 100%; @@ -33,10 +31,9 @@ background-color: white; left: 50%; top: 0; - z-index: 1; } -.td-combined-avatar-4::before { +.td-combined-avatar-4 > .line2 { content: ''; position: absolute; width: 100%; @@ -44,10 +41,9 @@ background-color: white; left: 0; top: 50%; - z-index: 1; } -.td-combined-avatar-4::after { +.td-combined-avatar-4 > .line1 { content: ''; position: absolute; height: 100%; @@ -55,7 +51,6 @@ background-color: white; left: 50%; top: 0; - z-index: 1; } .td-combined-avatar__item { diff --git a/packages/design/components/Avatar/combined.tsx b/client/packages/design/components/Avatar/combined.tsx similarity index 91% rename from packages/design/components/Avatar/combined.tsx rename to client/packages/design/components/Avatar/combined.tsx index 1ae5e52bbd1..4f248c3f86f 100644 --- a/packages/design/components/Avatar/combined.tsx +++ b/client/packages/design/components/Avatar/combined.tsx @@ -1,6 +1,7 @@ import { Avatar, AvatarProps } from '.'; import React from 'react'; import _take from 'lodash/take'; +import { px2rem } from './utils'; import './combined.css'; interface CombinedAvatarProps { @@ -81,8 +82,8 @@ export const CombinedAvatar: React.FC = React.memo(
@@ -95,6 +96,9 @@ export const CombinedAvatar: React.FC = React.memo( {...item} /> ))} + + {items.length >= 2 &&
} + {items.length >= 3 &&
}
); } diff --git a/packages/design/components/Avatar/index.stories.tsx b/client/packages/design/components/Avatar/index.stories.tsx similarity index 100% rename from packages/design/components/Avatar/index.stories.tsx rename to client/packages/design/components/Avatar/index.stories.tsx diff --git a/client/packages/design/components/Avatar/index.tsx b/client/packages/design/components/Avatar/index.tsx new file mode 100644 index 00000000000..7265cc33bf3 --- /dev/null +++ b/client/packages/design/components/Avatar/index.tsx @@ -0,0 +1,106 @@ +import React, { ForwardRefExoticComponent, useMemo } from 'react'; +import { Avatar as AntdAvatar, Badge } from 'antd'; +import _head from 'lodash/head'; +import _upperCase from 'lodash/upperCase'; +import _isNil from 'lodash/isNil'; +import _isEmpty from 'lodash/isEmpty'; +import _isNumber from 'lodash/isNumber'; +import _omit from 'lodash/omit'; +import type { AvatarProps as AntdAvatarProps } from 'antd/lib/avatar'; +import { getTextColorHex, px2rem } from './utils'; +import { isValidStr } from '../utils'; +import { imageUrlParser } from '../Image'; + +export { getTextColorHex }; + +export interface AvatarProps extends AntdAvatarProps { + name?: string; + isOnline?: boolean; +} + +const _Avatar: React.FC = React.memo((_props) => { + const { isOnline, ...props } = _props; + const src = isValidStr(props.src) ? imageUrlParser(props.src) : undefined; + + const name = useMemo(() => _upperCase(_head(props.name)), [props.name]); + + const color = useMemo( + () => + // 如果src为空 且 icon为空 则给个固定颜色 + _isEmpty(src) && _isNil(props.icon) + ? getTextColorHex(props.name) + : undefined, + [src, props.icon, props.name] + ); + + const style = useMemo(() => { + const _style: React.CSSProperties = { + userSelect: 'none', + ...props.style, + backgroundColor: color, + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + }; + + if (_isNumber(props.size)) { + // 为了支持rem统一管理宽度,将size转换为样式宽度(size类型上不支持rem单位) + if (!_style.width) { + _style.width = px2rem(props.size); + } + if (!_style.height) { + _style.height = px2rem(props.size); + } + + if (typeof _style.fontSize === 'undefined') { + // 如果props.size是数字且没有指定文字大小 + // 则自动增加fontSize大小 + _style.fontSize = px2rem(props.size * 0.4); + } + } + + return _style; + }, [props.style, props.size, color]); + + const inner = ( + + {name} + + ); + + if (typeof isOnline === 'boolean') { + const style = { + bottom: 0, + top: 'auto', + }; + + if (isOnline === true) { + return ( + + {inner} + + ); + } else { + return ( + + {inner} + + ); + } + } + + return inner; +}); +_Avatar.displayName = 'Avatar'; + +type CompoundedComponent = ForwardRefExoticComponent & { + Group: typeof AntdAvatar.Group; +}; + +export const Avatar: CompoundedComponent = _Avatar as any; +Avatar.Group = AntdAvatar.Group; diff --git a/client/packages/design/components/Avatar/utils.ts b/client/packages/design/components/Avatar/utils.ts new file mode 100644 index 00000000000..698f8dfbcff --- /dev/null +++ b/client/packages/design/components/Avatar/utils.ts @@ -0,0 +1,41 @@ +import _isString from 'lodash/isString'; +import str2int from 'str2int'; + +const colors = [ + '#333333', + '#2c3e50', + '#8e44ad', + '#2980b9', + '#27ae60', + '#16a085', + '#f39c12', + '#d35400', + '#c0392b', + '#3498db', + '#9b59b6', + '#2ecc71', + '#1abc9c', + '#f1c40f', + '#e74c3c', + '#e67e22', +]; + +/** + * 根据文本内容返回一个内置色卡的颜色 + * @param text 文本 + */ +export function getTextColorHex(text: unknown): string { + if (!text || !_isString(text)) { + return '#ffffff'; // 如果获取不到文本,则返回白色 + } + + const id = str2int(text); + return colors[id % colors.length]; +} + +/** + * 将像素转换为rem单位 + */ +export function px2rem(size: number): string { + return size * (1 / 16) + 'rem'; +} diff --git a/packages/design/components/AvatarWithPreview/index.stories.tsx b/client/packages/design/components/AvatarWithPreview/index.stories.tsx similarity index 100% rename from packages/design/components/AvatarWithPreview/index.stories.tsx rename to client/packages/design/components/AvatarWithPreview/index.stories.tsx diff --git a/client/packages/design/components/AvatarWithPreview/index.tsx b/client/packages/design/components/AvatarWithPreview/index.tsx new file mode 100644 index 00000000000..1db0af793e8 --- /dev/null +++ b/client/packages/design/components/AvatarWithPreview/index.tsx @@ -0,0 +1,42 @@ +import React, { useState } from 'react'; +import { Avatar, AvatarProps } from '../Avatar'; +import { Image, imageUrlParser } from '../Image'; +import { isValidStr } from '../utils'; + +export const AvatarWithPreview: React.FC = React.memo((props) => { + const [visible, setVisible] = useState(false); + + const hasImage = isValidStr(props.src); + + return ( + <> +
setVisible(!visible)} + > + +
+ + {hasImage && ( +
+ { + setVisible(value); + }, + }} + /> +
+ )} + + ); +}); +AvatarWithPreview.displayName = 'AvatarWithPreview'; diff --git a/client/packages/design/components/CopyableText/index.stories.tsx b/client/packages/design/components/CopyableText/index.stories.tsx new file mode 100644 index 00000000000..266106abde8 --- /dev/null +++ b/client/packages/design/components/CopyableText/index.stories.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import type { ComponentStory, ComponentMeta } from '@storybook/react'; +import { CopyableText } from '.'; + +export default { + title: 'Tailchat/CopyableText', + component: CopyableText, + argTypes: { + config: { + description: '见: https://ant.design/components/typography-cn#copyable', + defaultValue: true, + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( +
+ 可复制文本: + <- 点击此处复制 +
+); + +export const Default = Template.bind({}); +Default.args = { + children: 'Foo', +}; + +export const WithConfig = Template.bind({}); +WithConfig.args = { + children: 'Foo', + config: { + text: 'Bar', + }, +}; diff --git a/client/packages/design/components/CopyableText/index.tsx b/client/packages/design/components/CopyableText/index.tsx new file mode 100644 index 00000000000..ba500159608 --- /dev/null +++ b/client/packages/design/components/CopyableText/index.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { Typography } from 'antd'; +import type { BlockProps } from 'antd/lib/typography/Base'; + +interface CopyableTextProps extends React.PropsWithChildren { + className?: string; + style?: React.CSSProperties; + config?: BlockProps['copyable']; +} + +/** + * 可复制的文本 + */ +export const CopyableText: React.FC = React.memo((props) => { + return ( + + {props.children} + + ); +}); +CopyableText.displayName = 'CopyableText'; diff --git a/packages/design/components/DelayTip/index.stories.tsx b/client/packages/design/components/DelayTip/index.stories.tsx similarity index 100% rename from packages/design/components/DelayTip/index.stories.tsx rename to client/packages/design/components/DelayTip/index.stories.tsx diff --git a/packages/design/components/DelayTip/index.tsx b/client/packages/design/components/DelayTip/index.tsx similarity index 100% rename from packages/design/components/DelayTip/index.tsx rename to client/packages/design/components/DelayTip/index.tsx diff --git a/packages/design/components/Highlight/index.module.less b/client/packages/design/components/Highlight/index.module.less similarity index 100% rename from packages/design/components/Highlight/index.module.less rename to client/packages/design/components/Highlight/index.module.less diff --git a/client/packages/design/components/Highlight/index.tsx b/client/packages/design/components/Highlight/index.tsx new file mode 100644 index 00000000000..64e62f3e9bf --- /dev/null +++ b/client/packages/design/components/Highlight/index.tsx @@ -0,0 +1,7 @@ +import React, { PropsWithChildren } from 'react'; +import styles from './index.module.less'; + +export const Highlight: React.FC = React.memo((props) => { + return {props.children}; +}); +Highlight.displayName = 'Highlight'; diff --git a/client/packages/design/components/Icon/index.tsx b/client/packages/design/components/Icon/index.tsx new file mode 100644 index 00000000000..a056ff0439a --- /dev/null +++ b/client/packages/design/components/Icon/index.tsx @@ -0,0 +1,31 @@ +import React, { useState } from 'react'; +import { + Icon as Iconify, + IconProps, + addIcon, + addCollection, +} from '@iconify/react'; + +const placeHolderStyle = { width: '1em', height: '1em' }; + +const InternalIcon: React.FC> = React.memo((props) => { + const [loaded, setLoaded] = useState(false); + + return ( + <> + setLoaded(true)} /> + {!loaded && } + + ); +}); +InternalIcon.displayName = 'Icon'; + +type CompoundedComponent = React.FC> & { + addIcon: typeof addIcon; + addCollection: typeof addCollection; +}; + +export const Icon = InternalIcon as CompoundedComponent; + +Icon.addIcon = addIcon; +Icon.addCollection = addCollection; diff --git a/packages/design/components/Image/index.stories.tsx b/client/packages/design/components/Image/index.stories.tsx similarity index 100% rename from packages/design/components/Image/index.stories.tsx rename to client/packages/design/components/Image/index.stories.tsx diff --git a/client/packages/design/components/Image/index.tsx b/client/packages/design/components/Image/index.tsx new file mode 100644 index 00000000000..d005996a8b2 --- /dev/null +++ b/client/packages/design/components/Image/index.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { Image as AntdImage, ImageProps as AntdImageProps } from 'antd'; + +export let imageUrlParser = (url: string) => url; + +const fallback = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg=='; + +export const Image: React.FC = React.memo((props) => { + return ( + + ); +}); +Image.displayName = 'Image'; + +export function setImageUrlParser(parser: (url: string) => string): void { + imageUrlParser = parser; +} diff --git a/packages/design/components/Introduction.stories.mdx b/client/packages/design/components/Introduction.stories.mdx similarity index 100% rename from packages/design/components/Introduction.stories.mdx rename to client/packages/design/components/Introduction.stories.mdx diff --git a/client/packages/design/components/RichEditor/bbcode.ts b/client/packages/design/components/RichEditor/bbcode.ts new file mode 100644 index 00000000000..0d0072cba60 --- /dev/null +++ b/client/packages/design/components/RichEditor/bbcode.ts @@ -0,0 +1,51 @@ +import { isArray, ObjectMark, RemirrorJSON } from 'remirror'; + +/** + * 转换成BBCode + */ +export function transformToBBCode(json: RemirrorJSON): string { + if (json.type === 'doc') { + return (json.content ?? []).map(transformToBBCode).join('\n'); + } + + if (json.type === 'paragraph') { + return (json.content ?? []).map(transformToBBCode).join(''); + } + + if (json.type === 'text') { + let text = json.text ?? ''; + + if (isArray(json.marks)) { + (json.marks ?? []).forEach((mark) => { + if (typeof mark === 'string') { + mark = { type: mark }; + } + text = applyMarks(mark, text); + }); + } + + return text; + } + + return ''; +} + +/** + * 为text增加mark包裹 + */ +function applyMarks(mark: ObjectMark, text: string): string { + if (mark.type === 'bold') { + return `[b]${text}[/b]`; + } + if (mark.type === 'underline') { + return `[u]${text}[/u]`; + } + if (mark.type === 'italic') { + return `[i]${text}[/i]`; + } + if (mark.type === 'code') { + return `[code]${text}[/code]`; + } + + return text; +} diff --git a/client/packages/design/components/RichEditor/editor.css b/client/packages/design/components/RichEditor/editor.css new file mode 100644 index 00000000000..3c2b12964d9 --- /dev/null +++ b/client/packages/design/components/RichEditor/editor.css @@ -0,0 +1,12 @@ +.remirror-editor-wrapper { + height: 100%; +} + +.tailchat-rich-editor { + height: 100%; + outline: 0; +} + +.tailchat-rich-editor p { + margin: 0; +} diff --git a/client/packages/design/components/RichEditor/editor.tsx b/client/packages/design/components/RichEditor/editor.tsx new file mode 100644 index 00000000000..f26131563f1 --- /dev/null +++ b/client/packages/design/components/RichEditor/editor.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { + Remirror, + useRemirror, + OnChangeJSON, + EditorComponent, +} from '@remirror/react'; +import { useMemoizedFn } from 'ahooks'; +import type { RemirrorJSON } from 'remirror'; +import { Toolbar } from './toolbar'; +import { extensions } from './extensions'; +import { transformToBBCode } from './bbcode'; +import './editor.css'; + +interface RichEditorProps extends React.PropsWithChildren { + initContent: string; + onChange: (bbcode: string) => void; +} +export const RichEditor: React.FC = React.memo((props) => { + const { manager, state } = useRemirror({ + extensions, + content: props.initContent, + stringHandler: 'html', + selection: 'end', + }); + + const handleChange = useMemoizedFn((json: RemirrorJSON) => { + props.onChange(transformToBBCode(json)); + }); + + return ( + + + + + {props.children} + + ); +}); +RichEditor.displayName = 'RichEditor'; diff --git a/client/packages/design/components/RichEditor/extensions/index.ts b/client/packages/design/components/RichEditor/extensions/index.ts new file mode 100644 index 00000000000..a5fca5261d4 --- /dev/null +++ b/client/packages/design/components/RichEditor/extensions/index.ts @@ -0,0 +1,16 @@ +import { + BoldExtension, + CodeExtension, + ItalicExtension, + UnderlineExtension, +} from 'remirror/extensions'; + +/** + * 富文本编辑器使用的拓展 + */ +export const extensions = () => [ + new BoldExtension(), + new ItalicExtension(), + new UnderlineExtension(), + new CodeExtension(), +]; diff --git a/client/packages/design/components/RichEditor/index.stories.tsx b/client/packages/design/components/RichEditor/index.stories.tsx new file mode 100644 index 00000000000..21f3d73dabf --- /dev/null +++ b/client/packages/design/components/RichEditor/index.stories.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { RichEditor } from './editor'; + +// More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export +export default { + title: 'Tailchat/RichEditor', + component: RichEditor, + // More on argTypes: https://storybook.js.org/docs/react/api/argtypes + argTypes: {}, +} as ComponentMeta; + +// More on component templates: https://storybook.js.org/docs/react/writing-stories/introduction#using-args +const Template: ComponentStory = (args) => ( +
+ +
+); + +export const Default = Template.bind({}); +// More on args: https://storybook.js.org/docs/react/writing-stories/args +Default.args = { + initContent: '

Hi Friend

', +}; diff --git a/client/packages/design/components/RichEditor/index.tsx b/client/packages/design/components/RichEditor/index.tsx new file mode 100644 index 00000000000..c09b3e98ce9 --- /dev/null +++ b/client/packages/design/components/RichEditor/index.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +/** + * 富文本编辑器 + */ + +export const RichEditor = React.lazy(() => + import('./editor').then((module) => ({ default: module.RichEditor })) +); diff --git a/client/packages/design/components/RichEditor/toolbar.tsx b/client/packages/design/components/RichEditor/toolbar.tsx new file mode 100644 index 00000000000..17d5273f42e --- /dev/null +++ b/client/packages/design/components/RichEditor/toolbar.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { + FloatingToolbar, + CommandButtonGroup, + ToggleBoldButton, + ToggleItalicButton, + ToggleUnderlineButton, + ToggleCodeButton, +} from '@remirror/react'; + +/** + * 菜单 + */ +export const Toolbar: React.FC = React.memo(() => { + return ( + + + + + + + + + ); +}); +Toolbar.displayName = 'Toolbar'; diff --git a/client/packages/design/components/SensitiveText/index.stories.tsx b/client/packages/design/components/SensitiveText/index.stories.tsx new file mode 100644 index 00000000000..7101bdf6a7c --- /dev/null +++ b/client/packages/design/components/SensitiveText/index.stories.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { SensitiveText } from '.'; + +// More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export +export default { + title: 'Tailchat/SensitiveText', + component: SensitiveText, + // More on argTypes: https://storybook.js.org/docs/react/api/argtypes + argTypes: {}, +} as ComponentMeta; + +// More on component templates: https://storybook.js.org/docs/react/writing-stories/introduction#using-args +const Template: ComponentStory = (args) => ( + +); + +export const Default = Template.bind({}); +// More on args: https://storybook.js.org/docs/react/writing-stories/args +Default.args = { + text: 'fooooo', +}; diff --git a/client/packages/design/components/SensitiveText/index.tsx b/client/packages/design/components/SensitiveText/index.tsx new file mode 100644 index 00000000000..dc5f47e76ac --- /dev/null +++ b/client/packages/design/components/SensitiveText/index.tsx @@ -0,0 +1,40 @@ +import React, { useState } from 'react'; +import { Icon } from '../Icon'; + +interface SensitiveTextProps { + className?: string; + text: string; +} +export const SensitiveText: React.FC = React.memo( + (props) => { + const { className, text } = props; + const [show, setShow] = useState(false); + + return ( +
+ {show ? text : getMaskedText(text)} + + setShow((before) => !before)} + /> +
+ ); + } +); +SensitiveText.displayName = 'SensitiveText'; + +function getMaskedText(text: string) { + const len = text.length; + if (len > 2) { + return `${text[0]}****${text[len - 1]}`; + } else if (len === 2) { + return `${text[0]}*`; + } else { + return '**'; + } +} diff --git a/client/packages/design/components/VirtualChatList/README.md b/client/packages/design/components/VirtualChatList/README.md new file mode 100644 index 00000000000..b72d20ebfae --- /dev/null +++ b/client/packages/design/components/VirtualChatList/README.md @@ -0,0 +1,5 @@ +WIP: Warning + +可变高度的虚拟列表 + +专为聊天场景打造的 diff --git a/client/packages/design/components/VirtualChatList/ResizeWatcher.tsx b/client/packages/design/components/VirtualChatList/ResizeWatcher.tsx new file mode 100644 index 00000000000..d7a4db11a8e --- /dev/null +++ b/client/packages/design/components/VirtualChatList/ResizeWatcher.tsx @@ -0,0 +1,61 @@ +import React, { useEffect, useRef } from 'react'; +import { useMemoizedFn } from 'ahooks'; + +type Size = { height: number; width: number }; + +interface ResizeWatcherProps extends React.PropsWithChildren { + wrapperStyle?: React.CSSProperties; + onResize?: (size: Size) => void; +} + +/** + * 当容器大小发生变化时 + * 触发回调 + */ +export const ResizeWatcher: React.FC = React.memo( + (props) => { + const rootRef = useRef(null); + + const handleResize = useMemoizedFn((size: Size) => { + if (props.onResize) { + props.onResize(size); + } + }); + + useEffect(() => { + if (!rootRef.current) { + return; + } + + const resizeObserver = new ResizeObserver((entries) => { + entries.forEach((entry) => { + const { target, contentRect } = entry; + if (!target.parentElement) { + return; + } + + // 使用 contentRect 计算大小以确保不会出现使用clientHeight立即向浏览器请求dom大小导致的性能问题 + handleResize({ + width: Math.round(contentRect.width), + height: Math.round(contentRect.height), + }); + }); + }); + resizeObserver.observe(rootRef.current); + + return () => { + if (resizeObserver && rootRef.current) { + resizeObserver.unobserve(rootRef.current); + resizeObserver.disconnect(); + } + }; + }, []); + + return ( +
+ {props.children} +
+ ); + } +); +ResizeWatcher.displayName = 'ResizeWatcher'; diff --git a/client/packages/design/components/VirtualChatList/Scroller.tsx b/client/packages/design/components/VirtualChatList/Scroller.tsx new file mode 100644 index 00000000000..aa16d931f04 --- /dev/null +++ b/client/packages/design/components/VirtualChatList/Scroller.tsx @@ -0,0 +1,190 @@ +import React, { + PropsWithChildren, + useImperativeHandle, + useMemo, + useRef, + useState, +} from 'react'; +import { ResizeWatcher } from './ResizeWatcher'; +import { useMemoizedFn, useDebounceFn, usePrevious } from 'ahooks'; +import type { IsForward, Vector } from './types'; +import clsx from 'clsx'; + +export interface ScrollerRef { + scrollTo: (position: Vector) => void; + scrollToBottom: () => void; +} + +type ScrollerProps = PropsWithChildren<{ + className?: string; + style?: React.CSSProperties; + innerStyle?: React.CSSProperties; + isLock?: boolean; + scrollingClassName?: string; + scrollBehavior?: ScrollBehavior; + onScroll?: ( + position: Vector, + detail: { + forward: IsForward; + isUserScrolling: boolean; + isMouseDown: boolean; + } + ) => void; + onScrollEnd?: (position: Vector) => void; + onContainerResize?: (info: { + containerSize: Vector; + position: Vector; + }) => void; +}>; + +const DEFAULT_POS = { x: 0, y: 0 }; + +/** + * 滚动状态管理组件 + */ +export const Scroller = React.forwardRef( + (props, ref) => { + const { scrollBehavior = 'auto' } = props; + const wrapperRef = useRef(null); + const innerRef = useRef(null); + const style = useMemo(() => { + if (props.isLock ?? false) { + return { ...props.style, overflow: 'hidden' }; + } + + return { ...props.style, overflow: 'auto' }; + }, [props.isLock]); + + const getPosition = useMemoizedFn(() => { + if (!wrapperRef.current) { + return DEFAULT_POS; + } + return { + x: wrapperRef.current.scrollLeft, + y: wrapperRef.current.scrollTop, + }; + }); + + const getContainerSize = useMemoizedFn(() => { + if (!wrapperRef.current) { + return DEFAULT_POS; + } + return { + x: wrapperRef.current.clientWidth, + y: wrapperRef.current.clientHeight, + }; + }); + + useImperativeHandle(ref, () => ({ + scrollTo: (position) => { + wrapperRef.current?.scrollTo({ + left: position.x, + top: position.y, + behavior: scrollBehavior, + }); + }, + scrollToBottom: () => { + wrapperRef.current?.scrollTo({ + left: getPosition().x, + top: wrapperRef.current.scrollHeight - getContainerSize().y, + behavior: scrollBehavior, + }); + }, + })); + + const [isScroll, setIsScroll] = useState(false); + const [isMouseDown, setIsMouseDown] = useState(false); + const { run: setIsScrollLazy } = useDebounceFn( + (val) => { + setIsScroll(val); + }, + { + leading: false, + trailing: true, + wait: 300, + } + ); + + const { run: handleEndScrollLazy } = useDebounceFn( + () => { + setIsScroll(false); + if (props.onScrollEnd) { + props.onScrollEnd(getPosition()); + } + }, + { + leading: false, + trailing: true, + wait: 300, + } + ); + + const handleWheel = useMemoizedFn(() => { + setIsScroll(true); + setIsScrollLazy(false); + }); + + const handleMouseDown = useMemoizedFn(() => { + setIsMouseDown(true); + }); + + const handleMouseUp = useMemoizedFn(() => { + setIsMouseDown(false); + }); + + const prevPosition = usePrevious(getPosition()) ?? DEFAULT_POS; + const handleScroll = useMemoizedFn(() => { + const isUserScrolling = isScroll || isMouseDown; + const currentPosition = getPosition(); + const forward = { + x: currentPosition.x > prevPosition.x, + y: currentPosition.y > prevPosition.y, + }; + setIsScroll(true); + handleEndScrollLazy(); + if (props.onScroll) { + props.onScroll(currentPosition, { + forward, + isUserScrolling, + isMouseDown: isMouseDown, + }); + } + }); + + const handleResize = useMemoizedFn(() => { + if (props.onContainerResize) { + props.onContainerResize({ + containerSize: getContainerSize(), + position: getPosition(), + }); + } + }); + + return ( + +
+
+ {props.children} +
+
+
+ ); + } +); +Scroller.displayName = 'Scroller'; diff --git a/client/packages/design/components/VirtualChatList/index.stories.tsx b/client/packages/design/components/VirtualChatList/index.stories.tsx new file mode 100644 index 00000000000..b9dfdef0d9a --- /dev/null +++ b/client/packages/design/components/VirtualChatList/index.stories.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { ComponentStory, ComponentMeta } from '@storybook/react'; +import { VirtualChatList } from '.'; + +// More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export +export default { + title: 'Tailchat/VirtualChatList', + component: VirtualChatList, + // More on argTypes: https://storybook.js.org/docs/react/api/argtypes + argTypes: {}, +} as ComponentMeta; + +// More on component templates: https://storybook.js.org/docs/react/writing-stories/introduction#using-args +const Template: ComponentStory = (args) => ( + +); + +export const Default = Template.bind({}); +// More on args: https://storybook.js.org/docs/react/writing-stories/args +Default.args = { + text: 'fooooo', +}; diff --git a/client/packages/design/components/VirtualChatList/index.tsx b/client/packages/design/components/VirtualChatList/index.tsx new file mode 100644 index 00000000000..b15ce4577d8 --- /dev/null +++ b/client/packages/design/components/VirtualChatList/index.tsx @@ -0,0 +1,82 @@ +import React, { useEffect, useMemo, useRef } from 'react'; +import { ResizeWatcher } from './ResizeWatcher'; +import { Scroller, ScrollerRef } from './Scroller'; +import { useUpdate } from 'ahooks'; + +interface VirtualChatListProps { + className?: string; + style?: React.CSSProperties; + innerStyle?: React.CSSProperties; + getItemKey?: (item: ItemType) => string; + items: ItemType[]; + itemContent: (item: ItemType, index: number) => React.ReactNode; +} + +const defaultContainerStyle: React.CSSProperties = { + overflow: 'hidden', +}; + +const defaultInnerStyle: React.CSSProperties = { + height: '100%', +}; + +const scrollerStyle: React.CSSProperties = { + height: '100%', +}; + +const InternalVirtualChatList = ( + props: VirtualChatListProps +) => { + const scrollerRef = useRef(null); + const itemHeightCache = useMemo(() => new Map(), []); + const forceUpdate = useUpdate(); + const style = useMemo( + () => ({ + ...defaultContainerStyle, + ...props.style, + }), + [props.style] + ); + const innerStyle = useMemo( + () => ({ + ...defaultInnerStyle, + ...props.innerStyle, + }), + [props.innerStyle] + ); + + useEffect(() => { + // 挂载后滚动到底部 + scrollerRef.current?.scrollToBottom(); + }, []); + + return ( +
+ + {props.items.map((item, i) => ( +
+ { + itemHeightCache.set(item, size.height); + forceUpdate(); + }} + > + {props.itemContent(item, i)} + +
+ ))} +
+
+ ); +}; + +type VirtualChatListInterface = typeof InternalVirtualChatList & React.FC; + +export const VirtualChatList: VirtualChatListInterface = React.memo( + InternalVirtualChatList +) as any; +VirtualChatList.displayName = 'VirtualChatList'; diff --git a/client/packages/design/components/VirtualChatList/types.ts b/client/packages/design/components/VirtualChatList/types.ts new file mode 100644 index 00000000000..36a6884cab0 --- /dev/null +++ b/client/packages/design/components/VirtualChatList/types.ts @@ -0,0 +1,9 @@ +export interface Vector { + x: number; + y: number; +} + +export interface IsForward { + x: boolean; + y: boolean; +} diff --git a/packages/design/components/WebMetaForm/__tests__/utils.spec.ts b/client/packages/design/components/WebMetaForm/__tests__/utils.spec.ts similarity index 100% rename from packages/design/components/WebMetaForm/__tests__/utils.spec.ts rename to client/packages/design/components/WebMetaForm/__tests__/utils.spec.ts diff --git a/client/packages/design/components/WebMetaForm/index.tsx b/client/packages/design/components/WebMetaForm/index.tsx new file mode 100644 index 00000000000..6d4e562872e --- /dev/null +++ b/client/packages/design/components/WebMetaForm/index.tsx @@ -0,0 +1,87 @@ +import React, { useMemo } from 'react'; +import { + FastifyForm, + regField, + FastifyFormContainerComponent, + regFormContainer, +} from 'react-fastify-form'; +import { Form, Button } from 'antd'; + +import { FastifyFormText } from './types/Text'; +import { FastifyFormTextArea } from './types/TextArea'; +import { FastifyFormPassword } from './types/Password'; +import { FastifyFormSelect } from './types/Select'; +import { FastifyFormCheckbox } from './types/Checkbox'; +import { FastifyFormCustom } from './types/Custom'; + +regField('text', FastifyFormText); +regField('textarea', FastifyFormTextArea); +regField('password', FastifyFormPassword); +regField('select', FastifyFormSelect); +regField('checkbox', FastifyFormCheckbox); +regField('custom', FastifyFormCustom); + +let webFastifyFormConfig = { + submitLabel: 'Submit', +}; + +export function setWebFastifyFormConfig(config: typeof webFastifyFormConfig) { + webFastifyFormConfig = { + ...webFastifyFormConfig, + ...config, + }; +} + +const WebFastifyFormContainer: FastifyFormContainerComponent = React.memo( + (props) => { + const layout = props.layout; + const suffixElement = props.extraProps?.suffixElement; + + const submitButtonRender = useMemo(() => { + return ( + + + + ); + }, [ + props.loading, + props.handleSubmit, + props.canSubmit, + props.submitLabel, + layout, + ]); + + return ( +
+ {props.children} + {suffixElement} + {submitButtonRender} +
+ ); + } +); +WebFastifyFormContainer.displayName = 'WebFastifyFormContainer'; +regFormContainer(WebFastifyFormContainer); + +export const WebMetaForm = FastifyForm; +(WebMetaForm as any).displayName = 'WebMetaForm'; diff --git a/client/packages/design/components/WebMetaForm/types/Checkbox.tsx b/client/packages/design/components/WebMetaForm/types/Checkbox.tsx new file mode 100644 index 00000000000..ba7501f39a8 --- /dev/null +++ b/client/packages/design/components/WebMetaForm/types/Checkbox.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Form, Checkbox } from 'antd'; +import type { FastifyFormFieldComponent } from 'react-fastify-form'; +import { getValidateStatus } from '../utils'; + +export const FastifyFormCheckbox: FastifyFormFieldComponent = React.memo( + (props) => { + const { name, label, value, onChange, error } = props; + + return ( + + onChange(e.target.checked)} + > + {label} + + + ); + } +); +FastifyFormCheckbox.displayName = 'FastifyFormCheckbox'; diff --git a/client/packages/design/components/WebMetaForm/types/Custom.tsx b/client/packages/design/components/WebMetaForm/types/Custom.tsx new file mode 100644 index 00000000000..e724f67d313 --- /dev/null +++ b/client/packages/design/components/WebMetaForm/types/Custom.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Form } from 'antd'; +import type { + FastifyFormFieldComponent, + FastifyFormFieldProps, +} from 'react-fastify-form'; +import { CustomField } from 'react-fastify-form'; + +export const FastifyFormCustom: FastifyFormFieldComponent<{ + render: (props: FastifyFormFieldProps) => React.ReactNode; +}> = React.memo((props) => { + const { label } = props; + + return ( + + + + ); +}); +FastifyFormCustom.displayName = 'FastifyFormCustom'; diff --git a/client/packages/design/components/WebMetaForm/types/Password.tsx b/client/packages/design/components/WebMetaForm/types/Password.tsx new file mode 100644 index 00000000000..a8a230e54d5 --- /dev/null +++ b/client/packages/design/components/WebMetaForm/types/Password.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { Input, Form } from 'antd'; +import type { FastifyFormFieldComponent } from 'react-fastify-form'; +import { getValidateStatus } from '../utils'; + +export const FastifyFormPassword: FastifyFormFieldComponent = React.memo( + (props) => { + const { + name, + label, + value, + onChange, + onBlur, + error, + maxLength, + placeholder, + } = props; + + return ( + + onChange(e.target.value)} + onBlur={onBlur} + /> + + ); + } +); +FastifyFormPassword.displayName = 'FastifyFormPassword'; diff --git a/client/packages/design/components/WebMetaForm/types/Select.tsx b/client/packages/design/components/WebMetaForm/types/Select.tsx new file mode 100644 index 00000000000..19bafb2952d --- /dev/null +++ b/client/packages/design/components/WebMetaForm/types/Select.tsx @@ -0,0 +1,43 @@ +import React, { useEffect } from 'react'; +import { Select, Form } from 'antd'; +import _get from 'lodash/get'; +import _isNil from 'lodash/isNil'; +import type { FastifyFormFieldComponent } from 'react-fastify-form'; + +const Option = Select.Option; + +interface FastifyFormSelectOptionsItem { + label: string; + value: string; +} + +export const FastifyFormSelect: FastifyFormFieldComponent<{ + options: FastifyFormSelectOptionsItem[]; +}> = React.memo((props) => { + const { name, label, value, onChange, onBlur, options } = props; + + useEffect(() => { + if (_isNil(value) || value === '') { + // 如果没有值的话则自动设置默认值 + onChange(_get(options, [0, 'value'])); + } + }, []); + + return ( + + + + ); +}); +FastifyFormSelect.displayName = 'FastifyFormSelect'; diff --git a/client/packages/design/components/WebMetaForm/types/Text.tsx b/client/packages/design/components/WebMetaForm/types/Text.tsx new file mode 100644 index 00000000000..6fc59fd7bb6 --- /dev/null +++ b/client/packages/design/components/WebMetaForm/types/Text.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { Input, Form } from 'antd'; +import type { FastifyFormFieldComponent } from 'react-fastify-form'; +import { getValidateStatus } from '../utils'; + +export const FastifyFormText: FastifyFormFieldComponent = React.memo( + (props) => { + const { + name, + label, + value, + onChange, + onBlur, + error, + maxLength, + placeholder, + } = props; + + return ( + + onChange(e.target.value)} + onBlur={onBlur} + /> + + ); + } +); +FastifyFormText.displayName = 'FastifyFormText'; diff --git a/client/packages/design/components/WebMetaForm/types/TextArea.tsx b/client/packages/design/components/WebMetaForm/types/TextArea.tsx new file mode 100644 index 00000000000..c852d0b3552 --- /dev/null +++ b/client/packages/design/components/WebMetaForm/types/TextArea.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { Input, Form } from 'antd'; +import type { FastifyFormFieldComponent } from 'react-fastify-form'; +import { getValidateStatus } from '../utils'; + +export const FastifyFormTextArea: FastifyFormFieldComponent = React.memo( + (props) => { + const { + name, + label, + value, + onChange, + onBlur, + error, + maxLength, + placeholder, + } = props; + + return ( + + onChange(e.target.value)} + onBlur={onBlur} + /> + + ); + } +); +FastifyFormTextArea.displayName = 'FastifyFormTextArea'; diff --git a/packages/design/components/WebMetaForm/utils.ts b/client/packages/design/components/WebMetaForm/utils.ts similarity index 100% rename from packages/design/components/WebMetaForm/utils.ts rename to client/packages/design/components/WebMetaForm/utils.ts diff --git a/client/packages/design/components/index.ts b/client/packages/design/components/index.ts new file mode 100644 index 00000000000..21baf90cf43 --- /dev/null +++ b/client/packages/design/components/index.ts @@ -0,0 +1,26 @@ +export { AutoFolder } from './AutoFolder'; +export { Avatar, getTextColorHex } from './Avatar'; +export { AvatarWithPreview } from './AvatarWithPreview'; +export { CopyableText } from './CopyableText'; +export { CombinedAvatar } from './Avatar/combined'; +export { DelayTip } from './DelayTip'; +export { Highlight } from './Highlight'; +export { Icon } from './Icon'; +export { Image, setImageUrlParser } from './Image'; +export { SensitiveText } from './SensitiveText'; +export { VirtualChatList } from './VirtualChatList'; + +export { + WebMetaForm, + setWebFastifyFormConfig as setWebMetaFormConfig, +} from './WebMetaForm'; +export { + createFastifyFormSchema as createMetaFormSchema, + fieldSchema as metaFormFieldSchema, + useFastifyFormContext as useMetaFormContext, + useFastifyFormContext, +} from 'react-fastify-form'; +export type { + FastifyFormFieldMeta as MetaFormFieldMeta, + FastifyFormFieldProps, +} from 'react-fastify-form'; diff --git a/packages/design/components/utils.ts b/client/packages/design/components/utils.ts similarity index 100% rename from packages/design/components/utils.ts rename to client/packages/design/components/utils.ts diff --git a/client/packages/design/package.json b/client/packages/design/package.json new file mode 100644 index 00000000000..c12ceccec9f --- /dev/null +++ b/client/packages/design/package.json @@ -0,0 +1,59 @@ +{ + "name": "tailchat-design", + "private": true, + "version": "1.0.0", + "description": "Tailchat frontend UI library", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "pnpm storybook", + "storybook": "start-storybook -p 6006", + "build-storybook": "build-storybook" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/msgbyte/tailchat.git" + }, + "keywords": [ + "design", + "tailchat" + ], + "author": "moonrailgun ", + "license": "MIT", + "bugs": { + "url": "https://github.com/msgbyte/tailchat/issues" + }, + "homepage": "https://github.com/msgbyte/tailchat#readme", + "dependencies": { + "@iconify/react": "^3.2.1", + "@remirror/pm": "^2.0.0", + "@remirror/react": "^2.0.9", + "ahooks": "^3.7.4", + "antd": "^4.24.13", + "clsx": "^1.1.1", + "lodash": "^4.17.21", + "react-fastify-form": "1.0.13", + "remirror": "^2.0.9", + "str2int": "^1.1.0" + }, + "devDependencies": { + "@babel/core": "^7.17.9", + "@storybook/addon-actions": "^6.4.22", + "@storybook/addon-essentials": "^6.4.22", + "@storybook/addon-interactions": "^6.4.22", + "@storybook/addon-links": "^6.4.22", + "@storybook/react": "^6.4.22", + "@storybook/testing-library": "^0.0.11", + "@types/lodash": "^4.14.170", + "@types/react": "18.0.20", + "@types/react-dom": "18.0.6", + "babel-loader": "^8.2.5", + "react": "18.2.0", + "react-dom": "18.2.0", + "typescript": "^4.5.2", + "webpack": "^5.72.0" + }, + "peerDependencies": { + "react": "18.2.0", + "react-dom": "18.2.0" + } +} diff --git a/client/packages/design/tsconfig.json b/client/packages/design/tsconfig.json new file mode 100644 index 00000000000..cd2160ccefa --- /dev/null +++ b/client/packages/design/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationDir": ".", + }, + "include": ["components/**/*"] +} diff --git a/packages/design/types/index.d.ts b/client/packages/design/types/index.d.ts similarity index 100% rename from packages/design/types/index.d.ts rename to client/packages/design/types/index.d.ts diff --git a/packages/meta-form/.gitignore b/client/packages/plugin-declaration-generator/.gitignore similarity index 100% rename from packages/meta-form/.gitignore rename to client/packages/plugin-declaration-generator/.gitignore diff --git a/packages/plugin-declaration-generator/README.md b/client/packages/plugin-declaration-generator/README.md similarity index 100% rename from packages/plugin-declaration-generator/README.md rename to client/packages/plugin-declaration-generator/README.md diff --git a/client/packages/plugin-declaration-generator/package.json b/client/packages/plugin-declaration-generator/package.json new file mode 100644 index 00000000000..bf66614380a --- /dev/null +++ b/client/packages/plugin-declaration-generator/package.json @@ -0,0 +1,40 @@ +{ + "name": "tailchat-plugin-declaration-generator", + "private": true, + "version": "1.0.0", + "description": "", + "main": "lib/index.js", + "scripts": { + "build": "tsc", + "watch": "tsc --watch", + "prepare": "tsc", + "test": "ts-node ./test/index.ts", + "test:parser": "ts-node ./test/parser.ts", + "test:parser:debug": "node -r ts-node/register --inspect-brk ./test/parser.ts" + }, + "author": "", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.20.5", + "@babel/parser": "^7.20.5", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "fs-extra": "^10.1.0", + "glob": "^7.2.3", + "lodash": "^4.17.21", + "mkdirp": "^1.0.4", + "ts-morph": "^16.0.0", + "typescript": "^4.9.4" + }, + "devDependencies": { + "@babel/types": "^7.20.5", + "@types/babel__generator": "^7.6.4", + "@types/babel__template": "^7.4.1", + "@types/babel__traverse": "^7.18.3", + "@types/fs-extra": "^9.0.13", + "@types/lodash": "^4.14.191", + "@types/mkdirp": "^1.0.2", + "@types/node": "^18.11.16", + "ts-node": "^10.9.1" + } +} diff --git a/client/packages/plugin-declaration-generator/src/index.ts b/client/packages/plugin-declaration-generator/src/index.ts new file mode 100644 index 00000000000..255dc5870e1 --- /dev/null +++ b/client/packages/plugin-declaration-generator/src/index.ts @@ -0,0 +1,90 @@ +import { parse, ParserPlugin } from '@babel/parser'; +import traverse from '@babel/traverse'; +import generate from '@babel/generator'; +import template from '@babel/template'; +import type { Comment } from '@babel/types'; +import { program, isFunctionDeclaration } from '@babel/types'; +import fs from 'fs-extra'; +import _ from 'lodash'; + +export * from './tsgenerator'; +export * from './parser'; + +const babelPlugins: ParserPlugin[] = ['jsx', 'typescript']; +const buildNamedExport = template('export function %%name%%(): any', { + plugins: babelPlugins, +}); + +interface Options { + entryPath: string; + // targetPath: string; // TODO +} +export async function generateFunctionDeclare(options: Options) { + const sourcecode = await fs.readFile(options.entryPath, 'utf8'); + + const exported = getSourceCodeExportedFunction(sourcecode); + + const astList = exported.map((e) => { + return buildNamedExport({ + name: e.name, + }); + }); + + const code = generate(program(_.flatten(astList))).code; + + return code; +} + +interface ExportedItem { + name: string; + comments?: string; +} +function getSourceCodeExportedFunction(sourcecode: string): ExportedItem[] { + const ast = parse(sourcecode, { + sourceType: 'module', + plugins: babelPlugins, + }); + + const exported: ExportedItem[] = []; + + traverse(ast, { + ExportNamedDeclaration({ node }) { + if (node.declaration) { + if (isFunctionDeclaration(node.declaration)) { + const name = node.declaration.id?.name; + if (typeof name === 'string') { + exported.push({ + name, + comments: getCommentStr(node.leadingComments), + }); + } + } + } else { + const names = node.specifiers.map((s) => { + const exported = s.exported; + if (exported.type === 'Identifier') { + return { + name: exported.name, + comments: getCommentStr(node.leadingComments), + }; + } else { + return null; + } + }); + exported.push(...names.filter((n): n is any => !!n)); + } + }, + }); + + return exported; +} + +function getCommentStr( + comments: Comment[] | null | undefined +): string | undefined { + if (!comments) { + return undefined; + } + + return comments.map((c) => c.value).join('\n'); +} diff --git a/client/packages/plugin-declaration-generator/src/parser.ts b/client/packages/plugin-declaration-generator/src/parser.ts new file mode 100644 index 00000000000..23416ff8259 --- /dev/null +++ b/client/packages/plugin-declaration-generator/src/parser.ts @@ -0,0 +1,112 @@ +import { + Project, + ProjectOptions, + Symbol, + SyntaxKind, + ts, + Type, +} from 'ts-morph'; + +interface Options { + entryPath: string; + project?: ProjectOptions; + hardcodeExportType?: Record; +} + +export function parseDeclarationEntry(options: Options) { + const project = new Project(options.project); + const sourceFile = project.getSourceFileOrThrow(options.entryPath); + const hardcodeExportType = options.hardcodeExportType ?? {}; + + const exportDefs: { name: string; type: string }[] = []; + for (const [name, declarations] of sourceFile.getExportedDeclarations()) { + if (hardcodeExportType[name]) { + exportDefs.push({ + name, + type: hardcodeExportType[name], + }); + continue; + } + + console.log('parsing:', name); + + const typeDef = declarations + .map((d) => { + if (d.isKind(SyntaxKind.FunctionDeclaration)) { + // 如果是方法导出 + return d + .getType() + .getCallSignatures() + .map((s) => { + let fnText = ''; + const typeParameters = s.getTypeParameters(); + if (typeParameters.length > 0) { + fnText += `<${typeParameters + .map((tp) => tp.getText()) + .join(', ')}>`; + } + + fnText += `(${s + .getParameters() + .map((p) => { + return parseFunctionParameter(p); + }) + .join(', ')}) => ${s.getReturnType().getText()}`; + + return fnText; + }) + .join(' | '); + } else { + // 其他 + return d.getType().getText(); + } + }) + .join(' | '); + + exportDefs.push({ + name, + type: typeDef, + }); + } + + return { exportDefs, project }; +} + +/** + * 解析函数参数为字符串 + */ +function parseFunctionParameter(parameter: Symbol): string { + const name = parameter.getName(); + const isOptional = parameter.isOptional(); + const type = parseType(parameter.getDeclarations()[0].getType()); + + if (isOptional) { + return `${name}?: ${type}`; + } else { + return `${name}: ${type}`; + } +} + +/** + * 解析函数 + */ +function parseType(type: Type): string { + if (type.isAnonymous()) { + return type.getText(); + } + + if (type.isObject()) { + const properties = type.getApparentProperties(); + debugger; + + return `{ ${properties + .map((p) => { + const t = p.getDeclarations()[0].getType(); + const text = parseType(t); + return `${p.getName()}: ${text}`; + }) + .join(', ')} }`; + } + + return type.getText(); +} diff --git a/packages/plugin-declaration-generator/src/tsgenerator.ts b/client/packages/plugin-declaration-generator/src/tsgenerator.ts similarity index 91% rename from packages/plugin-declaration-generator/src/tsgenerator.ts rename to client/packages/plugin-declaration-generator/src/tsgenerator.ts index 580b656477d..004d96d8fac 100644 --- a/packages/plugin-declaration-generator/src/tsgenerator.ts +++ b/client/packages/plugin-declaration-generator/src/tsgenerator.ts @@ -14,6 +14,7 @@ export interface ExportModuleItem { export interface DeclarationModuleItem { name: string; text: string; + comment?: string; pos?: number; } @@ -38,12 +39,25 @@ export function parseModuleDeclaration( node.body.forEachChild((item) => { if (ts.isVariableStatement(item)) { + let comment: string | undefined = undefined; + const commentRange = ts.getLeadingCommentRanges( + sourceFile.getFullText(), + item.pos + ); + if (Array.isArray(commentRange) && commentRange.length > 0) { + comment = ''; + commentRange.map(({ pos, end }) => { + comment += sourceFile.text.substring(pos, end); + }); + } + item.declarationList.declarations.forEach((declaration) => { const name = declaration.name.getText(); const pos = declaration.pos; modules[moduleName].push({ name, text: declaration.getText(), + comment, pos, }); }); diff --git a/client/packages/plugin-declaration-generator/test/demo/bar.ts b/client/packages/plugin-declaration-generator/test/demo/bar.ts new file mode 100644 index 00000000000..7d5eb22ddac --- /dev/null +++ b/client/packages/plugin-declaration-generator/test/demo/bar.ts @@ -0,0 +1,26 @@ +/** + * This is bar + */ +export function bar() { + console.log('Anything else'); +} + +interface E { + f: symbol; +} + +interface Options { + a: number; + b: string; + c: { + d: string; + e: E; + }; +} + +/** + * This is bar with complex input + */ +export function complexBar(input: Options) { + console.log('Anything else', input); +} diff --git a/client/packages/plugin-declaration-generator/test/demo/foo.ts b/client/packages/plugin-declaration-generator/test/demo/foo.ts new file mode 100644 index 00000000000..e1c08f93793 --- /dev/null +++ b/client/packages/plugin-declaration-generator/test/demo/foo.ts @@ -0,0 +1,13 @@ +import * as mkdirp from 'mkdirp'; + +/** + * This is foo + */ +export function foo(input: string) { + console.log('Anything', input); + mkdirp('./foo/foo/foo/foo/foo/foo/foo'); + + return input + 1; +} + +export const fooVar = 'fooVar' as string; diff --git a/client/packages/plugin-declaration-generator/test/demo/index.ts b/client/packages/plugin-declaration-generator/test/demo/index.ts new file mode 100644 index 00000000000..2a88800b214 --- /dev/null +++ b/client/packages/plugin-declaration-generator/test/demo/index.ts @@ -0,0 +1,9 @@ +export { foo, fooVar } from '@/foo'; +export { bar, complexBar } from '@/bar'; + +/** + * Root export + */ +export function main() { + console.log('main'); +} diff --git a/packages/plugin-declaration-generator/test/demo/tsconfig.json b/client/packages/plugin-declaration-generator/test/demo/tsconfig.json similarity index 100% rename from packages/plugin-declaration-generator/test/demo/tsconfig.json rename to client/packages/plugin-declaration-generator/test/demo/tsconfig.json diff --git a/packages/plugin-declaration-generator/test/index.d.ts b/client/packages/plugin-declaration-generator/test/index.d.ts similarity index 100% rename from packages/plugin-declaration-generator/test/index.d.ts rename to client/packages/plugin-declaration-generator/test/index.d.ts diff --git a/packages/plugin-declaration-generator/test/index.ts b/client/packages/plugin-declaration-generator/test/index.ts similarity index 100% rename from packages/plugin-declaration-generator/test/index.ts rename to client/packages/plugin-declaration-generator/test/index.ts diff --git a/client/packages/plugin-declaration-generator/test/parser.ts b/client/packages/plugin-declaration-generator/test/parser.ts new file mode 100644 index 00000000000..e5192f24250 --- /dev/null +++ b/client/packages/plugin-declaration-generator/test/parser.ts @@ -0,0 +1,14 @@ +import { parseDeclarationEntry } from '../src/parser'; +import path from 'path'; + +const project = parseDeclarationEntry({ + entryPath: path.resolve(__dirname, './demo/index.ts'), + project: { + tsConfigFilePath: path.resolve(__dirname, './demo/tsconfig.json'), + }, +}); + +console.log( + 'sourceFile', + project.getSourceFiles().map((item) => item.getFilePath()) +); diff --git a/client/packages/plugin-declaration-generator/tsconfig.json b/client/packages/plugin-declaration-generator/tsconfig.json new file mode 100644 index 00000000000..aefa88d0e0a --- /dev/null +++ b/client/packages/plugin-declaration-generator/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "esnext", + "lib": ["ESNext"], + "outDir": "lib", + "declaration": true, + "esModuleInterop": true, + "isolatedModules": true, + "module": "CommonJS", + "moduleResolution": "node", + "strict": true, + "importsNotUsedAsValues": "error", + }, + "include": ["./src/*"] +} diff --git a/packages/plugin-declaration-generator/.gitignore b/client/packages/tailchat-client-sdk/.gitignore similarity index 100% rename from packages/plugin-declaration-generator/.gitignore rename to client/packages/tailchat-client-sdk/.gitignore diff --git a/client/packages/tailchat-client-sdk/README.md b/client/packages/tailchat-client-sdk/README.md new file mode 100644 index 00000000000..c2946a887af --- /dev/null +++ b/client/packages/tailchat-client-sdk/README.md @@ -0,0 +1,3 @@ +## Document + +visit website to learn more: [https://tailchat.msgbyte.com/docs/advanced-usage/openapp/about](https://tailchat.msgbyte.com/docs/advanced-usage/openapp/about) diff --git a/client/packages/tailchat-client-sdk/jest.config.js b/client/packages/tailchat-client-sdk/jest.config.js new file mode 100644 index 00000000000..e86e13bab91 --- /dev/null +++ b/client/packages/tailchat-client-sdk/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +}; diff --git a/client/packages/tailchat-client-sdk/package.json b/client/packages/tailchat-client-sdk/package.json new file mode 100644 index 00000000000..bd9713648c8 --- /dev/null +++ b/client/packages/tailchat-client-sdk/package.json @@ -0,0 +1,27 @@ +{ + "name": "tailchat-client-sdk", + "version": "1.0.9", + "description": "", + "main": "lib/index.js", + "scripts": { + "prepare": "tsc", + "release": "npm publish --registry https://registry.npmjs.com/", + "test": "jest" + }, + "keywords": [], + "author": "moonrailgun ", + "license": "MIT", + "devDependencies": { + "@types/jest": "^29.5.1", + "@types/node": "^18.16.1", + "jest": "27.5.1", + "ts-jest": "27.1.4", + "typescript": "^4.9.5" + }, + "dependencies": { + "axios": "^1.3.2", + "tailchat-types": "workspace:*", + "socket.io-client": "^4.7.1", + "socket.io-msgpack-parser": "^3.0.2" + } +} diff --git a/client/packages/tailchat-client-sdk/src/__tests__/utils.spec.ts b/client/packages/tailchat-client-sdk/src/__tests__/utils.spec.ts new file mode 100644 index 00000000000..e4792ce212e --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/__tests__/utils.spec.ts @@ -0,0 +1,21 @@ +import { stripMentionTag } from '../utils'; + +describe('stripMentionTag', () => { + test('simple', () => { + expect( + stripMentionTag('[at=6448e822834c12425646f473]Robot[/at] Hello') + ).toBe('Hello'); + }); + + test('not remove other message', () => { + expect( + stripMentionTag( + '[at=6448e822834c12425646f473]Robot[/at] Hello [at=6448e822834c12425646f4732]Robot[/at]' + ) + ).toBe('Hello [at=6448e822834c12425646f4732]Robot[/at]'); + }); + + test('also can remove mention ', () => { + expect(stripMentionTag('@Robot Hello')).toBe('Hello'); + }); +}); diff --git a/client/packages/tailchat-client-sdk/src/index.ts b/client/packages/tailchat-client-sdk/src/index.ts new file mode 100644 index 00000000000..951622d73dc --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/index.ts @@ -0,0 +1,3 @@ +export * from './openapi'; +export * from './plugins/simplenotify'; +export * from './utils'; diff --git a/client/packages/tailchat-client-sdk/src/openapi/client/base.ts b/client/packages/tailchat-client-sdk/src/openapi/client/base.ts new file mode 100644 index 00000000000..6ab04533ae8 --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/openapi/client/base.ts @@ -0,0 +1,162 @@ +import axios, { AxiosInstance } from 'axios'; +import crypto from 'crypto'; + +export class TailchatBaseClient { + request: AxiosInstance; + jwt: string | null = null; + userId: string | null = null; + loginP: Promise; + + constructor( + public url: string, + public appId: string, + public appSecret: string + ) { + if (!url || !appId || !appSecret) { + throw new Error( + 'Require params: apiUrl, appId, appSecret. You can set it with env' + ); + } + + this.request = axios.create({ + baseURL: url, + }); + this.request.interceptors.request.use(async (val) => { + if ( + this.jwt && + ['post', 'get'].includes(String(val.method).toLowerCase()) && + !val.headers['X-Token'] + ) { + // 任何请求都尝试增加token + val.headers['X-Token'] = this.jwt; + } + + return val; + }); + this.loginP = this.login(); + } + + async login() { + try { + console.log('Login...'); + const { data } = await this.request.post('/api/openapi/bot/login', { + appId: this.appId, + token: this.getBotToken(), + }); + + // NOTICE: 注意,有30天过期时间,需要定期重新登录以换取新的token + // 这里先不换 + this.jwt = data.data?.jwt; + this.userId = data.data?.userId; + + console.log('tailchat openapp login success!'); + + // 尝试调用函数 + // this.whoami().then(console.log); + } catch (err) { + console.error(err); + throw new Error( + `Login failed, please check application credentials or network(Error: ${String( + err + )})` + ); + } + } + + async waitingForLogin(): Promise { + await Promise.resolve(this.loginP); + } + + async call(action: string, params = {}) { + try { + await this.waitingForLogin(); + console.log('Calling:', action); + const { data } = await this.request.post( + '/api/' + action.replace(/\./g, '/'), + params + ); + + return data.data; + } catch (err: any) { + console.error('Service Call Failed:', err); + const data: string = err?.response?.data; + if (data) { + throw new Error( + JSON.stringify({ + action, + data, + }) + ); + } else { + throw err; + } + } + } + + async whoami(): Promise<{ + userAgent: string; + language: string; + user: { + _id: string; + nickname: string; + email: string; + avatar: string; + }; + token: string; + userId: string; + }> { + return this.call('user.whoami'); + } + + getBotToken() { + return crypto + .createHash('md5') + .update(this.appId + this.appSecret) + .digest('hex'); + } + + /** + * Send normal message to tailchat + */ + async sendMessage(payload: { + converseId: string; + groupId?: string; + content: string; + plain?: string; + meta?: object; + }) { + return this.call('chat.message.sendMessage', payload); + } + + /** + * Reply message + */ + async replyMessage( + replyInfo: { + messageId: string; + author: string; + content: string; + }, + payload: { + converseId: string; + groupId?: string; + content: string; + plain?: string; + meta?: object; + } + ) { + return this.sendMessage({ + ...payload, + meta: { + ...payload.meta, + mentions: [replyInfo.author], + reply: { + _id: replyInfo.messageId, + author: replyInfo.author, + content: replyInfo.content, + }, + }, + content: `[at=${replyInfo.author}][/at] ${payload.content}`, + }); + } +} diff --git a/client/packages/tailchat-client-sdk/src/openapi/client/http.ts b/client/packages/tailchat-client-sdk/src/openapi/client/http.ts new file mode 100644 index 00000000000..e472b74dd54 --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/openapi/client/http.ts @@ -0,0 +1,3 @@ +import { TailchatBaseClient } from './base'; + +export class TailchatHTTPClient extends TailchatBaseClient {} diff --git a/client/packages/tailchat-client-sdk/src/openapi/client/index.ts b/client/packages/tailchat-client-sdk/src/openapi/client/index.ts new file mode 100644 index 00000000000..6e93e903e7f --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/openapi/client/index.ts @@ -0,0 +1,8 @@ +export { + /** + * @deprecated please rename to TailchatHTTPClient + */ + TailchatHTTPClient as TailchatClient, + TailchatHTTPClient, +} from './http'; +export { TailchatWsClient } from './ws'; diff --git a/client/packages/tailchat-client-sdk/src/openapi/client/ws.ts b/client/packages/tailchat-client-sdk/src/openapi/client/ws.ts new file mode 100644 index 00000000000..2515597c2c3 --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/openapi/client/ws.ts @@ -0,0 +1,111 @@ +import { TailchatBaseClient } from './base'; +import io, { Socket } from 'socket.io-client'; +import * as msgpackParser from 'socket.io-msgpack-parser'; +import type { ChatMessage } from 'tailchat-types'; + +export class TailchatWsClient extends TailchatBaseClient { + public socket: Socket | null = null; + + constructor( + public url: string, + public appId: string, + public appSecret: string, + public disableMsgpack: boolean = false + ) { + super(url, appId, appSecret); + } + + connect(): Promise { + return new Promise(async (resolve, reject) => { + await this.waitingForLogin(); + + const token = this.jwt; + const socket = (this.socket = io(this.url, { + transports: ['websocket'], + auth: { + token, + }, + forceNew: true, + parser: this.disableMsgpack ? undefined : msgpackParser, + })); + + socket.once('connect', () => { + // 连接成功 + this.emit('chat.converse.findAndJoinRoom') + .then((res) => { + console.log('Joined rooms', res.data); + resolve(socket); + }) + .catch((err) => { + reject(err); + }); + }); + socket.once('error', () => { + reject(); + }); + + socket.on('disconnect', (reason) => { + console.log(`disconnect due to ${reason}`); + this.socket = null; + }); + + socket.onAny((ev) => { + console.log('onAny', ev); + }); + }); + } + + disconnect() { + if (!this.socket) { + console.warn('You should call it after connect'); + return; + } + + this.socket.disconnect(); + this.socket = null; + } + + emit(eventName: string, eventData: any = {}) { + if (!this.socket) { + console.warn('You should call it after connect'); + throw new Error('You should call it after connect'); + } + + return this.socket.emitWithAck(eventName, eventData); + } + + on(eventName: string, callback: (payload: any) => void) { + if (!this.socket) { + console.warn('You should call it after connect'); + return; + } + + this.socket.on(eventName, callback); + } + + once(eventName: string, callback: (payload: any) => void) { + if (!this.socket) { + console.warn('You should call it after connect'); + return; + } + + this.socket.once(eventName, callback); + } + + off(eventName: string, callback: (payload: any) => void) { + if (!this.socket) { + console.warn('You should call it after connect'); + return; + } + + this.socket.off(eventName, callback); + } + + onMessage(callback: (messagePayload: ChatMessage) => void) { + this.on('notify:chat.message.add', callback); + } + + onMessageUpdate(callback: (messagePayload: ChatMessage) => void) { + this.on('notify:chat.message.update', callback); + } +} diff --git a/client/packages/tailchat-client-sdk/src/openapi/index.ts b/client/packages/tailchat-client-sdk/src/openapi/index.ts new file mode 100644 index 00000000000..4f1cce44fa3 --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/openapi/index.ts @@ -0,0 +1 @@ +export * from './client'; diff --git a/client/packages/tailchat-client-sdk/src/plugins/simplenotify.ts b/client/packages/tailchat-client-sdk/src/plugins/simplenotify.ts new file mode 100644 index 00000000000..3ea33df5eac --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/plugins/simplenotify.ts @@ -0,0 +1,24 @@ +import axios from 'axios'; + +/** + * 基于简易推送插件的消息通知服务 + * + * @param hostUrl 实例地址url + * @param subscribeId 订阅id + * @param text 发送的文本,默认支持bbcode + */ +export async function sendSimpleNotify( + hostUrl: string, + subscribeId: string, + text: string +) { + await axios({ + method: 'post', + baseURL: hostUrl, + url: '/api/plugin:com.msgbyte.simplenotify/webhook/callback', + data: { + subscribeId, + text, + }, + }); +} diff --git a/client/packages/tailchat-client-sdk/src/utils.ts b/client/packages/tailchat-client-sdk/src/utils.ts new file mode 100644 index 00000000000..fb05ff332fe --- /dev/null +++ b/client/packages/tailchat-client-sdk/src/utils.ts @@ -0,0 +1,10 @@ +/** + * remove first [at=xxx]xxx[/at] in message first + */ +export function stripMentionTag(message: string): string { + return message + .trim() + .replace(/^\[at=.*?\[\/at\]/, '') + .replace(/^@\S*\s?/, '') + .trimStart(); +} diff --git a/client/packages/tailchat-client-sdk/test/index.ts b/client/packages/tailchat-client-sdk/test/index.ts new file mode 100644 index 00000000000..7a20d34ec3d --- /dev/null +++ b/client/packages/tailchat-client-sdk/test/index.ts @@ -0,0 +1,20 @@ +import { TailchatWsClient } from '../src'; + +const HOST = process.env.HOST; +const APPID = process.env.APPID; +const APPSECRET = process.env.APPSECRET; + +if (!HOST || !APPID || !APPSECRET) { + console.log('require env: HOST, APPID, APPSECRET'); + process.exit(1); +} + +const client = new TailchatWsClient(HOST, APPID, APPSECRET); + +client.connect().then(async () => { + console.log('Login Success!'); + + client.onMessage((message) => { + console.log('Receive message', message); + }); +}); diff --git a/client/packages/tailchat-client-sdk/tsconfig.json b/client/packages/tailchat-client-sdk/tsconfig.json new file mode 100644 index 00000000000..52a14ef3185 --- /dev/null +++ b/client/packages/tailchat-client-sdk/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "esnext", + "lib": ["ESNext"], + "skipLibCheck": true, + "outDir": "lib", + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "isolatedModules": true, + "module": "CommonJS", + "moduleResolution": "node", + "strict": true, + "importsNotUsedAsValues": "error", + "typeRoots": ["./node_modules/@types"] + }, + "include": ["./src/*"] +} diff --git a/shared/api/buildStorage.ts b/client/shared/api/buildStorage.ts similarity index 100% rename from shared/api/buildStorage.ts rename to client/shared/api/buildStorage.ts diff --git a/client/shared/api/request.ts b/client/shared/api/request.ts new file mode 100644 index 00000000000..d5909450cd5 --- /dev/null +++ b/client/shared/api/request.ts @@ -0,0 +1,90 @@ +import axios, { AxiosRequestConfig } from 'axios'; +import _get from 'lodash/get'; +import _isFunction from 'lodash/isFunction'; +import { t } from '../i18n'; +import { getErrorHook, tokenGetter } from '../manager/request'; +import { getServiceUrl, onServiceUrlChange } from '../manager/service'; + +export type CommonRequestResult = + | ({ + result: false; + msg: string; + } & Partial) // 并上一个T是为了方便取值, 但需要判定 + | ({ + result: true; + } & T); + +class RequestError extends Error {} + +export type RequestConfig = AxiosRequestConfig; + +/** + * 创建请求实例 + */ +function createRequest() { + const ins = axios.create({ + baseURL: getServiceUrl(), + }); + onServiceUrlChange((getUrl) => { + // 重置请求地址 + ins.defaults.baseURL = getUrl(); + }); + + ins.interceptors.request.use(async (val) => { + if ( + ['post', 'get'].includes(String(val.method).toLowerCase()) && + !val.headers['X-Token'] + ) { + // 任何请求都尝试增加token + val.headers['X-Token'] = await tokenGetter(); + } + + return val; + }); + + ins.interceptors.response.use( + (val) => { + /** + * 预处理返回的数据 + */ + val.data = _get(val.data, 'data', val.data); + + return val; + }, + (err) => { + // 尝试获取错误信息 + const responseData = _get(err, 'response.data') ?? {}; + let errorMsg: string = responseData.message; + const code: number = responseData.code; + + if (responseData.type === 'VALIDATION_ERROR') { + // 校验失败 + errorMsg = t('请求参数校验失败'); + + if (Array.isArray(responseData.data)) { + console.error(JSON.stringify(responseData.data)); + + try { + errorMsg += `: ${responseData.data + .map((item: any) => item.field) + .join(', ')}`; + } catch (e) {} + } + } + + // comment it logic because if not throw error, react query will cache `{ data: { result: false, msg: errorMsg, code } }` and has some problem + if (_isFunction(getErrorHook)) { + const isContinue = getErrorHook(err); + // if (isContinue === false) { + // return { data: { result: false, msg: errorMsg, code } }; + // } + } + + throw new RequestError(errorMsg ?? err.message); + } + ); + + return ins; +} + +export const request = createRequest(); diff --git a/client/shared/api/socket.ts b/client/shared/api/socket.ts new file mode 100644 index 00000000000..ba57624f3ea --- /dev/null +++ b/client/shared/api/socket.ts @@ -0,0 +1,236 @@ +import { io, Socket } from 'socket.io-client'; +import _isNil from 'lodash/isNil'; +import { getServiceUrl } from '../manager/service'; +import { isDevelopment } from '../utils/environment'; +import { showErrorToasts, showGlobalLoading, showToasts } from '../manager/ui'; +import { t } from '../i18n'; +import { sharedEvent } from '../event'; +import msgpackParser from 'socket.io-msgpack-parser'; +import { getGlobalConfig } from '../model/config'; + +class SocketEventError extends Error { + name = 'SocketEventError'; +} + +type SocketEventRespones = + | { + result: true; + data: T; + } + | { + result: false; + message: string; + }; + +/** + * 封装后的 Socket + */ +export class AppSocket { + private listener: [string, (data: unknown) => void][] = []; + + constructor(private socket: Socket) { + socket.onAny((eventName: string, data: unknown) => { + const matched = this.listener.filter(([ev]) => ev === eventName); // 匹配到的监听器列表 + if (matched.length === 0) { + // 没有匹配到任何处理函数 + console.warn(`[Socket IO] Unhandler event: ${eventName}`, data); + return; + } + + matched.forEach(([, cb]) => { + cb(data); + }); + }); + } + + get connected(): boolean { + return this.socket.connected; + } + + async request( + eventName: string, + eventData: unknown = {} + ): Promise { + return new Promise((resolve, reject) => { + this.socket.emit(eventName, eventData, (resp: SocketEventRespones) => { + if (resp.result === true) { + resolve(resp.data); + } else if (resp.result === false) { + reject( + new SocketEventError( + `[${eventName}]: ${resp.message}: \ndata: ${JSON.stringify( + eventData + )}` + ) + ); + } + }); + }); + } + + /** + * 监听远程通知 + */ + listen(eventName: string, callback: (data: T) => void) { + this.listener.push([`notify:${eventName}`, callback as any]); + } + + /** + * 移除监听函数 + */ + removeListener(eventName: string, callback: (data: any) => void) { + const index = this.listener.findIndex( + (item) => item[0] === `notify:${eventName}` && item[1] === callback + ); + if (index >= 0) { + this.listener.splice(index, 1); + } + } + + /** + * 模拟重连 + * NOTICE: 仅用于开发环境 + */ + mockReconnect() { + this.socket.disconnect(); + showToasts('reconnect after 5s'); + setTimeout(() => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this.socket.io.skipReconnect = false; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this.socket.io.reconnect(); + }, 5 * 1000); + } + + /** + * 断线重连后触发 + */ + onReconnect(cb: () => void) { + this.socket.io.on('reconnect', cb); + } + + /** + * 断开连接 + */ + disconnect() { + this.socket.disconnect(); + } + + /** + * 初始Socket状态管理提示 + */ + private closeFn: unknown = null; // 全局loading关闭函数 + setupSocketStatusTip() { + const socket = this.socket; + + const showConnecting = () => { + if (this.closeFn) { + return; + } + this.closeFn = showGlobalLoading(t('正在重新链接')); + }; + + const closeConnecting = () => { + if (this.closeFn && typeof this.closeFn === 'function') { + this.closeFn(); + this.closeFn = null; + } + }; + + // 网络状态管理 + socket.on('connect', () => { + console.log('连接成功'); + closeConnecting(); + + sharedEvent.emit('updateNetworkStatus', 'connected'); + }); + socket.on('connecting', (data) => { + console.log('正在连接'); + + showConnecting(); + + sharedEvent.emit('updateNetworkStatus', 'reconnecting'); + }); + socket.on('disconnect', (data) => { + console.log('与服务器的链接已断开'); + showErrorToasts(t('与服务器的链接已断开')); + closeConnecting(); + sharedEvent.emit('updateNetworkStatus', 'disconnected'); + }); + socket.on('connect_error', (data) => { + console.log('连接失败'); + showErrorToasts(t('连接失败')); + closeConnecting(); + sharedEvent.emit('updateNetworkStatus', 'disconnected'); + }); + + socket.io.on('reconnect', (data) => { + console.log('重连成功'); + + closeConnecting(); + sharedEvent.emit('updateNetworkStatus', 'connected'); + }); + socket.io.on('reconnect_attempt', (data) => { + console.log('重连中...'); + showConnecting(); + sharedEvent.emit('updateNetworkStatus', 'reconnecting'); + }); + socket.io.on('reconnect_error', (error) => { + console.error('重连尝试失败...', error); + showConnecting(); + sharedEvent.emit('updateNetworkStatus', 'reconnecting'); + }); + socket.io.on('reconnect_failed', () => { + console.error('重连失败...'); + showConnecting(); + sharedEvent.emit('updateNetworkStatus', 'disconnected'); + }); + socket.io.on('error', (error) => { + console.error('网络出现异常', error); + showErrorToasts(t('网络出现异常')); + closeConnecting(); + sharedEvent.emit('updateNetworkStatus', 'disconnected'); + }); + } +} + +let _socket: Socket; +/** + * 创建Socket连接 + * 如果已经有Socket连接则关闭上一个 + * @param token Token + */ +export function createSocket(token: string): Promise { + if (!_isNil(_socket)) { + _socket.close(); + } + + return new Promise((resolve, reject) => { + const disableMsgpack = getGlobalConfig().disableMsgpack; + _socket = io(getServiceUrl(), { + transports: ['websocket'], + auth: { + token, + }, + forceNew: true, + parser: disableMsgpack ? undefined : msgpackParser, + }); + _socket.once('connect', () => { + // 连接成功 + const appSocket = new AppSocket(_socket); + appSocket.setupSocketStatusTip(); + resolve(appSocket); + }); + _socket.once('error', () => { + reject(); + }); + + if (isDevelopment) { + _socket.onAny((...args) => { + console.debug('Receive Notify:', args); + }); + } + }); +} diff --git a/client/shared/cache/Provider.tsx b/client/shared/cache/Provider.tsx new file mode 100644 index 00000000000..8502d4dc23f --- /dev/null +++ b/client/shared/cache/Provider.tsx @@ -0,0 +1,20 @@ +import React, { PropsWithChildren } from 'react'; +import { asyncStoragePersister, queryClient } from './'; +import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client'; + +/** + * 缓存上下文 + */ +export const CacheProvider: React.FC = React.memo( + (props) => { + return ( + + {props.children} + + ); + } +); +CacheProvider.displayName = 'CacheProvider'; diff --git a/client/shared/cache/cache.ts b/client/shared/cache/cache.ts new file mode 100644 index 00000000000..1295fd37657 --- /dev/null +++ b/client/shared/cache/cache.ts @@ -0,0 +1,172 @@ +import { + ChatConverseInfo, + fetchConverseInfo, + getConverseAckInfo, +} from '../model/converse'; +import { + findGroupInviteByCode, + getGroupBasicInfo, + GroupBasicInfo, + GroupInvite, +} from '../model/group'; +import { getConverseLastMessageInfo } from '../model/message'; +import { + fetchLocalStaticRegistryPlugins, + fetchRegistryPlugins, + fetchServiceRegistryPlugins, + PluginManifest, +} from '../model/plugin'; +import { fetchUserInfo, getUserSettings, UserBaseInfo } from '../model/user'; +import { parseUrlStr } from '../utils/url-helper'; +import { queryClient } from './index'; + +export enum CacheKey { + user = 'user', + converse = 'converse', + converseAck = 'converseAck', + baseGroupInfo = 'baseGroupInfo', + groupInvite = 'groupInvite', + pluginRegistry = 'pluginRegistry', + userSettings = 'userSettings', +} + +/** + * 获取缓存的用户信息 + */ +export async function getCachedUserInfo( + userId: string, + refetch = false +): Promise { + const data = await queryClient.fetchQuery( + [CacheKey.user, userId], + () => fetchUserInfo(userId), + { + staleTime: refetch ? 0 : 2 * 60 * 60 * 1000, // 缓存2小时 + } + ); + + return data; +} + +/** + * 获取缓存的会话信息 + */ +export async function getCachedConverseInfo( + converseId: string +): Promise { + const data = await queryClient.fetchQuery( + [CacheKey.converse, converseId], + () => fetchConverseInfo(converseId) + ); + + return data; +} + +/** + * 获取缓存的邀请码信息 + */ +export async function getCachedBaseGroupInfo( + groupId: string +): Promise { + const data = await queryClient.fetchQuery( + [CacheKey.baseGroupInfo, groupId], + () => getGroupBasicInfo(groupId) + ); + + return data; +} + +/** + * 获取缓存的邀请码信息 + */ +export async function getCachedGroupInviteInfo( + inviteCode: string +): Promise { + const data = await queryClient.fetchQuery( + [CacheKey.groupInvite, inviteCode], + () => findGroupInviteByCode(inviteCode) + ); + + return data; +} + +/** + * 获取缓存的用户信息 + */ +export async function getCachedAckInfo(converseId: string, refetch = false) { + const data = await queryClient.fetchQuery( + [CacheKey.converseAck, converseId], + () => { + return Promise.all([ + getConverseAckInfo([converseId]).then((d) => d[0]), + getConverseLastMessageInfo([converseId]).then((d) => d[0]), + ]).then(([ack, lastMessage]) => { + return { + converseId, + ack, + lastMessage, + }; + }); + }, + { + staleTime: 2 * 1000, // 缓存2s, 减少一秒内的重复请求(无意义) + } + ); + + return data; +} + +/** + * 获取缓存的插件列表 + */ +export async function getCachedRegistryPlugins(): Promise { + const data = await queryClient.fetchQuery( + [CacheKey.pluginRegistry], + () => + Promise.all([ + fetchRegistryPlugins().catch(() => []), + fetchServiceRegistryPlugins() + .then((list) => + list.map((manifest) => { + const serviceManifest = { + ...manifest, + // 后端url策略。根据前端的url在获取时自动变更为当前链接的后端地址 + url: parseUrlStr(manifest.url), + }; + + if (manifest.icon) { + serviceManifest.icon = parseUrlStr(manifest.icon); + } + + if (manifest.documentUrl) { + serviceManifest.documentUrl = parseUrlStr(manifest.documentUrl); + } + + return serviceManifest; + }) + ) + .catch(() => []), + fetchLocalStaticRegistryPlugins().catch(() => []), + ]).then(([a, b, c]) => [...a, ...b, ...c]), + { + staleTime: 2 * 60 * 60 * 1000, // 缓存2小时 + } + ); + + return data; +} + +/** + * 获取用户配置 + */ +export async function getCachedUserSettings() { + const data = await queryClient.fetchQuery( + [CacheKey.userSettings], + () => getUserSettings(), + { + staleTime: 10 * 60 * 1000, // 缓存10分钟 + } + ); + + return data; +} diff --git a/client/shared/cache/index.ts b/client/shared/cache/index.ts new file mode 100644 index 00000000000..dee7aa605f1 --- /dev/null +++ b/client/shared/cache/index.ts @@ -0,0 +1,21 @@ +import { QueryClient } from '@tanstack/react-query'; +import { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister'; +import { getStorage } from '../manager/storage'; + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 10 * 1000, // 默认缓存10s + }, + }, +}); + +export const asyncStoragePersister = createAsyncStoragePersister({ + storage: { + getItem: (key: string) => { + return getStorage().get(key); + }, + setItem: (key: string, value: string) => getStorage().set(key, value), + removeItem: (key: string) => getStorage().remove(key), + }, +}); diff --git a/client/shared/cache/useCache.ts b/client/shared/cache/useCache.ts new file mode 100644 index 00000000000..f75b419dd38 --- /dev/null +++ b/client/shared/cache/useCache.ts @@ -0,0 +1,30 @@ +import { useQuery, useQueryClient } from '@tanstack/react-query'; +import { getUserOnlineStatus } from '../model/user'; + +export { useQuery, useQueryClient }; + +/** + * 用户登录状态 + */ +export function useCachedOnlineStatus( + ids: string[], + onOnlineStatusUpdate?: (onlineStatus: boolean[]) => void +): boolean[] { + const staleTime = 20 * 1000; // 缓存20s + + const { data, isSuccess } = useQuery( + ['onlineStatus', ids.join(',')], + () => getUserOnlineStatus(ids), + { + staleTime, + } + ); + + if (isSuccess && Array.isArray(data)) { + if (typeof onOnlineStatusUpdate === 'function' && data) { + onOnlineStatusUpdate(data); + } + } + + return data ?? ids.map(() => false); +} diff --git a/client/shared/cache/utils.ts b/client/shared/cache/utils.ts new file mode 100644 index 00000000000..4d7e047b86c --- /dev/null +++ b/client/shared/cache/utils.ts @@ -0,0 +1,48 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import type { FetchQueryOptions } from '@tanstack/react-query'; +import { queryClient } from './'; + +/** + * 构建缓存请求 + * TODO: 这里的类型真的不好写, 先用any来过滤内部的, 只保证外部使用ok + * + * @example + * const queryData = buildCachedRequest('key', (arg1, arg2) => { + * return request.post(...) + * }) + */ +export function buildCachedRequest Promise>( + name: string, + fn: F, + options?: FetchQueryOptions +): F & { + /** + * 根据name重新获取数据 + */ + refetch: () => Promise; + /** + * 清空name相关缓存 + */ + clearCache: () => void; +} { + const req = ((...args: any) => { + return queryClient.fetchQuery( + [name, JSON.stringify(args)], + () => fn(...args), + options + ); + }) as any; + + const refetch = () => { + return queryClient.refetchQueries([name]); + }; + + const clearCache = () => { + queryClient.removeQueries([name]); + }; + + req.refetch = refetch; + req.clearCache = clearCache; + + return req; +} diff --git a/client/shared/components/AlphaContainer.tsx b/client/shared/components/AlphaContainer.tsx new file mode 100644 index 00000000000..4d721d2b0b2 --- /dev/null +++ b/client/shared/components/AlphaContainer.tsx @@ -0,0 +1,15 @@ +import React, { PropsWithChildren } from 'react'; +import { useAlphaMode } from '../hooks/useAlphaMode'; + +/** + * Alpha 容器 + * 在 alpha 模式下可以看到一些可以被公开但是还在测试中的功能 + */ +export const AlphaContainer: React.FC = React.memo( + (props) => { + const { isAlphaMode } = useAlphaMode(); + + return isAlphaMode ? <>{props.children} : null; + } +); +AlphaContainer.displayName = 'AlphaContainer'; diff --git a/client/shared/components/DevContainer.tsx b/client/shared/components/DevContainer.tsx new file mode 100644 index 00000000000..de57dbf1d80 --- /dev/null +++ b/client/shared/components/DevContainer.tsx @@ -0,0 +1,11 @@ +import React, { Fragment, PropsWithChildren } from 'react'; +import { isDevelopment } from '../utils/environment'; + +/** + * 开发中容器 + * 在容器下的组件在生产环境下不会被渲染 + */ +export const DevContainer: React.FC = React.memo((props) => { + return isDevelopment ? {props.children} : null; +}); +DevContainer.displayName = 'DevContainer'; diff --git a/shared/components/Portal/Consumer.tsx b/client/shared/components/Portal/Consumer.tsx similarity index 100% rename from shared/components/Portal/Consumer.tsx rename to client/shared/components/Portal/Consumer.tsx diff --git a/shared/components/Portal/Manager.tsx b/client/shared/components/Portal/Manager.tsx similarity index 100% rename from shared/components/Portal/Manager.tsx rename to client/shared/components/Portal/Manager.tsx diff --git a/shared/components/Portal/README.md b/client/shared/components/Portal/README.md similarity index 100% rename from shared/components/Portal/README.md rename to client/shared/components/Portal/README.md diff --git a/shared/components/Portal/buildPortal.tsx b/client/shared/components/Portal/buildPortal.tsx similarity index 95% rename from shared/components/Portal/buildPortal.tsx rename to client/shared/components/Portal/buildPortal.tsx index 747ceb2c825..e771e4e434d 100644 --- a/shared/components/Portal/buildPortal.tsx +++ b/client/shared/components/Portal/buildPortal.tsx @@ -1,4 +1,10 @@ -import React, { useCallback, useRef, Fragment, useContext } from 'react'; +import React, { + useCallback, + useRef, + Fragment, + useContext, + PropsWithChildren, +} from 'react'; import { useEffect } from 'react'; import { PortalManager } from './Manager'; import { createPortalContext } from './context'; @@ -64,7 +70,7 @@ export function buildPortal(options: BuildPortalOptions) { const PortalContext = createPortalContext(hostName); - const PortalHost = React.memo((props) => { + const PortalHost: React.FC = React.memo((props) => { const managerRef = useRef(); const nextKeyRef = useRef(0); const queueRef = useRef([]); @@ -180,7 +186,7 @@ export function buildPortal(options: BuildPortalOptions) { }); PortalHost.displayName = 'PortalHost-' + hostName; - const PortalRender = React.memo((props) => { + const PortalRender: React.FC = React.memo((props) => { const manager = useContext(PortalContext); if (_isNil(manager)) { diff --git a/shared/components/Portal/context.ts b/client/shared/components/Portal/context.ts similarity index 100% rename from shared/components/Portal/context.ts rename to client/shared/components/Portal/context.ts diff --git a/shared/components/Portal/defaultEventEmitter.tsx b/client/shared/components/Portal/defaultEventEmitter.tsx similarity index 100% rename from shared/components/Portal/defaultEventEmitter.tsx rename to client/shared/components/Portal/defaultEventEmitter.tsx diff --git a/shared/components/Portal/index.ts b/client/shared/components/Portal/index.ts similarity index 100% rename from shared/components/Portal/index.ts rename to client/shared/components/Portal/index.ts diff --git a/client/shared/components/Provider.tsx b/client/shared/components/Provider.tsx new file mode 100644 index 00000000000..70a060378ae --- /dev/null +++ b/client/shared/components/Provider.tsx @@ -0,0 +1,12 @@ +import React, { PropsWithChildren } from 'react'; +import { CacheProvider } from '../cache/Provider'; +import { ColorSchemeContextProvider } from '../contexts/ColorSchemeContext'; + +export const TcProvider: React.FC = React.memo((props) => { + return ( + + {props.children} + + ); +}); +TcProvider.displayName = 'TcProvider'; diff --git a/client/shared/contexts/ChatBoxContext.tsx b/client/shared/contexts/ChatBoxContext.tsx new file mode 100644 index 00000000000..4c662943f6e --- /dev/null +++ b/client/shared/contexts/ChatBoxContext.tsx @@ -0,0 +1,57 @@ +import React, { + PropsWithChildren, + useCallback, + useContext, + useState, +} from 'react'; +import _noop from 'lodash/noop'; +import type { ReplyMsgType } from '../utils/message-helper'; + +/** + * 一个消息盒的上下文 + */ + +interface ChatBoxContextProps { + replyMsg: ReplyMsgType | null; + setReplyMsg: (msg: ReplyMsgType | null) => void; +} +const ChatBoxContext = React.createContext({ + replyMsg: null, + setReplyMsg: _noop, +}); +ChatBoxContext.displayName = 'ChatBoxContext'; + +export const ChatBoxContextProvider: React.FC = React.memo( + (props) => { + const [replyMsg, setReplyMsg] = useState(null); + + return ( + + {props.children} + + ); + } +); +ChatBoxContextProvider.displayName = 'ChatBoxContextProvider'; + +export function useChatBoxContext(): ChatBoxContextProps & { + hasContext: boolean; + clearReplyMsg: () => void; +} { + const context = useContext(ChatBoxContext); + const clearReplyMsg = useCallback(() => { + context.setReplyMsg(null); + }, [context.setReplyMsg]); + + return { + hasContext: context.setReplyMsg !== _noop, + replyMsg: context.replyMsg, + setReplyMsg: context.setReplyMsg, + clearReplyMsg, + }; +} diff --git a/client/shared/contexts/ColorSchemeContext.tsx b/client/shared/contexts/ColorSchemeContext.tsx new file mode 100644 index 00000000000..eaac91a6c3c --- /dev/null +++ b/client/shared/contexts/ColorSchemeContext.tsx @@ -0,0 +1,42 @@ +import React, { PropsWithChildren, useContext, useEffect } from 'react'; +import { parseColorScheme } from '../utils/color-scheme-helper'; +import { sharedEvent } from '../event'; +import { useStorage } from '../manager/storage'; + +const ColorSchemeContext = React.createContext<{ + /** + * 'dark' | 'light' | 'auto' | string + */ + colorScheme: string; + setColorScheme: (colorScheme: string) => void; +}>({ + colorScheme: 'dark', + setColorScheme: () => {}, +}); +ColorSchemeContext.displayName = 'ColorSchemeContext'; + +export const ColorSchemeContextProvider: React.FC = + React.memo((props) => { + const [colorScheme = 'dark', { save: setColorScheme }] = useStorage( + 'colorScheme', + 'dark' + ); + + useEffect(() => { + sharedEvent.emit('loadColorScheme', colorScheme); + }, [colorScheme]); + + return ( + + {props.children} + + ); + }); +ColorSchemeContextProvider.displayName = 'ColorSchemeContextProvider'; + +export function useColorScheme() { + const { colorScheme, setColorScheme } = useContext(ColorSchemeContext); + const { isDarkMode, extraSchemeName } = parseColorScheme(colorScheme); + + return { colorScheme, setColorScheme, isDarkMode, extraSchemeName }; +} diff --git a/client/shared/contexts/ConverseMessageContext.tsx b/client/shared/contexts/ConverseMessageContext.tsx new file mode 100644 index 00000000000..2ed1176a633 --- /dev/null +++ b/client/shared/contexts/ConverseMessageContext.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import type { ChatMessage, SendMessagePayload } from '../model/message'; +import { useConverseMessage } from '../redux/hooks/useConverseMessage'; +import { createContextFactory } from './factory'; + +interface ConverseMessageContextProps { + messages: ChatMessage[]; + loading: boolean; + error?: Error; + isLoadingMore: boolean; + hasMoreMessage: boolean; + fetchMoreMessage: () => Promise; + sendMessage: (payload: SendMessagePayload) => void | Promise; +} + +const { + Context: ConverseMessageContext, + useContext: useConverseMessageContext, +} = createContextFactory({ + defaultValue: {} as ConverseMessageContextProps, + displayName: 'ConverseMessageContext', +}); + +/** + * 会话消息列表相关上下文 + */ +export const ConverseMessageProvider: React.FC< + React.PropsWithChildren<{ + converseId: string; + isGroup: boolean; + }> +> = React.memo((props) => { + const { converseId, isGroup } = props; + const { + messages, + loading, + error, + isLoadingMore, + hasMoreMessage, + handleFetchMoreMessage: fetchMoreMessage, + handleSendMessage: sendMessage, + } = useConverseMessage({ + converseId, + isGroup, + }); + + return ( + + {props.children} + + ); +}); +ConverseMessageProvider.displayName = 'ConverseMessageProvider'; + +export { useConverseMessageContext }; diff --git a/shared/contexts/GroupInfoContext.tsx b/client/shared/contexts/GroupInfoContext.tsx similarity index 77% rename from shared/contexts/GroupInfoContext.tsx rename to client/shared/contexts/GroupInfoContext.tsx index c1b112fd55b..571eb80f98f 100644 --- a/shared/contexts/GroupInfoContext.tsx +++ b/client/shared/contexts/GroupInfoContext.tsx @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import React, { PropsWithChildren, useContext } from 'react'; import type { GroupInfo } from '..'; /** @@ -13,9 +13,11 @@ const GroupInfoContext = React.createContext({ }); GroupInfoContext.displayName = 'GroupInfoContext'; -export const GroupInfoContextProvider: React.FC<{ - groupInfo: GroupInfo; -}> = React.memo((props) => { +export const GroupInfoContextProvider: React.FC< + PropsWithChildren<{ + groupInfo: GroupInfo; + }> +> = React.memo((props) => { return ( { + defaultValue: Props; + displayName: string; +} + +export function createContextFactory( + options: CreateContextFactoryOptions +) { + const Context = React.createContext(options.defaultValue); + Context.displayName = options.displayName; + + function useContext(): Props { + return React.useContext(Context); + } + + return { + Context, + useContext, + }; +} diff --git a/client/shared/event/index.ts b/client/shared/event/index.ts new file mode 100644 index 00000000000..a205079519b --- /dev/null +++ b/client/shared/event/index.ts @@ -0,0 +1,111 @@ +import { useEffect } from 'react'; +import { useUpdateRef } from '../hooks/useUpdateRef'; +import type { ChatMessage, SendMessagePayload } from '../model/message'; +import { EventEmitter } from 'eventemitter-strict'; +import type { UserBaseInfo, UserSettings } from '../model/user'; + +/** + * 共享事件类型 + */ +export interface SharedEventMap { + /** + * 登录成功 + */ + loginSuccess: (userInfo: UserBaseInfo) => void; + + /** + * app加载成功 + */ + appLoaded: () => void; + + /** + * 修改配色方案 + */ + loadColorScheme: (schemeName: string) => void; + + /** + * 请求webrtc相关权限 + * 目前用于视频会议 + */ + ensureWebRTCPermission: () => void; + + /** + * 网络状态更新 + */ + updateNetworkStatus: ( + status: 'connected' | 'reconnecting' | 'disconnected' + ) => void; + + /** + * 发送消息 + */ + sendMessage: (payload: SendMessagePayload) => void; + + /** + * 回复消息事件 + * + * 如果为null则是清空 + */ + replyMessage: (payload: ChatMessage | null) => void; + + /** + * 接受到消息(所有的(相对receiveUnmutedMessage来说)) + */ + receiveMessage: (payload: ChatMessage) => void; + + /** + * 接受到未被静音的消息 + * 一般用于消息推送 + */ + receiveUnmutedMessage: (payload: ChatMessage) => void; + + /** + * 群组面板状态更新 + */ + groupPanelBadgeUpdate: () => void; + + /** + * 用户设置发生了变更 + */ + userSettingsUpdate: (userSettings: UserSettings) => void; +} +export type SharedEventType = keyof SharedEventMap; + +const bus = new EventEmitter(); + +/** + * 事件中心 + */ +export const sharedEvent = { + on(eventName: T, listener: SharedEventMap[T]) { + bus.on(eventName, listener); + }, + off(eventName: T, listener: SharedEventMap[T]) { + bus.off(eventName, listener); + }, + emit( + eventName: T, + ...args: Parameters + ) { + bus.emit(eventName, ...args); + }, +}; + +export function useSharedEventHandler< + T extends SharedEventType, + H extends SharedEventMap[T] +>(eventName: T, handler: H) { + const handlerRef = useUpdateRef(handler); + + useEffect(() => { + const _handler: SharedEventMap[T] = (...args: any[]) => { + (handlerRef.current as any)(...args); + }; + + sharedEvent.on(eventName, _handler); + + return () => { + sharedEvent.off(eventName, _handler); + }; + }, []); +} diff --git a/client/shared/helper/converse-helper.ts b/client/shared/helper/converse-helper.ts new file mode 100644 index 00000000000..3c916b8b901 --- /dev/null +++ b/client/shared/helper/converse-helper.ts @@ -0,0 +1,82 @@ +import { getReduxStore, isValidStr } from '..'; +import { getCachedConverseInfo, getCachedUserInfo } from '../cache/cache'; +import { t } from '../i18n'; +import type { ChatConverseInfo } from '../model/converse'; +import { appendUserDMConverse } from '../model/user'; +import type { FriendInfo } from '../redux/slices/user'; + +/** + * 确保私信会话存在 + */ +export async function ensureDMConverse( + converseId: string, + currentUserId: string +): Promise { + const converse = await getCachedConverseInfo(converseId); + if (converse === null) { + // TODO + throw new Error(t('找不到私信会话')); + } + + if (!converse.members.includes(currentUserId)) { + throw new Error(t('会话没有权限')); + } + + await appendUserDMConverse(converseId); // 添加到私人会话列表 + + return converse; +} + +export function buildFriendNicknameMap( + friends: FriendInfo[] +): Record { + const friendNicknameMap: Record = friends.reduce( + (prev, curr) => { + return { + ...prev, + [curr.id]: curr.nickname, + }; + }, + {} + ); + + return friendNicknameMap; +} + +/** + * 获取私信会话的会话名 + * @param userId 当前用户的ID(即自己) + * @param converse 会话信息 + */ +export async function getDMConverseName( + userId: string, + converse: Pick +): Promise { + if (isValidStr(converse.name)) { + return converse.name; + } + + const otherConverseMembers = converse.members.filter((m) => m !== userId); // 成员Id + const otherMembersInfo = await Promise.all( + otherConverseMembers.map((memberId) => getCachedUserInfo(memberId)) + ); + const friends = getReduxStore().getState().user.friends; + const friendNicknameMap = buildFriendNicknameMap(friends); + + const memberNicknames = otherMembersInfo.map((m) => { + if (friendNicknameMap[m._id]) { + return friendNicknameMap[m._id]; + } + + return m.nickname ?? ''; + }); + const len = memberNicknames.length; + + if (len === 1) { + return memberNicknames[0] ?? ''; + } else if (len === 2) { + return `${memberNicknames[0]}, ${memberNicknames[1]}`; + } else { + return `${memberNicknames[0]}, ${memberNicknames[1]} ...`; + } +} diff --git a/shared/hooks/factory/createUpdateEffect.ts b/client/shared/hooks/factory/createUpdateEffect.ts similarity index 100% rename from shared/hooks/factory/createUpdateEffect.ts rename to client/shared/hooks/factory/createUpdateEffect.ts diff --git a/shared/hooks/factory/createUseStorageState.ts b/client/shared/hooks/factory/createUseStorageState.ts similarity index 100% rename from shared/hooks/factory/createUseStorageState.ts rename to client/shared/hooks/factory/createUseStorageState.ts diff --git a/client/shared/hooks/model/useAvailableServices.ts b/client/shared/hooks/model/useAvailableServices.ts new file mode 100644 index 00000000000..a88662234df --- /dev/null +++ b/client/shared/hooks/model/useAvailableServices.ts @@ -0,0 +1,24 @@ +import { useEffect } from 'react'; +import { fetchAvailableServices } from '../../model/common'; +import { useAsyncFn } from '../useAsyncFn'; +import { useMemoizedFn } from '../useMemoizedFn'; + +/** + * 用于监测服务是否可用的hooks + */ +export function useAvailableServices() { + const [{ loading, value: availableServices }, fetch] = useAsyncFn(() => + fetchAvailableServices() + ); + + useEffect(() => { + fetch(); + }, []); + + const refetch = useMemoizedFn(async () => { + fetchAvailableServices.clearCache(); + fetch(); + }); + + return { loading, availableServices, refetch }; +} diff --git a/client/shared/hooks/model/useMessageNotifyEventFilter.tsx b/client/shared/hooks/model/useMessageNotifyEventFilter.tsx new file mode 100644 index 00000000000..f5c58973ea9 --- /dev/null +++ b/client/shared/hooks/model/useMessageNotifyEventFilter.tsx @@ -0,0 +1,23 @@ +import { sharedEvent, useSharedEventHandler } from '../../event'; +import { useUserNotifyMute } from './useUserSettings'; + +/** + * 消息通知翻译 + * 检查用户设置,接受已读消息并发送未静音消息 + * + * 接收到消息事件{receiveMessage} -> 检查是否被静音 -> 没有静音,发送{receiveUnmutedMessage}事件 + * -> 静音, 不做任何处理 + */ +export function useMessageNotifyEventFilter() { + const { checkIsMuted } = useUserNotifyMute(); + + useSharedEventHandler('receiveMessage', (payload) => { + if (!payload) { + return; + } + + if (!checkIsMuted(payload.converseId, payload.groupId)) { + sharedEvent.emit('receiveUnmutedMessage', payload); + } + }); +} diff --git a/client/shared/hooks/model/useUserInfo.ts b/client/shared/hooks/model/useUserInfo.ts new file mode 100644 index 00000000000..9ad0692a6d5 --- /dev/null +++ b/client/shared/hooks/model/useUserInfo.ts @@ -0,0 +1,19 @@ +import { getCachedUserInfo } from '../../cache/cache'; +import type { UserBaseInfo } from '../../model/user'; +import { useAsync } from '../useAsync'; + +/** + * 用户信息 + */ +export function useCachedUserInfo( + userId: string, + refetch = false +): UserBaseInfo | Record { + const { value: userInfo = {} } = useAsync(async () => { + const users = getCachedUserInfo(userId, refetch); + + return users; + }, [userId, refetch]); + + return userInfo ?? {}; +} diff --git a/shared/hooks/model/useUserInfoList.ts b/client/shared/hooks/model/useUserInfoList.ts similarity index 100% rename from shared/hooks/model/useUserInfoList.ts rename to client/shared/hooks/model/useUserInfoList.ts diff --git a/client/shared/hooks/model/useUserSettings.ts b/client/shared/hooks/model/useUserSettings.ts new file mode 100644 index 00000000000..595e10916bc --- /dev/null +++ b/client/shared/hooks/model/useUserSettings.ts @@ -0,0 +1,110 @@ +import { CacheKey } from '../../cache/cache'; +import { useQuery, useQueryClient } from '../../cache/useCache'; +import { sharedEvent } from '../../event'; +import { + getUserSettings, + setUserSettings, + UserSettings, +} from '../../model/user'; +import { useAsyncRequest } from '../useAsyncRequest'; +import { useMemoizedFn } from '../useMemoizedFn'; +import _without from 'lodash/without'; + +/** + * 用户设置hooks + */ +export function useUserSettings() { + const client = useQueryClient(); + const { data: settings, isLoading } = useQuery( + [CacheKey.userSettings], + () => getUserSettings(), + { + staleTime: 10 * 60 * 1000, // 缓存10分钟 + } + ); + + const [{ loading: saveLoading }, setSettings] = useAsyncRequest( + async (_settings: UserSettings) => { + client.setQueryData([CacheKey.userSettings], () => ({ + ...settings, + ..._settings, + })); // 让配置能够立即生效, 防止依赖配置的行为出现跳变(如GroupNav) + + const newSettings = await setUserSettings(_settings); + + client.setQueryData([CacheKey.userSettings], () => newSettings); + sharedEvent.emit('userSettingsUpdate', newSettings); + }, + [client] + ); + + return { + settings: settings ?? {}, + setSettings, + loading: isLoading || saveLoading, + }; +} + +/** + * 单个用户设置 + */ +export function useSingleUserSetting( + name: K, + defaultValue?: UserSettings[K] +) { + const { settings, setSettings, loading } = useUserSettings(); + + return { + value: settings[name] ?? defaultValue, + setValue: async (newVal: UserSettings[K]) => + setSettings({ + [name]: newVal, + }), + loading, + }; +} + +/** + * 用户消息通知免打扰设置 + */ +export function useUserNotifyMute() { + const { value: list = [], setValue: setList } = useSingleUserSetting( + 'messageNotificationMuteList', + [] + ); + + const mute = useMemoizedFn((converseOrGroupId: string) => { + setList([...list, converseOrGroupId]); + }); + + const unmute = useMemoizedFn((converseOrGroupId: string) => { + setList(_without(list, converseOrGroupId)); + }); + + const toggleMute = useMemoizedFn((converseOrGroupId) => { + if (list.includes(converseOrGroupId)) { + unmute(converseOrGroupId); + } else { + mute(converseOrGroupId); + } + }); + + /** + * 检查是否被静音 + */ + const checkIsMuted = useMemoizedFn((panelId: string, groupId?: string) => { + if (groupId) { + return list.includes(panelId) || list.includes(groupId); + } + + return list.includes(panelId); + }); + + return { + mutedList: list, + mute, + unmute, + toggleMute, + checkIsMuted, + }; +} diff --git a/shared/hooks/model/useUsernames.ts b/client/shared/hooks/model/useUsernames.ts similarity index 100% rename from shared/hooks/model/useUsernames.ts rename to client/shared/hooks/model/useUsernames.ts diff --git a/client/shared/hooks/useAlphaMode.ts b/client/shared/hooks/useAlphaMode.ts new file mode 100644 index 00000000000..27c68894f2c --- /dev/null +++ b/client/shared/hooks/useAlphaMode.ts @@ -0,0 +1,16 @@ +import { useStorage } from '../manager/storage'; + +const alphaModeKey = 'alphaMode'; + +/** + * 是否为 alpha 模式 + * 在 alpha 模式下可以看到一些可以被公开但是还在测试中的功能 + */ +export function useAlphaMode() { + const [isAlphaMode, { save: setAlphaMode }] = useStorage( + alphaModeKey, + false + ); + + return { isAlphaMode, setAlphaMode }; +} diff --git a/client/shared/hooks/useAsync.ts b/client/shared/hooks/useAsync.ts new file mode 100644 index 00000000000..8ea514d4990 --- /dev/null +++ b/client/shared/hooks/useAsync.ts @@ -0,0 +1,29 @@ +import { DependencyList, useEffect, useRef } from 'react'; +import type { FunctionReturningPromise } from '../types'; +import { useAsyncFn } from './useAsyncFn'; + +// Reference: https://github.com/streamich/react-use/blob/master/src/useAsync.ts + +export function useAsync( + fn: T, + deps: DependencyList = [] +) { + const [state, callback] = useAsyncFn(fn, deps, { + loading: true, + }); + const lockRef = useRef(false); + + useEffect(() => { + if (lockRef.current === true) { + return; + } + + if (deps.length === 0) { + lockRef.current = true; + } + + callback(); + }, [callback]); + + return state; +} diff --git a/shared/hooks/useAsyncFn.ts b/client/shared/hooks/useAsyncFn.ts similarity index 100% rename from shared/hooks/useAsyncFn.ts rename to client/shared/hooks/useAsyncFn.ts diff --git a/shared/hooks/useAsyncRefresh.ts b/client/shared/hooks/useAsyncRefresh.ts similarity index 100% rename from shared/hooks/useAsyncRefresh.ts rename to client/shared/hooks/useAsyncRefresh.ts diff --git a/client/shared/hooks/useAsyncRequest.ts b/client/shared/hooks/useAsyncRequest.ts new file mode 100644 index 00000000000..0a1da0dd98f --- /dev/null +++ b/client/shared/hooks/useAsyncRequest.ts @@ -0,0 +1,21 @@ +import type { DependencyList } from 'react'; +import { showErrorToasts } from '../manager/ui'; +import type { FunctionReturningPromise } from '../types'; +import { useAsyncFn } from './useAsyncFn'; + +export function useAsyncRequest( + fn: T, + deps: DependencyList = [] +) { + const [{ loading, value }, call] = useAsyncFn(async (...args: any[]) => { + try { + return await fn(...args); + } catch (err) { + // showErrorToasts(isDevelopment ? err : t('系统忙, 请稍后再试')); + showErrorToasts(err); // 暂时放开所有错误抛出,正确的做法应该是仅对于内置代码相关的逻辑显示placeholder报错 + console.error('[useAsyncRequest] error:', err); + } + }, deps); + + return [{ loading, value }, call as T] as const; +} diff --git a/client/shared/hooks/useDataReady.ts b/client/shared/hooks/useDataReady.ts new file mode 100644 index 00000000000..56ca5b64be7 --- /dev/null +++ b/client/shared/hooks/useDataReady.ts @@ -0,0 +1,27 @@ +import { DependencyList, useLayoutEffect, useRef } from 'react'; +import { useEvent } from './useEvent'; + +/** + * Call once on data ready(validator return true) + */ +export function useDataReady( + validator: () => boolean, + cb: () => void, + deps?: DependencyList +) { + const isReadyRef = useRef(false); + + const _validator = useEvent(validator); + const _callback = useEvent(cb); + + useLayoutEffect(() => { + if (isReadyRef.current) { + return; + } + + if (_validator() === true) { + _callback(); + isReadyRef.current = true; + } + }, deps); +} diff --git a/shared/hooks/useDebounce.ts b/client/shared/hooks/useDebounce.ts similarity index 100% rename from shared/hooks/useDebounce.ts rename to client/shared/hooks/useDebounce.ts diff --git a/client/shared/hooks/useEditValue.ts b/client/shared/hooks/useEditValue.ts new file mode 100644 index 00000000000..6363ba3b2ec --- /dev/null +++ b/client/shared/hooks/useEditValue.ts @@ -0,0 +1,15 @@ +import { useCallback, useLayoutEffect, useState } from 'react'; + +export function useEditValue(value: T, onChange: (val: T) => void) { + const [inner, setInner] = useState(value); + + useLayoutEffect(() => { + setInner(value); + }, [value]); + + const onSave = useCallback(() => { + onChange(inner); + }, [inner, onChange]); + + return [inner, setInner, onSave] as const; +} diff --git a/shared/hooks/useEffectOnce.ts b/client/shared/hooks/useEffectOnce.ts similarity index 100% rename from shared/hooks/useEffectOnce.ts rename to client/shared/hooks/useEffectOnce.ts diff --git a/client/shared/hooks/useEvent.ts b/client/shared/hooks/useEvent.ts new file mode 100644 index 00000000000..381cf5ab8ae --- /dev/null +++ b/client/shared/hooks/useEvent.ts @@ -0,0 +1,3 @@ +import { useMemoizedFn } from './useMemoizedFn'; + +export const useEvent = useMemoizedFn; diff --git a/client/shared/hooks/useInterval.ts b/client/shared/hooks/useInterval.ts new file mode 100644 index 00000000000..537401659a7 --- /dev/null +++ b/client/shared/hooks/useInterval.ts @@ -0,0 +1,41 @@ +import { useCallback, useEffect, useRef } from 'react'; +import { useUpdateRef } from './useUpdateRef'; + +export function useInterval( + fn: () => void, + delay: number | undefined, + options?: { + immediate?: boolean; + } +) { + const immediate = options?.immediate; + + const fnRef = useUpdateRef(fn); + const timerRef = useRef(); + + useEffect(() => { + if (typeof delay !== 'number' || delay < 0) { + return; + } + + if (immediate) { + fnRef.current(); + } + timerRef.current = window.setInterval(() => { + fnRef.current(); + }, delay); + return () => { + if (timerRef.current) { + window.clearInterval(timerRef.current); + } + }; + }, [delay]); + + const clear = useCallback(() => { + if (timerRef.current) { + window.clearInterval(timerRef.current); + } + }, []); + + return clear; +} diff --git a/client/shared/hooks/useLazyValue.ts b/client/shared/hooks/useLazyValue.ts new file mode 100644 index 00000000000..d21686469df --- /dev/null +++ b/client/shared/hooks/useLazyValue.ts @@ -0,0 +1,17 @@ +import { useLayoutEffect, useState } from 'react'; +import { useEvent } from './useEvent'; + +export function useLazyValue(value: T, onChange: (val: T) => void) { + const [inner, setInner] = useState(value); + + useLayoutEffect(() => { + setInner(value); + }, [value]); + + const handleChange = useEvent((val: T) => { + setInner(val); + onChange(val); + }); + + return [inner, handleChange] as const; +} diff --git a/shared/hooks/useMemoizedFn.ts b/client/shared/hooks/useMemoizedFn.ts similarity index 100% rename from shared/hooks/useMemoizedFn.ts rename to client/shared/hooks/useMemoizedFn.ts diff --git a/shared/hooks/useMountedState.ts b/client/shared/hooks/useMountedState.ts similarity index 100% rename from shared/hooks/useMountedState.ts rename to client/shared/hooks/useMountedState.ts diff --git a/shared/hooks/usePrevious.ts b/client/shared/hooks/usePrevious.ts similarity index 100% rename from shared/hooks/usePrevious.ts rename to client/shared/hooks/usePrevious.ts diff --git a/shared/hooks/useRafState.ts b/client/shared/hooks/useRafState.ts similarity index 100% rename from shared/hooks/useRafState.ts rename to client/shared/hooks/useRafState.ts diff --git a/client/shared/hooks/useSearch.ts b/client/shared/hooks/useSearch.ts new file mode 100644 index 00000000000..fa866cfb846 --- /dev/null +++ b/client/shared/hooks/useSearch.ts @@ -0,0 +1,57 @@ +import { useMemo, useState } from 'react'; +import { useFriendNicknameMap } from '../redux/hooks/useFriendNickname'; +import type { UserBaseInfo } from 'tailchat-types'; + +export interface UseSearchOptions { + dataSource: T[]; + filterFn: (item: T, searchText: string) => boolean; +} + +export function useSearch(options: UseSearchOptions) { + const { dataSource, filterFn } = options; + const [searchText, setSearchText] = useState(''); + const isSearching = searchText !== ''; + + const searchResult = useMemo(() => { + return dataSource.filter((item) => filterFn(item, searchText)); + }, [dataSource, searchText]); + + return { + searchText, + setSearchText, + isSearching, + searchResult, + }; +} + +/** + * 用于搜索用户的封装函数 + */ +export function useUserSearch(userInfos: UserBaseInfo[]) { + const friendNicknameMap = useFriendNicknameMap(); + const validUserInfos = useMemo(() => userInfos.filter(Boolean), [userInfos]); + + const { searchText, setSearchText, isSearching, searchResult } = useSearch({ + dataSource: validUserInfos, + filterFn: (item, searchText) => { + if (friendNicknameMap[item._id]) { + if (friendNicknameMap[item._id].includes(searchText)) { + return true; + } + } + + if (item.nickname.includes(searchText)) { + return true; + } + + return false; + }, + }); + + return { + searchText, + setSearchText, + isSearching, + searchResult, + }; +} diff --git a/client/shared/hooks/useShallowObject.ts b/client/shared/hooks/useShallowObject.ts new file mode 100644 index 00000000000..c5c47a64129 --- /dev/null +++ b/client/shared/hooks/useShallowObject.ts @@ -0,0 +1,17 @@ +import { useLayoutEffect, useState } from 'react'; +import { shallowEqual } from 'react-redux'; + +/** + * 对输入对象增加一层浅比较, 如果对象浅比较结果一致则返回原对象(防止更新) + */ +export function useShallowObject(object: T): T { + const [state, setState] = useState(object); + + useLayoutEffect(() => { + if (!shallowEqual(state, object)) { + setState(object); + } + }, [object]); + + return state; +} diff --git a/shared/hooks/useTimeoutFn.ts b/client/shared/hooks/useTimeoutFn.ts similarity index 100% rename from shared/hooks/useTimeoutFn.ts rename to client/shared/hooks/useTimeoutFn.ts diff --git a/shared/hooks/useUnmount.ts b/client/shared/hooks/useUnmount.ts similarity index 100% rename from shared/hooks/useUnmount.ts rename to client/shared/hooks/useUnmount.ts diff --git a/shared/hooks/useUpdateEffect.ts b/client/shared/hooks/useUpdateEffect.ts similarity index 100% rename from shared/hooks/useUpdateEffect.ts rename to client/shared/hooks/useUpdateEffect.ts diff --git a/shared/hooks/useUpdateRef.ts b/client/shared/hooks/useUpdateRef.ts similarity index 100% rename from shared/hooks/useUpdateRef.ts rename to client/shared/hooks/useUpdateRef.ts diff --git a/client/shared/hooks/useWatch.ts b/client/shared/hooks/useWatch.ts new file mode 100644 index 00000000000..10346f794f4 --- /dev/null +++ b/client/shared/hooks/useWatch.ts @@ -0,0 +1,12 @@ +import { DependencyList, useLayoutEffect } from 'react'; +import { useMemoizedFn } from './useMemoizedFn'; + +/** + * 监听变更并触发回调 + */ +export function useWatch(deps: DependencyList, cb: () => void) { + const memoizedFn = useMemoizedFn(cb); + useLayoutEffect(() => { + memoizedFn(); + }, deps); +} diff --git a/shared/hooks/useWhyDidYouUpdate.ts b/client/shared/hooks/useWhyDidYouUpdate.ts similarity index 97% rename from shared/hooks/useWhyDidYouUpdate.ts rename to client/shared/hooks/useWhyDidYouUpdate.ts index 098adf9f600..7574e89c39c 100644 --- a/shared/hooks/useWhyDidYouUpdate.ts +++ b/client/shared/hooks/useWhyDidYouUpdate.ts @@ -70,7 +70,7 @@ export function useWhyDidYouUpdate( to: props[key], changedKeys: props[key] && typeof props[key] === 'object' - ? Object.keys(latestProps.current[key]) + ? Object.keys(latestProps.current[key] as object) .map((k) => _get(latestProps.current, [key, k]) === _get(props, [key, k]) diff --git a/shared/i18n/Trans.tsx b/client/shared/i18n/Trans.tsx similarity index 100% rename from shared/i18n/Trans.tsx rename to client/shared/i18n/Trans.tsx diff --git a/client/shared/i18n/__mocks__/index.ts b/client/shared/i18n/__mocks__/index.ts new file mode 100644 index 00000000000..db70b659b8e --- /dev/null +++ b/client/shared/i18n/__mocks__/index.ts @@ -0,0 +1,9 @@ +export const t = (key: string) => { + return key; +}; + +export function onLanguageChanged() {} + +export function useTranslation() { + return { t }; +} diff --git a/client/shared/i18n/index.ts b/client/shared/i18n/index.ts new file mode 100644 index 00000000000..c132d0e2026 --- /dev/null +++ b/client/shared/i18n/index.ts @@ -0,0 +1,159 @@ +import i18next, { + StringMap, + TFunctionKeys, + TOptions, + TOptionsBase, +} from 'i18next'; +import { + useTranslation as useI18NTranslation, + initReactI18next, +} from 'react-i18next'; +import { crc32 } from 'crc'; +import { defaultLanguage, languageDetector } from './language'; +import { useState, useEffect } from 'react'; +import HttpApi from 'i18next-http-backend'; // https://github.com/i18next/i18next-http-backend + +/** + * 允许出现的语言 + */ +export type AllowedLanguage = 'zh-CN' | 'en-US'; + +i18next + .use(languageDetector) + .use(HttpApi) + .use(initReactI18next) + .init({ + fallbackLng: defaultLanguage, + load: 'currentOnly', + backend: { + loadPath: '/locales/{{lng}}/{{ns}}.json', + allowMultiLoading: false, + addPath: (...args: any[]) => { + console.log('Lost translate:', ...args); + }, + }, + react: { + // Reference: https://react.i18next.com/latest/trans-component#i-18-next-options + hashTransKey(defaultValue: string) { + // return a key based on defaultValue or if you prefer to just remind you should set a key return false and throw an error + return `k${crc32(defaultValue).toString(16)}`; + }, + }, + } as any); + +type TFunctionResult = string | React.ReactNode; + +// Fork from i18next +interface TFunction { + // basic usage + (key: TKeys): string; + < + TResult extends TFunctionResult = string, + TKeys extends TFunctionKeys = string, + TInterpolationMap extends object = StringMap + >( + key: TKeys, + options?: TOptions | string + ): TResult; + // overloaded usage + < + TResult extends TFunctionResult = string, + TKeys extends TFunctionKeys = string, + TInterpolationMap extends object = StringMap + >( + key: TKeys, + defaultValue?: string, + options?: TOptions | string + ): TResult; +} + +/** + * 国际化翻译 + */ +export const t: TFunction = ( + key: string, + defaultValue?: string, + options?: TOptionsBase & Record +) => { + try { + const hashKey = `k${crc32(key).toString(16)}`; + let words = i18next.t(hashKey, defaultValue, options); + if (words === hashKey) { + words = key; + console.info(`[i18n] 翻译缺失: [${hashKey}]${key}`); + } + return words; + } catch (err) { + console.error(err); + return key; + } +}; + +/** + * 本地翻译 + * @example + * localTrans({'zh-CN': '你好', 'en-US': 'Hello'}); + * + * @param trans 翻译对象 + */ +export function localTrans(trans: Record) { + const lang = i18next.language as AllowedLanguage; + return trans[lang] ?? trans['zh-CN'] ?? trans['en-US']; +} + +/** + * 设置i18next的语言 + */ +export async function setLanguage(lang: AllowedLanguage): Promise { + return new Promise((resolve, reject) => { + i18next.changeLanguage(lang, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +} + +/** + * 获取i18n语言 + */ +export function getLanguage(): AllowedLanguage { + return i18next.language as AllowedLanguage; +} + +/** + * 语言加载 + */ +export function onLanguageLoaded( + cb: (loaded: { [language: string]: { [namespace: string]: boolean } }) => void +) { + i18next.on('loaded', cb); +} + +/** + * 监听语言变更 + */ +export function onLanguageChanged(cb: (lang: string) => void) { + i18next.on('languageChanged', cb); +} + +/** + * fork from i18next/react-i18next/-/blob/src/useTranslation.js + * i18n for react 使用hooks + */ +export function useTranslation() { + const { t: i18nT, ready } = useI18NTranslation(); + + const [_t, _setT] = useState(() => t); + useEffect(() => { + _setT( + () => + (...args: any[]) => + (t as any)(...args) + ); + }, [i18nT]); + + return { t: _t, ready }; +} diff --git a/client/shared/i18n/langs/en-US/translation.json b/client/shared/i18n/langs/en-US/translation.json new file mode 100644 index 00000000000..c680f0e045e --- /dev/null +++ b/client/shared/i18n/langs/en-US/translation.json @@ -0,0 +1,460 @@ +{ + "k10416951": "Unable to remove everyone permission", + "k1096add": "Create permanent invite code", + "k10c018fe": "Teamwork", + "k1141d649": "Version update", + "k11cef91e": "There are some problems with the page", + "k123852c": "Group privacy control to prevent malicious harassment of users through groups.", + "k1252f904": "Gateway", + "k131598d0": "A new version is detected, whether to refresh immediately to upgrade to the latest content", + "k13ae6a93": "Copy", + "k13bea6d2": "User not found", + "k1431a9e8": "Saving, please wait", + "k14565202": "Allow deletion of user information", + "k1704ea49": "Install", + "k170859cb": "A communication platform completely exclusive to the private team", + "k17777797": "The panel is provided by the plugin", + "k18470bc9": "No permissions available yet", + "k18580d81": "Create a link and send it to external friends", + "k186fec4": "Plugin failed to load", + "k1885734a": "Effective after refreshing the page", + "k18c716ce": "Password cannot be less than 6 digits", + "k19885be1": "Panel name is too long", + "k19a1647f": "1 minute", + "k1a377364": "Message List Virtualization", + "k1a78e6f0": "Expiration", + "k1ac0bd00": "30 days", + "k1b3d8c72": "Group Not Found", + "k1bc58056": "Private Message Service", + "k1bd56481": "Close independent window", + "k1cbe2507": "Confirm", + "k1d31c76f": "The search content is too short to search", + "k1d8e2fac": "View group details", + "k1d9d0746": "User ID", + "k1ea177bd": "Group privacy control to prevent malicious access to member information through groups", + "k1ea9f5ff": "Verified", + "k206eff71": "Nickname can not be blank", + "k21ee7a1f": "Roles", + "k226a52c3": "Invite settings modified successfully", + "k22ffe5e9": "Allow to manage users", + "k2317a90c": "Clear Inbox", + "k23a3bd72": "Abnormal", + "k2426e452": "Friend Service", + "k2488f9ee": "Friend Request", + "k249e23b9": "E-mail format is incorrect", + "k24ccd723": "Refresh now", + "k250e392c": "System is busy, please try again later", + "k263bff41": "Edit invite link", + "k267cc491": "Me", + "k29498d11": "Can be used <2>{{num}} times", + "k2a1422d2": "Configuration", + "k2a8031e": "Homepage", + "k2b411a11": "Component can only work in the group panel", + "k2c6ee8d": "Confirm the action", + "k2c7df74f": "Modify Group Panel", + "k2d6cfb27": "Chat Channel", + "k2ec4966c": "Selected {{num}} items", + "k2edb3d74": "Guest", + "k2ef618a2": "Reset friend nickname", + "k3081870c": "More", + "k30d67866": "Open Source url", + "k313bda4b": "OTP", + "k3172297b": "This feature is not yet open", + "k31881498": "Microkernel-based frontend plugin support, private customization", + "k31a9d6a3": "The connect to the server is broken", + "k323b5cc7": "Recall", + "k3279c602": "Add now", + "k32905632": "Unlimited invitation link", + "k32ccc323": "Invitation code has expired", + "k335c71bf": "OTP code cannot be empty", + "k3376f80c": "Please enter key words", + "k34b5e3ab": "Send Message", + "k34e357ee": "Group Summary", + "k35abe359": "Lobby", + "k35f486ba": "Nickname", + "k35f990b0": "View Detail", + "k3662c0d4": "Please select a panel", + "k375be8c3": "Jump to panel", + "k378f66fc": "Unmute", + "k393892b6": "Upload original image", + "k3a31dae3": "Verification email sent", + "k3ac17670": "An exception occurred, store create failed", + "k3b4b656d": "About", + "k3bbf3bbd": "Register Account", + "k3be3882c": "Mute", + "k3c3a4b87": "Confirm changes and refresh the page", + "k3c502edb": "E-mail can not be empty", + "k3c7c48f8": "Invite not found", + "k3c8fd4c2": "Nickname", + "k3c960528": "Mute", + "k3e0c272": "Service Url", + "k3e514bd0": "Panel name cannot be empty", + "k3e7f3579": "Cannot send empty message", + "k3f3597fc": "All", + "k3fe97dcc": "System settings", + "k41064134": "DM", + "k411db0fd": "Search chat messages", + "k416e301a": "An exception occurred, Socket creation failed", + "k419da0ef": "Message explanation", + "k41a0bacf": "12 hours", + "k41aea19d": "Only supports http paths", + "k4231ab36": "Performance statistics", + "k42a98418": "File Service", + "k4539164b": "The OTP code is 6 digits", + "k45e2f71f": "Temporary users cannot verify email address, please claim account first", + "k4603baea": "Create Group Panel", + "k4614aa7": "iframe is not supported", + "k465636d6": "Loading webview...", + "k473d1bbf": "Builtin Email", + "k47489688": "Group Service", + "k48a38bc1": "Group not found", + "k49721de0": "Reset Password", + "k4a573576": "Unable to modify the display name of the Everyone permission group", + "k4c6cd28": "6 hours", + "k4cda3b42": "30 minutes", + "k4d32a754": "Group Name", + "k4e456fee": "50 uses", + "k4f672109": "Failed to load global configuration", + "k4f69cbc9": "Forget Password", + "k50504f9e": "Upload picture to converse", + "k50d471b2": "Reset", + "k511aea70": "Permissions", + "k51243586": "Add friend", + "k517db7e5": "Text Channel", + "k51db56bf": "Temporary Meeting", + "k52643761": "6-digit OTP code", + "k5343016d": "Modify group description successfully", + "k547a7a99": "This record was not found", + "k551b0348": "Password", + "k56f9469b": "No friends yet", + "k570b61fc": "Send verification email to {{email}}", + "k57ab4d97": "Please select user", + "k58a85592": "Is not a valid plugin configuration", + "k5a0084e7": "Modify group configuration", + "k5ab727ca": "This invitation will expire on <2><0>{{date}}", + "k5bb71ad7": "Installed", + "k5be1a5b0": "Delete role group", + "k5bec387": "Unable to get group information", + "k5ce4e16d": "Clear", + "k5d1e4cd8": "Custom styles are not supported", + "k5d2a6631": "Allow to manage channels", + "k5f91e72c": "Built Plugins", + "k5fc9ccb6": "Operation too frequently", + "k5fde4f8e": "Assign roles", + "k609d9f28": "Please enter the server address (example: http://127.0.0.1:11000)", + "k61a1db2": "Already applied", + "k62051fcc": "Upload failed", + "k620a58f8": "Guest Login", + "k621f7e70": "Quick search, jump", + "k62f009e7": "Modify group name success", + "k630ccbcb": "Plugin install successed", + "k63244ef6": "Remove from group", + "k63857abf": "Confirm Create", + "k64ce2315": "Delete message", + "k651efa29": "Change friend nickname", + "k65b21404": "Download", + "k6686ad69": "Select group members", + "k66ce073e": "Offline", + "k6728eaaa": "No Data", + "k67d68dd1": "Type", + "k68022ee7": "All", + "k68283d04": "Application sent", + "k685a1e78": "Copied to clipboard", + "k6910ad02": "Send OTP code", + "k6b5e7ffe": "The current panel has been opened in a separate window", + "k6b82e672": "The plugin is installed successfully, and it will take effect after refreshing the page", + "k6c29eece": "Allows members to send message in text channels", + "k6c75d61f": "Modify group avatar success", + "k6cc401b0": "No role groups are currently selected", + "k6cd79ab": "Click for details", + "k6e4e3d7a": "All messages in this group are marked as read", + "k6eac768d": "Add Roles", + "k6ee71a71": "Global Configuration", + "k6efe275c": "Mark as read", + "k6fb230da": "Pending friend request", + "k6fc3abcd": "Enter now", + "k705ca774": "Hide member full name", + "k70751578": "Jump to converse", + "k70b73a14": "1 use", + "k7173d09e": "Account", + "k736edc2f": "Old and new passwords do not match", + "k73d9fc70": "Allow members to view admin channels", + "k7431ccfa": "The password is limited to 40 characters at most", + "k7437914b": "Panel Group", + "k744ee9a": "Create Group", + "k74aef1ad": "Members", + "k74c146d3": "Openapi Bot", + "k74e53051": "Account authorization has expired, automatically jump to the login page after 2 seconds", + "k7640ae2a": "OTP is 6 digits", + "k76950a82": "Find friends faster with personal nicknames. Visible only to you.", + "k77d3028d": "Unknown Panel", + "k77ee6a43": "Member Manage", + "k78102887": "Member Count", + "k78e52ed0": "Accept", + "k79304fa9": "Nickname changed successfully", + "k795c9a6e": "5 uses", + "k7a2ccf9b": "Search Friends", + "k7a89720": "Open in new window", + "k7b662ad7": "Content not found", + "k7c232f9e": "Panel", + "k7cf4e7ff": "Message deleted successfully", + "k7daa1233": "Are you sure you want to mute {{name}}", + "k7daefc98": "Invite you to join the group", + "k7ec9199a": "Friend request waiting for process", + "k7f0c746d": "Operation successful", + "k7fc7e508": "Dark Mode", + "k80a6b351": "Convert URL to rich text", + "k814bdc7a": "Is not a valid JSON string", + "k8157b129": "25 uses", + "k81662255": "Create invitation code", + "k821ff85a": "Common", + "k823bfe63": "Online", + "k8266bcf2": "New password", + "k83ede286": "Ack Service", + "k84a3bd27": "Invitation link", + "k8582af3f": "Refuse", + "k86f06fee": "7 days", + "k872b58dd": "Send OTP code to email", + "k87a609ad": "Please do not install plugins from unknown sources, it may steal your personal information in Tailchat", + "k87dd7754": "Mention (@) your message will appear here", + "k8990744f": "Maximum number of uses", + "k89df1d1e": "The network is abnormal", + "k8abdba5c": "Has been sent", + "k8acbe00": "Current service available", + "k8b501189": "Service Status", + "k8caee957": "Invite friends to converse", + "k8dc86b13": "Pin", + "k8e7fb0d7": "MiniStar App initialization failed", + "k8eb450d4": "Invitation code information not found", + "k8f6ab535": "Unable to install", + "k8f6dfd40": "Current members", + "k9179206d": "Reconnecting", + "k924278f0": "Remove user [{{name}}] role [{{roleName}}] success", + "k9277af78": "Retry", + "k92a84117": "Claim account", + "k95222176": "Unread", + "k9792c6b6": "Highly customizable IM tool", + "k979fc780": "Unable to join the room, you will not be able to get the latest information, please refresh the page and try again", + "k9a2ea218": "No search results", + "k9b0bdb34": "Allow members to view group details", + "k9b91079c": "All readed", + "k9bb01902": "Show Detail", + "k9d343e46": "Haven't logged in yet, login now", + "k9d5a843a": "Mail Service", + "k9d80acdf": "Verify email", + "k9d901c20": "Meeting room", + "k9dfa2c97": "never expires", + "k9e53c664": "Submit", + "k9f3089ce": "Create", + "k9f7d7de": "Email address is limited to 40 characters", + "k9fa72780": "Conversation with {{name}}", + "k9fc409ec": "Install Succeed", + "ka01a00eb": "System language", + "ka0451c97": "Cancel", + "ka0be0bd9": "Allow members to edit invite links", + "ka0ccce44": "100 uses", + "ka29e9508": "Send Image", + "ka2c48894": "Customize your group", + "ka2ed2b61": "Are you sure you want to do this?", + "ka30dd0bc": "This action cannot be undo", + "ka35f4202": "Group Background", + "ka39b3032": "1 day", + "ka49ec177": "Input something", + "ka4cebef8": "New Role", + "ka4dac521": "Are you sure you want to delete role {{name}}?", + "ka50c7408": "Please enter the JSON information manually, if you are not sure what you are doing, please do not use this function", + "ka5616453": "Mute {{length}}, expected until {{until}}", + "ka58c246": "Group Description", + "ka5d64ee9": "Choose the following template and start creating your own group!", + "ka62886b9": "Load File Failed", + "ka64624b1": "Join the group successfully!", + "ka6617615": "embed is not supported", + "ka697d1d8": "Password modify complete", + "ka7907771": "Save Successful", + "ka7ecc377": "Unpin", + "ka820940c": "Never", + "ka8c42876": "Chat Messages", + "ka9481f95": "Creator", + "kaa040a8e": "Default Group", + "kaa7d786e": "Create Converse", + "kaaf56f78": "Debug", + "kabb39529": "Save changes", + "kabb6a177": "Features (Highlights)", + "kabbd6e6": "Document", + "kabfe9512": "Save", + "kac147c07": "Advanced permission control", + "kad207008": "Edit", + "kadeb7a89": "Not supported documentation links", + "kae072a10": "Not found this account", + "kae0a0c12": "Search user", + "kaeec12de": "Manual Install", + "kaefc1e64": "Password reset successful, now back to login page", + "kaf403ef0": "Light Mode", + "kaf51d834": "Reset to default", + "kb01f8383": "Learn More", + "kb030fbd1": "Member List", + "kb05820d2": "Custom HTML is not supported", + "kb0584341": "Usage Count", + "kb07659b0": "Repeat password", + "kb123dbb9": "Your personal unique identifier", + "kb12cc88f": "Unmute", + "kb2217aa7": "Currently using a temporary account, <2>claim now", + "kb3390ae7": "Are you sure you want to leave the group?", + "kb47a9aa4": "Password can not be empty", + "kb488372f": "All", + "kb48baefe": "Upload failed, maximum supported file size is ", + "kb55c8dba": "Invite Member", + "kb5a17e73": "Leave group", + "kb5de89d1": "Inbox", + "kb6aefd9c": "It looks like multiple clipboard processing tools are matched at the same time. Please select one or ignore it.", + "kb6f1c83f": "What do you want to call you?", + "kb76d94e0": "Refresh", + "kb7a57f24": "Plugin Registry Service", + "kb8021af2": "Disable create converse from group", + "kb86bd9c9": "View Panel", + "kb8ec7062": "Email verification passed", + "kb93f5858": "Allow members to modify group basic information", + "kb96b79c5": "Allow management of invitation links", + "kbc76781d": "No permission to send messages, please contact the group owner", + "kbcacf812": "Are you sure to clear the inbox?", + "kbcb00ae5": "There is no further description for this plugin", + "kbcf55e47": "User Service", + "kbe20d511": "The user information was not found, there may be some exceptions", + "kbef193d": "Invitation link copied to clipboard", + "kbef5b92e": "Copy Link", + "kbf38b110": "Close message context menu", + "kc14b2ea3": "Back", + "kc161f3a6": "1 hour", + "kc1a5303e": "Panel-based group space, highly customizable", + "kc1afdd08": "Don't worry, you can make changes anytime after this", + "kc1bfb977": "Login {{serverName}}", + "kc2d30ab7": "Plugin Name", + "kc44374ad": "Personalized configuration of the group background will be displayed on the group invitation page", + "kc54eb75": "In Alpha mode, some functions that are still in the testing stage will be opened. If there is any problem, welcome to feedback.", + "kc625cd59": "Summary", + "kc654b275": "Email", + "kc6e50666": "Color Scheme", + "kc6f6df4": "Do you want to uninstall the plugin", + "kc74e5f62": "Search for members", + "kc77e00c7": "Allow members to view the panel", + "kc7cc96c8": "From", + "kc8c4ccbb": "Grant user [{{name}}] role [{{roleName}}] success", + "kc9283683": "Are you sure you want to delete the panel [{{name}}]", + "kc9bd3ad6": "Reset to default permissions", + "kc9cc6154": "Friends", + "kca811bd0": "Modify group basic information", + "kcac0467c": "Allow members to create invitation links", + "kcb20f8ce": "The following are plugin permissions", + "kcb8e662f": "Converse Service", + "kceea83fc": "Join Group", + "kcefdbe2d": "Modify avatar success", + "kd0690a45": "Allow management of identity groups", + "kd080f2d7": "Reload", + "kd0a4e6a6": "Plugin Bot", + "kd0d594e4": "Distributed deployment can be used at any scale", + "kd1af615e": "Panel not found", + "kd28c05df": "Create Success", + "kd2c1a316": "Login", + "kd2e5e126": "Panel Manage", + "kd40fe694": "Send OTP to mailbox", + "kd417f93a": "Do you want to delete the other party from your friend list? Note: You will not disappear from the other party's friend list", + "kd4216b7b": "Create Link", + "kd455acf4": "Sent successfully, please check your email.", + "kd4cf1cb8": "File", + "kd4ff36fa": "Search Friends", + "kd637a30": "Group Invite Service", + "kd7096593": "Unverified", + "kd8370399": "May be the file size is too large", + "kd8563e87": "New message", + "kd8d2b865": "Group Configuration", + "kd955767f": "This invitation code never expires", + "kd983a61a": "{{nickname}} recall a message", + "kd9fd7273": "Show more", + "kda0e155e": "Create multiplayer converse", + "kda229684": "Request parameter verification failed", + "kda67b115": "Unknown panel type", + "kdae72bb7": "Unable to get panel info", + "kdb57357d": "Connection failed", + "kdc18deca": "Invite users", + "kdc3e5cf6": "No friend requests pending", + "kdc4b4f92": "Public", + "kdc85707f": "Allow members to modify group configuration", + "kdc8de4ff": "Auto", + "kdce55773": "The plugin is uninstalled successfully, and it will take effect after refreshing the page", + "kdd4c838c": "Jump to Group", + "kdd6c18f8": "Service exception", + "kdef84ee6": "Plugin", + "kdf6e53ca": "Converse does not have permission", + "kdf89681f": "Add friend nickname", + "ke00c5a2f": "An open source IM for everyone", + "ke0131e71": "Recommended aspect: 16:9 | Recommended size: 1280x720", + "ke0161a83": "Reset to default address", + "ke03e2010": "No panel access", + "ke040edce": "No rendering method of this type found", + "ke071c620": "Allow members to manage users, such as banning, removing users, etc.", + "ke08ea159": "Copy selected text successfully", + "ke17b2c87": "Do not upload pictures that violate local laws and regulations", + "ke187440d": "Panel type cannot be empty", + "ke2431c67": "Plugin render function does not exist", + "ke3a77a77": "Unlimited", + "ke3d797fd": "Drop files to send into current converse", + "ke59ffe49": "Muted, there are {{remain}} left", + "ke6da074f": "The message was withdrawn successfully", + "ke9748e88": "Custom Meta is not supported", + "keb053701": "Copy message text successfully", + "kec46a57f": "Add members", + "kecb51e2c": "Old password", + "kecbb0e45": "System", + "kecbd7449": "Delete", + "ked2baf28": "Loading...", + "ked5385d5": "Create Panel", + "keda14478": "You are the group manager, leaving the group will cause the group to be dissolved", + "kedee406c": "5 minutes", + "kee059e5e": "Are you sure you want to remove this user from the group?", + "kee3eb950": "Email OTP code", + "kee9108f1": "Modify success", + "keeaa43fb": "Unknown card type", + "kef25594f": "Nickname#0000", + "kef3676e1": "The invitation code has expired", + "kef517e2e": "Send File", + "kef9abce1": "Allow members to create unlimited invite links", + "kefaf9956": "Created", + "kefc07278": "Back to login", + "keff3c3f": "10 minutes", + "kf02c6db": "Friend List", + "kf0bb5ed9": "Mention me in a message", + "kf0d58254": "Current Version", + "kf0d97e0b": "Friend deleted successfully", + "kf1396f1f": "Role group name", + "kf15499b4": "Logout", + "kf1eac01c": "Failed to load group information", + "kf22210a": "Loading plugin list", + "kf3fa6059": "You can use the complete <1>nickname#identifier to add friends", + "kf431f1b2": "Allow members to manage invitation links", + "kf4567a1": "Copy the invitation link", + "kf48ae58": "Group information not found", + "kf53a7774": "Allow members to manage role groups", + "kf5422f1b": "Joined, click to group", + "kf5543e44": "Expired", + "kf5861d84": "No friend requests have been sent yet", + "kf5d66247": "Panel Name", + "kf6d7f23d": "Connecting to chat server...", + "kf7215b17": "Forget Password?", + "kf7d6acd4": "Create Guest", + "kf7d829eb": "Wait to process", + "kf876a42d": "Modify Password", + "kf87f3059": "Plugin Store", + "kf8de33b7": "Plugin provider not found", + "kf9235c11": "Something went wrong", + "kf94465ba": "Invite Code", + "kfa01c850": "No private message found", + "kfa493f3f": "Reply", + "kfa610536": "Alpha mode switch", + "kfaddd61d": "Chat Service", + "kfbecf2a7": "Are you sure you want to delete the panel group [{{name}}] and all subordinate panels", + "kfc07c0a4": "Here is the beginning of all messages, please feel free to speak up.", + "kfc0ccc0e": "It can be modified at any time in the user settings later", + "kfd340bbc": "Manage members", + "kfe731dfc": "Action", + "kfe9c1c6c": "10 uses" +} diff --git a/client/shared/i18n/langs/zh-CN/translation.json b/client/shared/i18n/langs/zh-CN/translation.json new file mode 100644 index 00000000000..a70775ba041 --- /dev/null +++ b/client/shared/i18n/langs/zh-CN/translation.json @@ -0,0 +1,460 @@ +{ + "k10416951": "无法删除所有人权限", + "k1096add": "创建永久邀请码", + "k10c018fe": "工作协同", + "k1141d649": "更新版本", + "k11cef91e": "页面出现了一些问题", + "k123852c": "群组隐私控制,防止通过群组恶意骚扰用户。", + "k1252f904": "服务网关", + "k131598d0": "检测到有新版本, 是否立即刷新以升级到最新内容", + "k13ae6a93": "复制", + "k13bea6d2": "没有找到用户", + "k1431a9e8": "正在保存, 请稍后", + "k14565202": "允许删除用户信息", + "k1704ea49": "安装", + "k170859cb": "完全独属于私人团队的沟通平台", + "k17777797": "该面板由插件提供", + "k18470bc9": "暂无可用的权限项", + "k18580d81": "创建链接并发送给外部好友", + "k186fec4": "插件加载失败", + "k1885734a": "刷新页面后生效", + "k18c716ce": "密码不能低于6位", + "k19885be1": "面板名过长", + "k19a1647f": "1分钟", + "k1a377364": "聊天列表虚拟化", + "k1a78e6f0": "过期时间", + "k1ac0bd00": "30天", + "k1b3d8c72": "群组未找到", + "k1bc58056": "私信服务", + "k1bd56481": "关闭独立窗口", + "k1cbe2507": "确认", + "k1d31c76f": "搜索内容太短无法搜索", + "k1d8e2fac": "查看群组详情", + "k1d9d0746": "用户ID", + "k1ea177bd": "群组隐私控制,防止通过群组恶意获取成员信息", + "k1ea9f5ff": "已认证", + "k206eff71": "昵称不能为空", + "k21ee7a1f": "身份组", + "k226a52c3": "邀请设置修改成功", + "k22ffe5e9": "允许管理用户", + "k2317a90c": "清空收件箱", + "k23a3bd72": "异常", + "k2426e452": "好友服务", + "k2488f9ee": "申请好友", + "k249e23b9": "邮箱格式不正确", + "k24ccd723": "立即刷新", + "k250e392c": "系统忙, 请稍后再试", + "k263bff41": "编辑邀请链接", + "k267cc491": "我", + "k29498d11": "可使用 <2>{{num}} 次", + "k2a1422d2": "配置", + "k2a8031e": "个人主页", + "k2b411a11": "组件只能在群组面板中才能正常显示", + "k2c6ee8d": "确认操作", + "k2c7df74f": "编辑群组面板", + "k2d6cfb27": "聊天频道", + "k2ec4966c": "已选择 {{num}} 项", + "k2edb3d74": "游客", + "k2ef618a2": "重置好友昵称", + "k3081870c": "更多", + "k30d67866": "开源地址", + "k313bda4b": "OTP", + "k3172297b": "该功能暂未开放", + "k31881498": "基于微内核的前端插件支撑, 私人定制化", + "k31a9d6a3": "与服务器的链接已断开", + "k323b5cc7": "撤回", + "k3279c602": "立即添加", + "k32905632": "不限时邀请链接", + "k32ccc323": "邀请码已过期", + "k335c71bf": "校验码不能为空", + "k3376f80c": "请输入关键字", + "k34b5e3ab": "发送消息", + "k34e357ee": "群组概述", + "k35abe359": "大厅", + "k35f486ba": "用户昵称", + "k35f990b0": "查看详情", + "k3662c0d4": "请选择面板", + "k375be8c3": "跳转到面板", + "k378f66fc": "解除禁言", + "k393892b6": "上传原图", + "k3a31dae3": "已发送认证邮件", + "k3ac17670": "出现异常, Store 创建失败", + "k3b4b656d": "关于", + "k3bbf3bbd": "注册账号", + "k3be3882c": "免打扰", + "k3c3a4b87": "确认修改并刷新页面", + "k3c502edb": "邮箱不能为空", + "k3c7c48f8": "找不到邀请信息", + "k3c8fd4c2": "昵称", + "k3c960528": "禁言", + "k3e0c272": "服务端地址", + "k3e514bd0": "面板名不能为空", + "k3e7f3579": "无法发送空消息", + "k3f3597fc": "全员", + "k3fe97dcc": "系统设置", + "k41064134": "私信", + "k411db0fd": "聊天记录搜索", + "k416e301a": "出现异常, Socket 创建失败", + "k419da0ef": "消息解释", + "k41a0bacf": "12小时", + "k41aea19d": "只支持http路径", + "k4231ab36": "性能统计", + "k42a98418": "文件服务", + "k4539164b": "校验码为6位", + "k45e2f71f": "临时用户无法认证邮箱, 请先认领账号", + "k4603baea": "创建群组面板", + "k4614aa7": "不支持iframe", + "k465636d6": "加载网页中...", + "k473d1bbf": "内置邮箱", + "k47489688": "群组服务", + "k48a38bc1": "群组不存在", + "k49721de0": "重设密码", + "k4a573576": "无法修改所有人权限组的显示名称", + "k4c6cd28": "6小时", + "k4cda3b42": "30分钟", + "k4d32a754": "群组名称", + "k4e456fee": "50次使用", + "k4f672109": "全局配置加载失败", + "k4f69cbc9": "忘记密码", + "k50504f9e": "上传图片到会话", + "k50d471b2": "重置", + "k511aea70": "权限", + "k51243586": "添加好友", + "k517db7e5": "文字频道", + "k51db56bf": "临时会议", + "k52643761": "6位校验码", + "k5343016d": "修改群组描述成功", + "k547a7a99": "没有找到该记录", + "k551b0348": "密码", + "k56f9469b": "暂无好友", + "k570b61fc": "向 {{email}} 发送认证邮件", + "k57ab4d97": "请选择用户", + "k58a85592": "不是一个合法的插件配置", + "k5a0084e7": "修改群组配置", + "k5ab727ca": "该邀请将于 <2><0>{{date}} 过期", + "k5bb71ad7": "已安装", + "k5be1a5b0": "删除身份组", + "k5bec387": "无法获取到群组信息", + "k5ce4e16d": "清除", + "k5d1e4cd8": "不支持自定义样式", + "k5d2a6631": "允许管理频道", + "k5f91e72c": "内置插件", + "k5fc9ccb6": "操作过于频繁", + "k5fde4f8e": "分配身份组", + "k609d9f28": "请输入服务器地址(示例: http://127.0.0.1:11000)", + "k61a1db2": "已申请", + "k62051fcc": "上传失败", + "k620a58f8": "游客访问", + "k621f7e70": "快速搜索、跳转", + "k62f009e7": "修改群组名成功", + "k630ccbcb": "插件安装成功", + "k63244ef6": "移出群组", + "k63857abf": "确认创建", + "k64ce2315": "删除消息", + "k651efa29": "更改好友昵称", + "k65b21404": "下载", + "k6686ad69": "选择群组成员", + "k66ce073e": "离线", + "k6728eaaa": "没有数据", + "k67d68dd1": "类型", + "k68022ee7": "全部", + "k68283d04": "已发送申请", + "k685a1e78": "已复制到剪切板", + "k6910ad02": "发送校验码", + "k6b5e7ffe": "当前面板已在独立窗口打开", + "k6b82e672": "插件安装成功, 刷新页面后生效", + "k6c29eece": "允许成员在文字频道发送消息", + "k6c75d61f": "修改群组头像成功", + "k6cc401b0": "当前没有选择任何角色组", + "k6cd79ab": "点击查看详情", + "k6e4e3d7a": "已标记该群组所有消息已读", + "k6eac768d": "添加身份组", + "k6ee71a71": "全局配置", + "k6efe275c": "标记为已读", + "k6fb230da": "等待处理的好友请求", + "k6fc3abcd": "立即进入", + "k705ca774": "隐藏成员完整名称", + "k70751578": "跳转到会话", + "k70b73a14": "1次使用", + "k7173d09e": "账户信息", + "k736edc2f": "新旧密码不匹配", + "k73d9fc70": "允许成员查看管理频道", + "k7431ccfa": "密码最长限制40个字符", + "k7437914b": "面板分组", + "k744ee9a": "创建群组", + "k74aef1ad": "成员", + "k74c146d3": "开放平台机器人", + "k74e53051": "账号授权已过期, 2秒后自动跳转到登录页", + "k7640ae2a": "OTP为6位数字", + "k76950a82": "使用个人昵称更快地找到好友。仅您自己可见。", + "k77d3028d": "未知的面板", + "k77ee6a43": "成员管理", + "k78102887": "成员数", + "k78e52ed0": "接受", + "k79304fa9": "修改昵称成功", + "k795c9a6e": "5次使用", + "k7a2ccf9b": "搜索好友", + "k7a89720": "在新窗口打开", + "k7b662ad7": "未找到内容", + "k7c232f9e": "面板", + "k7cf4e7ff": "消息删除成功", + "k7daa1233": "确定要禁言 {{name}} 么", + "k7daefc98": "邀请您加入群组", + "k7ec9199a": "等待对方处理的好友请求", + "k7f0c746d": "操作成功", + "k7fc7e508": "暗黑模式", + "k80a6b351": "转为Url富文本", + "k814bdc7a": "不是一个合法的JSON字符串", + "k8157b129": "25次使用", + "k81662255": "创建邀请码", + "k821ff85a": "通用", + "k823bfe63": "在线", + "k8266bcf2": "新密码", + "k83ede286": "已读服务", + "k84a3bd27": "邀请链接", + "k8582af3f": "拒绝", + "k86f06fee": "7天", + "k872b58dd": "向邮箱发送校验码", + "k87a609ad": "请不要安装不明来源的插件,这可能会盗取你在 Tailchat 的个人信息", + "k87dd7754": "提及(@)您的消息会在这里出现哦", + "k8990744f": "最大使用次数", + "k89df1d1e": "网络出现异常", + "k8abdba5c": "已发送", + "k8acbe00": "当前服务可用", + "k8b501189": "服务状态", + "k8caee957": "邀请好友加入会话", + "k8dc86b13": "Pin", + "k8e7fb0d7": "MiniStar 应用初始化失败", + "k8eb450d4": "未找到邀请码信息", + "k8f6ab535": "无法安装", + "k8f6dfd40": "当前成员数", + "k9179206d": "正在重新链接", + "k924278f0": "移除用户 [{{name}}] 身份组 [{{roleName}}] 成功", + "k9277af78": "重试", + "k92a84117": "认领账号", + "k95222176": "未读", + "k9792c6b6": "可供高度自定义的聊天工具", + "k979fc780": "无法加入房间, 您将无法获取到最新的信息, 请刷新页面后重试", + "k9a2ea218": "没有任何搜索结果", + "k9b0bdb34": "允许成员查看群组详情", + "k9b91079c": "所有已读", + "k9bb01902": "显示详情", + "k9d343e46": "尚未登录, 立即登录", + "k9d5a843a": "邮件服务", + "k9d80acdf": "认证邮箱", + "k9d901c20": "会议室", + "k9dfa2c97": "永不过期", + "k9e53c664": "提交", + "k9f3089ce": "创建", + "k9f7d7de": "邮箱最长限制40个字符", + "k9fa72780": "与 {{name}} 的会话", + "k9fc409ec": "安装成功", + "ka01a00eb": "系统语言", + "ka0451c97": "取消", + "ka0be0bd9": "允许成员编辑邀请链接", + "ka0ccce44": "100次使用", + "ka29e9508": "发送图片", + "ka2c48894": "自定义你的群组", + "ka2ed2b61": "确认要进行该操作么?", + "ka30dd0bc": "该操作无法被撤回", + "ka35f4202": "群组背景", + "ka39b3032": "1天", + "ka49ec177": "输入一些什么", + "ka4cebef8": "新身份组", + "ka4dac521": "确认要删除角色 {{name}} 么?", + "ka50c7408": "请手动输入JSON信息,如果你不明确你在做什么请不要使用该功能", + "ka5616453": "禁言 {{length}}, 预计到 {{until}} 为止", + "ka58c246": "群组描述", + "ka5d64ee9": "选择以下模板, 开始创建属于自己的群组吧!", + "ka62886b9": "文件读取失败", + "ka64624b1": "加入群组成功!", + "ka6617615": "不支持embed", + "ka697d1d8": "密码修改成功", + "ka7907771": "保存成功", + "ka7ecc377": "Unpin", + "ka820940c": "永不", + "ka8c42876": "聊天记录", + "ka9481f95": "创建者", + "kaa040a8e": "默认群组", + "kaa7d786e": "创建会话", + "kaaf56f78": "调试", + "kabb39529": "保存变更", + "kabb6a177": "特性(亮点)", + "kabbd6e6": "文档", + "kabfe9512": "保存", + "kac147c07": "高级权限控制", + "kad207008": "编辑", + "kadeb7a89": "不支持渲染的文档链接", + "kae072a10": "没有找到该用户", + "kae0a0c12": "搜索用户", + "kaeec12de": "手动安装", + "kaefc1e64": "密码重置成功,现在回到登录页", + "kaf403ef0": "亮色模式", + "kaf51d834": "重置为默认值", + "kb01f8383": "了解更多", + "kb030fbd1": "成员列表", + "kb05820d2": "不支持自定义HTML", + "kb0584341": "使用次数", + "kb07659b0": "重复密码", + "kb123dbb9": "您的个人唯一标识", + "kb12cc88f": "取消免打扰", + "kb2217aa7": "当前使用的是一个临时账号, <2>立即认领", + "kb3390ae7": "确定要退出群组么?", + "kb47a9aa4": "密码不能为空", + "kb488372f": "所有人", + "kb48baefe": "上传失败, 支持的文件最大大小为:", + "kb55c8dba": "邀请成员", + "kb5a17e73": "退出群组", + "kb5de89d1": "收件箱", + "kb6aefd9c": "看起来有多个剪切板处理工具被同时匹配,请选择其中一项或者忽略", + "kb6f1c83f": "想要让大家如何称呼你", + "kb76d94e0": "刷新", + "kb7a57f24": "插件中心服务", + "kb8021af2": "禁止在群组发起私信", + "kb86bd9c9": "查看面板", + "kb8ec7062": "邮箱验证通过", + "kb93f5858": "允许成员修改群组基本信息", + "kb96b79c5": "允许管理邀请链接", + "kbc76781d": "没有发送消息的权限, 请联系群组所有者", + "kbcacf812": "确认清空收件箱么?", + "kbcb00ae5": "该插件没有更多描述", + "kbcf55e47": "用户服务", + "kbe20d511": "没有找到该用户信息, 可能出现了一些异常", + "kbef193d": "邀请链接已复制到剪切板", + "kbef5b92e": "复制链接", + "kbf38b110": "关闭消息右键菜单", + "kc14b2ea3": "返回", + "kc161f3a6": "1小时", + "kc1a5303e": "基于面板的群组空间, 可高度自定义化", + "kc1afdd08": "不要担心, 在此之后你可以随时进行变更", + "kc1bfb977": "登录 {{serverName}}", + "kc2d30ab7": "插件名", + "kc44374ad": "个性化配置群组背景,将会在群组邀请页面展示", + "kc54eb75": "在 Alpha 模式下会有一些尚处于测试阶段的功能将会被开放,如果出现问题欢迎反馈", + "kc625cd59": "概述", + "kc654b275": "邮箱", + "kc6e50666": "配色方案", + "kc6f6df4": "是否要卸载插件", + "kc74e5f62": "搜索成员", + "kc77e00c7": "允许成员查看面板", + "kc7cc96c8": "来自", + "kc8c4ccbb": "授予用户 [{{name}}] 身份组 [{{roleName}}] 成功", + "kc9283683": "确定要删除面板 【{{name}}】 么", + "kc9bd3ad6": "重置为默认权限", + "kc9cc6154": "好友", + "kca811bd0": "修改群组基本信息", + "kcac0467c": "允许成员创建邀请链接", + "kcb20f8ce": "以下为插件权限", + "kcb8e662f": "会话服务", + "kceea83fc": "加入群组", + "kcefdbe2d": "修改头像成功", + "kd0690a45": "允许管理身份组", + "kd080f2d7": "重新加载", + "kd0a4e6a6": "插件机器人", + "kd0d594e4": "分布式部署可供任意规模的使用需求", + "kd1af615e": "面板不存在", + "kd28c05df": "创建成功", + "kd2c1a316": "登录", + "kd2e5e126": "面板管理", + "kd40fe694": "向邮箱发送OTP", + "kd417f93a": "是否要从自己的好友列表中删除对方? 注意:你不会从对方的好友列表消失", + "kd4216b7b": "创建链接", + "kd455acf4": "发送成功, 请检查你的邮箱。", + "kd4cf1cb8": "文件", + "kd4ff36fa": "查找好友", + "kd637a30": "群组邀请服务", + "kd7096593": "未认证", + "kd8370399": "可能是文件体积过大", + "kd8563e87": "新消息", + "kd8d2b865": "群组配置", + "kd955767f": "该邀请码永不过期", + "kd983a61a": "{{nickname}} 撤回了一条消息", + "kd9fd7273": "点击展开更多", + "kda0e155e": "创建多人会话", + "kda229684": "请求参数校验失败", + "kda67b115": "未知的面板类型", + "kdae72bb7": "无法获取面板信息", + "kdb57357d": "连接失败", + "kdc18deca": "邀请用户", + "kdc3e5cf6": "暂无待处理的好友请求", + "kdc4b4f92": "公共", + "kdc85707f": "允许成员修改群组配置", + "kdc8de4ff": "自动", + "kdce55773": "插件卸载成功, 刷新页面后生效", + "kdd4c838c": "跳转到群组", + "kdd6c18f8": "服务异常", + "kdef84ee6": "插件", + "kdf6e53ca": "会话没有权限", + "kdf89681f": "添加好友昵称", + "ke00c5a2f": "属于所有人的开源聊天工具", + "ke0131e71": "建议比例: 16:9 | 建议大小: 1280x720", + "ke0161a83": "重置为默认地址", + "ke03e2010": "没有面板访问权限", + "ke040edce": "没有找到该类型的渲染方式", + "ke071c620": "允许成员管理用户,如禁言、移除用户等操作", + "ke08ea159": "复制选中文本成功", + "ke17b2c87": "请勿上传违反当地法律法规的图片", + "ke187440d": "面板类型不能为空", + "ke2431c67": "插件渲染函数不存在", + "ke3a77a77": "无限制", + "ke3d797fd": "拖放文件以发送到当前会话", + "ke59ffe49": "禁言中, 还剩 {{remain}}", + "ke6da074f": "消息撤回成功", + "ke9748e88": "不支持自定义Meta", + "keb053701": "复制消息文本成功", + "kec46a57f": "添加成员", + "kecb51e2c": "旧密码", + "kecbb0e45": "系统", + "kecbd7449": "删除", + "ked2baf28": "加载中...", + "ked5385d5": "创建面板", + "keda14478": "您是群组管理者,退出群组会导致解散群组", + "kedee406c": "5分钟", + "kee059e5e": "确认要将该用户移出群组么", + "kee3eb950": "邮箱校验码", + "kee9108f1": "修改成功", + "keeaa43fb": "未知的卡片类型", + "kef25594f": "用户昵称#0000", + "kef3676e1": "该邀请码已过期", + "kef517e2e": "发送文件", + "kef9abce1": "允许成员创建不限时邀请链接", + "kefaf9956": "创建时间", + "kefc07278": "返回登录", + "keff3c3f": "10分钟", + "kf02c6db": "好友列表", + "kf0bb5ed9": "提及我的消息", + "kf0d58254": "当前版本", + "kf0d97e0b": "好友删除成功", + "kf1396f1f": "身份组名称", + "kf15499b4": "退出登录", + "kf1eac01c": "群组信息加载失败", + "kf22210a": "正在加载插件列表", + "kf3fa6059": "您可以使用完整的 <1>用户昵称#标识 来添加好友", + "kf431f1b2": "允许成员管理邀请链接", + "kf4567a1": "复制邀请链接", + "kf48ae58": "找不到群组信息", + "kf53a7774": "允许成员管理身份组", + "kf5422f1b": "已加入,跳转到群组", + "kf5543e44": "已过期", + "kf5861d84": "暂无已发送的好友请求", + "kf5d66247": "面板名", + "kf6d7f23d": "正在连接到聊天服务器...", + "kf7215b17": "忘记密码?", + "kf7d6acd4": "创建访客", + "kf7d829eb": "待处理", + "kf876a42d": "修改密码", + "kf87f3059": "插件中心", + "kf8de33b7": "未找到插件的提供者", + "kf9235c11": "出现了一些问题", + "kf94465ba": "邀请码", + "kfa01c850": "找不到私信会话", + "kfa493f3f": "回复", + "kfa610536": "Alpha测试开关", + "kfaddd61d": "聊天服务", + "kfbecf2a7": "确定要删除面板组 【{{name}}】 以及下级的所有面板么", + "kfc07c0a4": "这里是所有消息的开始,请畅所欲言。", + "kfc0ccc0e": "后续在用户设置中可以随时修改", + "kfd340bbc": "管理成员", + "kfe731dfc": "操作", + "kfe9c1c6c": "10次使用" +} diff --git a/client/shared/i18n/language.ts b/client/shared/i18n/language.ts new file mode 100644 index 00000000000..ca67b8a743c --- /dev/null +++ b/client/shared/i18n/language.ts @@ -0,0 +1,87 @@ +import type { LanguageDetectorAsyncModule } from 'i18next'; +import { useRef, useMemo, useCallback } from 'react'; +import _isNil from 'lodash/isNil'; +import { AllowedLanguage, setLanguage as setI18NLanguage } from './index'; +import { getStorage, useStorage } from '../manager/storage'; +import { LANGUAGE_KEY } from '../utils/consts'; + +export const defaultLanguage = 'en-US'; + +function getNavigatorLanguage(): AllowedLanguage { + if (!navigator.language) { + return defaultLanguage; + } + + return navigator.language.startsWith('zh') ? 'zh-CN' : 'en-US'; +} + +/** + * Get current language + */ +async function getLanguage(): Promise { + return await getStorage().get(LANGUAGE_KEY, getNavigatorLanguage()); +} + +/** + * Current language management hook + */ +export function useLanguage() { + const [language, { save }] = useStorage( + LANGUAGE_KEY, + defaultLanguage + ); + + const originLanguageRef = useRef(); + + const setLanguage = useCallback( + async (newLanguage: AllowedLanguage) => { + if (_isNil(originLanguageRef.current)) { + originLanguageRef.current = language; + } + + save(newLanguage); + await setI18NLanguage(newLanguage); + }, + [language, save] + ); + + const isChanged = useMemo(() => { + if (_isNil(originLanguageRef.current)) { + return false; + } + + return originLanguageRef.current !== language; + }, [language]); + + return { language, setLanguage, isChanged }; +} + +/** + * Storage language + * @param lang Language Code + */ +export async function saveLanguage(lang: string) { + await getStorage().save(LANGUAGE_KEY, lang); +} + +/** + * i18n language detection middleware + */ +export const languageDetector: LanguageDetectorAsyncModule = { + type: 'languageDetector', + async: true, + init: () => {}, + detect: async (callback) => { + try { + const language = await getLanguage(); + callback(language); + } catch (error) { + callback(defaultLanguage); + } + }, + cacheUserLanguage(language) { + try { + saveLanguage(language); + } catch (error) {} + }, +}; diff --git a/client/shared/index.tsx b/client/shared/index.tsx new file mode 100644 index 00000000000..13312900bad --- /dev/null +++ b/client/shared/index.tsx @@ -0,0 +1,277 @@ +// api +export { buildStorage } from './api/buildStorage'; +export { request } from './api/request'; +export type { RequestConfig } from './api/request'; +export { createSocket } from './api/socket'; +export type { AppSocket } from './api/socket'; + +// cache +export { + getCachedUserInfo, + getCachedConverseInfo, + getCachedBaseGroupInfo, + getCachedGroupInviteInfo, + getCachedRegistryPlugins, + getCachedUserSettings, +} from './cache/cache'; +export { useCachedOnlineStatus } from './cache/useCache'; + +// components +export { buildPortal, DefaultEventEmitter } from './components/Portal'; +export { AlphaContainer } from './components/AlphaContainer'; +export { DevContainer } from './components/DevContainer'; +export { TcProvider } from './components/Provider'; + +// contexts +export { + ChatBoxContextProvider, + useChatBoxContext, +} from './contexts/ChatBoxContext'; +export { useColorScheme } from './contexts/ColorSchemeContext'; +export { + ConverseMessageProvider, + useConverseMessageContext, +} from './contexts/ConverseMessageContext'; +export { + GroupInfoContextProvider, + useGroupInfoContext, +} from './contexts/GroupInfoContext'; + +// event +export { sharedEvent, useSharedEventHandler } from './event/index'; +export type { SharedEventType } from './event/index'; + +// helper +export { getDMConverseName } from './helper/converse-helper'; + +// i18n +export { + t, + localTrans, + setLanguage, + getLanguage, + useTranslation, + onLanguageLoaded, +} from './i18n'; +export type { AllowedLanguage } from './i18n'; +export { Trans } from './i18n/Trans'; +export { useLanguage } from './i18n/language'; + +// hooks +export { createUseStorageState } from './hooks/factory/createUseStorageState'; +export { useAvailableServices } from './hooks/model/useAvailableServices'; +export { useMessageNotifyEventFilter } from './hooks/model/useMessageNotifyEventFilter'; +export { useCachedUserInfo } from './hooks/model/useUserInfo'; +export { useUserInfoList } from './hooks/model/useUserInfoList'; +export { useUsernames } from './hooks/model/useUsernames'; +export { + useUserSettings, + useSingleUserSetting, + useUserNotifyMute, +} from './hooks/model/useUserSettings'; +export { useAlphaMode } from './hooks/useAlphaMode'; +export { useAsync } from './hooks/useAsync'; +export { useAsyncFn } from './hooks/useAsyncFn'; +export { useAsyncRefresh } from './hooks/useAsyncRefresh'; +export { useAsyncRequest } from './hooks/useAsyncRequest'; +export { useDataReady } from './hooks/useDataReady'; +export { useDebounce } from './hooks/useDebounce'; +export { useEditValue } from './hooks/useEditValue'; +export { useEvent } from './hooks/useEvent'; +export { useInterval } from './hooks/useInterval'; +export { useLazyValue } from './hooks/useLazyValue'; +export { useMemoizedFn } from './hooks/useMemoizedFn'; +export { useMountedState } from './hooks/useMountedState'; +export { usePrevious } from './hooks/usePrevious'; +export { useRafState } from './hooks/useRafState'; +export { useSearch, useUserSearch } from './hooks/useSearch'; +export { useShallowObject } from './hooks/useShallowObject'; +export { useUpdateRef } from './hooks/useUpdateRef'; +export { useWatch } from './hooks/useWatch'; +export { useWhyDidYouUpdate } from './hooks/useWhyDidYouUpdate'; + +// manager +export { buildRegFn, buildRegList, buildRegMap } from './manager/buildReg'; +export { getServiceUrl, setServiceUrl } from './manager/service'; +export { + setTokenGetter, + refreshTokenGetter, + setErrorHook, +} from './manager/request'; +export { regSocketEventListener } from './manager/socket'; +export { getStorage, setStorage, useStorage } from './manager/storage'; +export { + showToasts, + setToasts, + showErrorToasts, + showSuccessToasts, + showAlert, + setAlert, + showGlobalLoading, + setGlobalLoading, + showNotification, + setNotification, +} from './manager/ui'; + +// model +export * as model from './model/__all__'; +export { fetchAvailableServices } from './model/common'; +export { fetchGlobalClientConfig, getGlobalConfig } from './model/config'; +export { + createDMConverse, + appendDMConverseMembers, + updateAck, +} from './model/converse'; +export { + addFriendRequest, + cancelFriendRequest, + acceptFriendRequest, + denyFriendRequest, + removeFriend, +} from './model/friend'; +export type { FriendRequest } from './model/friend'; +export { + GroupPanelType, + createGroup, + createGroupInviteCode, + getAllGroupInviteCode, + getGroupBasicInfo, + quitGroup, + applyGroupInvite, + deleteGroupInvite, + modifyGroupField, + createGroupPanel, + modifyGroupPanel, + deleteGroupPanel, + createGroupRole, + deleteGroupRole, + updateGroupRoleName, + updateGroupRolePermission, + getGroupConfigWithInfo, +} from './model/group'; +export type { + GroupPanel, + GroupInfo, + GroupBasicInfo, + GroupInvite, + GroupMember, + GroupPanelFeature, +} from './model/group'; +export type { + BasicInboxItem, + MessageInboxItem, + MarkdownInboxItem, + InboxItem, +} from './model/inbox'; +export { + sendMessage, + recallMessage, + deleteMessage, + addReaction, + removeReaction, +} from './model/message'; +export type { + ChatMessageReaction, + ChatMessage, + SendMessagePayloadMeta, +} from './model/message'; +export type { PluginManifest } from './model/plugin'; +export type { UserBaseInfo, UserLoginInfo, UserSettings } from './model/user'; +export { + loginWithEmail, + loginWithToken, + registerWithEmail, + modifyUserPassword, + forgetPassword, + resetPassword, + createTemporaryUser, + claimTemporaryUser, + searchUserWithUniqueName, + checkTokenValid, + modifyUserField, +} from './model/user'; + +// redux +export { + useAppSelector, + useAppDispatch, + useAppStore, +} from './redux/hooks/useAppSelector'; +export { useDMConverseList } from './redux/hooks/useConverse'; +export { useConverseAck } from './redux/hooks/useConverseAck'; +export { useConverseMessage } from './redux/hooks/useConverseMessage'; +export { useDMConverseName } from './redux/hooks/useDMConverseName'; +export { + useFriendNickname, + useFriendNicknameMap, +} from './redux/hooks/useFriendNickname'; +export { + useGroupInfo, + useGroupMemberIds, + useGroupMemberInfos, + useGroupPanels, + useGroupPanelInfo, + useIsGroupOwner, + useGroupTextPanelUnread, +} from './redux/hooks/useGroup'; +export { useGroupAck } from './redux/hooks/useGroupAck'; +export { useGroupMemberMute } from './redux/hooks/useGroupMemberMute'; +export { + useGroupMemberAllPermissions, + useGroupPanelMemberAllPermissions, + useHasGroupPermission, + useHasGroupPanelPermission, +} from './redux/hooks/useGroupPermission'; +export { useUserInfo, useUserId } from './redux/hooks/useUserInfo'; +export { useInboxList, useInboxItem } from './redux/hooks/useInbox'; +export { useUnread } from './redux/hooks/useUnread'; +export { + userActions, + groupActions, + uiActions, + chatActions, + globalActions, +} from './redux/slices'; +export type { ChatConverseState } from './redux/slices/chat'; +export { setupRedux } from './redux/setup'; +export { getReduxStore, ReduxProvider } from './redux/store'; +export type { AppStore, AppState, AppDispatch } from './redux/store'; + +// store +export { useGlobalConfigStore } from './store/globalConfig'; + +// utils +export { joinArray } from './utils/array-helper'; +export { NAME_REGEXP, SYSTEM_USERID } from './utils/consts'; +export { + shouldShowMessageTime, + getMessageTimeDiff, + showMessageTime, + formatShortTime, + formatFullTime, + datetimeToNow, + datetimeFromNow, + humanizeMsDuration, +} from './utils/date-helper'; +export { + isBrowser, + isNavigator, + isDevelopment, + isProduction, + version, +} from './utils/environment'; +export type { PermissionItemType } from './utils/role-helper'; +export { isValidStr } from './utils/string-helper'; +export { isValidJson } from './utils/json-helper'; +export { MessageHelper } from './utils/message-helper'; +export { + PERMISSION, + ALL_PERMISSION, + getPermissionList, + getDefaultPermissionList, + applyDefaultFallbackGroupPermission, +} from './utils/role-helper'; +export { uploadFile } from './utils/upload-helper'; +export type { UploadFileResult, UploadFileUsage } from './utils/upload-helper'; +export { parseUrlStr } from './utils/url-helper'; +export { sleep } from './utils/utils'; diff --git a/client/shared/manager/__tests__/buildReg.spec.ts b/client/shared/manager/__tests__/buildReg.spec.ts new file mode 100644 index 00000000000..757f8117d9d --- /dev/null +++ b/client/shared/manager/__tests__/buildReg.spec.ts @@ -0,0 +1,126 @@ +import { buildCachedRegFn, buildRegFn } from '../buildReg'; + +describe('buildRegFn should be ok', () => { + test('normal', () => { + const [get, set] = buildRegFn('test'); + const fn = jest.fn(); + set(fn); + + get(); + get(1); + get(2); + + const fn2 = jest.fn(); + set(fn2); + + get(3); + + expect(fn.mock.calls.length).toBe(3); + expect(fn.mock.calls[0]).toEqual([]); + expect(fn.mock.calls[1]).toEqual([1]); + expect(fn.mock.calls[2]).toEqual([2]); + + expect(fn2.mock.calls[0]).toEqual([3]); + }); + + test('with default', () => { + const fn = jest.fn(); + const [get, set] = buildRegFn('test', fn); + get(); + get(1); + get(2); + + const fn2 = jest.fn(); + set(fn2); + get(3); + + expect(fn.mock.calls.length).toBe(3); + expect(fn.mock.calls[0]).toEqual([]); + expect(fn.mock.calls[1]).toEqual([1]); + expect(fn.mock.calls[2]).toEqual([2]); + + expect(fn2.mock.calls[0]).toEqual([3]); + }); +}); + +describe('buildCachedRegFn should be ok', () => { + test('normal', () => { + const [get, set] = buildCachedRegFn('test'); + const fn = jest.fn(); + set(fn); + get(1); + + const fn2 = jest.fn(); + set(fn2); + get(2); + + expect(fn.mock.calls[0]).toEqual([1]); + expect(fn2.mock.calls[0]).toEqual([2]); + }); + + test('should be cache value', () => { + const [get, set] = buildCachedRegFn('test'); + const fn = jest.fn((v) => v); + set(fn); + const res1 = get(1); + const res2 = get(1); + + expect(fn.mock.calls.length).toBe(1); + expect(fn.mock.calls[0]).toEqual([1]); + expect(res1).toBe(res2); + }); + + test('should be refresh if re-set', () => { + const [get, set] = buildCachedRegFn('test'); + const fn = jest.fn((v) => v); + set(fn); + get(1); + get(1); + + const fn2 = jest.fn((v) => v); + set(fn2); + get(1); + get(1); + + expect(fn.mock.calls.length).toBe(1); + expect(fn.mock.calls[0]).toEqual([1]); + + expect(fn2.mock.calls.length).toBe(1); + expect(fn2.mock.calls[0]).toEqual([1]); + }); + + test('should call forever if return null', () => { + const [get, set] = buildCachedRegFn('test'); + const fn = jest.fn(() => null); + set(fn); + + get(); + get(); + get(); + expect(fn.mock.calls.length).toBe(3); + }); + + test('should call forever if return undefined', () => { + const [get, set] = buildCachedRegFn('test'); + const fn = jest.fn(() => undefined); + set(fn); + + get(); + get(); + get(); + expect(fn.mock.calls.length).toBe(3); + }); + + test('should cache promise fn', () => { + const [get, set] = buildCachedRegFn('test'); + const fn = jest.fn(async () => undefined); + set(fn); + + get(); + get(); + get(); + expect(fn.mock.calls.length).toBe(1); + get(1); + expect(fn.mock.calls.length).toBe(2); + }); +}); diff --git a/client/shared/manager/buildReg.ts b/client/shared/manager/buildReg.ts new file mode 100644 index 00000000000..c00c6c535e2 --- /dev/null +++ b/client/shared/manager/buildReg.ts @@ -0,0 +1,173 @@ +import _isFunction from 'lodash/isFunction'; +import _isEqual from 'lodash/isEqual'; + +/** + * 构建一对get set 方法 + * 用于在不同平台拥有统一方式调用体验 + */ +export function buildRegFn any>( + name: string, + defaultFunc?: F +) { + let func: F | undefined; + + const get = (...args: Parameters): ReturnType => { + if (!func) { + if (_isFunction(defaultFunc)) { + return defaultFunc(...args); + } + + throw new Error(`${name} not regist`); + } + return func(...args); + }; + + const set = (fn: F): void => { + func = fn; + }; + + const reset = (): void => { + func = defaultFunc; + }; + + return [get, set, reset] as const; +} + +/** + * 构建带事件监听的get set 方法 + */ +export function buildRegFnWithEvent any>( + name: string, + defaultFunc?: F +) { + const [get, _set] = buildRegFn(name, defaultFunc); + const listenerList: ((v: F) => void)[] = []; + const onSet = (cb: (v: F) => void): void => { + listenerList.push(cb); + }; + + const set = (fn: F): void => { + _set(fn); + listenerList.forEach((listener) => listener(fn)); + }; + + return [get, set, onSet] as const; +} + +/** + * 缓存版本的buildRegFn + */ +export function buildCachedRegFn any>( + name: string, + defaultFunc?: F +) { + const [get, set] = buildRegFn(name, defaultFunc); + + let _result: any = null; // 缓存的返回值 + let _lastArgs: any; + + function isSame(args: any[]) { + // 当有缓存的返回值且两次参数一致 + return _result !== null && _isEqual(args, _lastArgs); + } + + // 根据是否为 promise 做区分 + const cachedGet: any = (...args: any) => { + if (isSame(args)) { + return _result; + } else { + const result = get(...args); + _result = result ?? null; + _lastArgs = args; + return result; + } + }; + + const refreshCache = () => { + _result = null; + }; + + const cachedSet = (fn: F) => { + set(fn); + refreshCache(); + }; + + return [cachedGet, cachedSet, refreshCache]; +} + +/** + * 缓存版本的buildRegFn + * Promise 版本 + */ +export function buildCachedRegFnAsync any>( + name: string, + defaultFunc?: F +) { + const [get, set] = buildRegFn(name, defaultFunc); + + let _result: any = null; // 缓存的返回值 + let _lastArgs: any; + + function isSame(args: any[]) { + // 当有缓存的返回值且两次参数一致 + return _result !== null && _isEqual(args, _lastArgs); + } + + // 根据是否为 promise 做区分 + const cachedGet: any = async (...args: any) => { + if (isSame(args)) { + return _result; + } else { + const result = await get(...args); + _result = result ?? null; + _lastArgs = args; + return result; + } + }; + + const refreshCache = () => { + _result = null; + }; + + const cachedSet = (fn: F) => { + set(fn); + refreshCache(); + }; + + return [cachedGet, cachedSet, refreshCache]; +} + +/** + * 构建一组注册列表的方式 + * 用于从其他地方统一获取数据 + */ +export function buildRegList(): [T[], (item: T) => void] { + const list: T[] = []; + + const reg = (item: T) => { + list.push(item); + }; + + return [list, reg]; +} + +/** + * 构建一组注册Mapping的方式 + * 用于从其他地方统一获取数据 + */ +export function buildRegMap(): [ + Record, + (name: string, item: T) => void +] { + const mapping: Record = {}; + + const reg = (name: string, item: T) => { + if (mapping[name]) { + console.warn('[buildRegMap] 重复注册:', name); + } + + mapping[name] = item; + }; + + return [mapping, reg]; +} diff --git a/client/shared/manager/request.ts b/client/shared/manager/request.ts new file mode 100644 index 00000000000..bcd65a21436 --- /dev/null +++ b/client/shared/manager/request.ts @@ -0,0 +1,9 @@ +import { buildRegFn, buildCachedRegFnAsync } from './buildReg'; + +export const [getErrorHook, setErrorHook] = buildRegFn<(err: any) => boolean>( + 'requestErrorHook', + () => true +); + +export const [tokenGetter, setTokenGetter, refreshTokenGetter] = + buildCachedRegFnAsync<() => Promise>('requestTokenGetter'); diff --git a/client/shared/manager/service.ts b/client/shared/manager/service.ts new file mode 100644 index 00000000000..fd922ff3636 --- /dev/null +++ b/client/shared/manager/service.ts @@ -0,0 +1,8 @@ +import { buildRegFnWithEvent } from './buildReg'; + +/** + * 获取服务器地址相关逻辑 + * @default window.location.origin (前后端一体) + */ +export const [getServiceUrl, setServiceUrl, onServiceUrlChange] = + buildRegFnWithEvent<() => string>('serverUrl', () => window.location.origin); diff --git a/client/shared/manager/socket.ts b/client/shared/manager/socket.ts new file mode 100644 index 00000000000..39f54dea8ac --- /dev/null +++ b/client/shared/manager/socket.ts @@ -0,0 +1,8 @@ +import { buildRegList } from './buildReg'; + +interface PluginSocketEventListener { + eventName: string; + eventFn: (...args: any[]) => void; +} +export const [socketEventListeners, regSocketEventListener] = + buildRegList(); diff --git a/client/shared/manager/storage.ts b/client/shared/manager/storage.ts new file mode 100644 index 00000000000..c2182d8a7a7 --- /dev/null +++ b/client/shared/manager/storage.ts @@ -0,0 +1,66 @@ +import { buildRegFn } from './buildReg'; +import { useCallback, useLayoutEffect, useState } from 'react'; + +export interface StorageObject { + /** + * NOTICE: 与save不同, set存储 1 天 + */ + set: (key: string, data: any) => Promise; + get: (key: string, defaultVal?: any) => Promise; + remove: (key: string) => Promise; + save: (key: string, data: any) => Promise; +} + +/** + * 持久化存储相关逻辑 + */ +export const [getStorage, setStorage] = + buildRegFn<() => StorageObject>('storage'); + +/** + * 持久化hook的缓存, 减少因一步获取数据导致的gap + */ +const useStorageCache = new Map(); + +/** + * 管理持久化存储数据 + * @param key 存储键 + * @param defaultValue 默认值 + */ +export function useStorage( + key: string, + defaultValue?: T +): [T | undefined, { set: (v: T) => void; save: (v: T) => void }] { + const [value, setValue] = useState( + useStorageCache.get(key) ?? defaultValue + ); + + useLayoutEffect(() => { + getStorage() + .get(key) + .then((data: T) => { + setValue(data ?? defaultValue); + useStorageCache.set(key, data ?? defaultValue); + }); + }, [key]); + + const set = useCallback( + (newVal: T) => { + setValue(newVal); + getStorage().set(key, newVal); + useStorageCache.set(key, newVal); + }, + [key] + ); + + const save = useCallback( + (newVal: T) => { + setValue(newVal); + getStorage().save(key, newVal); + useStorageCache.set(key, newVal); + }, + [key] + ); + + return [value, { set, save }]; +} diff --git a/client/shared/manager/ui.ts b/client/shared/manager/ui.ts new file mode 100644 index 00000000000..aa05f6aeece --- /dev/null +++ b/client/shared/manager/ui.ts @@ -0,0 +1,57 @@ +import { t } from '../i18n'; +import { buildRegFn } from './buildReg'; + +/** + * 通用UI api设置 + */ + +type ToastsType = 'info' | 'success' | 'error' | 'warning'; +export const [showToasts, setToasts] = + buildRegFn<(message: string, type?: ToastsType) => void>('toasts'); + +/** + * 一个封装方法, 用于直接抛出错误 + * @param error 错误信息 + */ +export function showErrorToasts(error: unknown) { + let msg = ''; + if (error instanceof Error) { + msg = error.message; + } else { + msg = String(error); + } + + showToasts(msg, 'error'); +} + +/** + * 展示成功消息 + */ +export function showSuccessToasts(msg = t('操作成功')) { + showToasts(msg, 'success'); +} + +interface AlertOptions { + message: React.ReactNode; + onConfirm?: () => void | Promise; +} +export const [showAlert, setAlert] = + buildRegFn<(options: AlertOptions) => void>('alert'); + +/** + * 全局Loading提示 + * 返回移除函数 + */ +export const [showGlobalLoading, setGlobalLoading] = buildRegFn< + (text: string) => () => void +>('global-loading', () => { + return () => {}; +}); + +/** + * 提示通知,返回关闭函数 + */ +export const [showNotification, setNotification] = + buildRegFn<(message: React.ReactNode, duration?: number) => () => void>( + 'notification' + ); diff --git a/client/shared/model/__all__.ts b/client/shared/model/__all__.ts new file mode 100644 index 00000000000..a05611328c0 --- /dev/null +++ b/client/shared/model/__all__.ts @@ -0,0 +1,9 @@ +export * as common from './common'; +export * as config from './config'; +export * as converse from './converse'; +export * as friend from './friend'; +export * as group from './group'; +export * as message from './message'; +export * as plugin from './plugin'; +export * as user from './user'; +export * as inbox from './inbox'; diff --git a/shared/model/common.ts b/client/shared/model/common.ts similarity index 100% rename from shared/model/common.ts rename to client/shared/model/common.ts diff --git a/client/shared/model/config.ts b/client/shared/model/config.ts new file mode 100644 index 00000000000..f1eea1c3b84 --- /dev/null +++ b/client/shared/model/config.ts @@ -0,0 +1,94 @@ +import { request } from '../api/request'; +import { useGlobalConfigStore } from '../store/globalConfig'; +import { defaultGlobalConfig } from '../utils/consts'; + +/** + * 后端的全局设置 + */ +export interface GlobalConfig { + /** + * Tianji 配置 + */ + tianji: { + scriptUrl?: string; + websiteId?: string; + }; + + /** + * 上传文件体积 + * 默认1m + */ + uploadFileLimit: number; + /** + * 是否在注册时校验邮箱 + */ + emailVerification: boolean; + + /** + * 服务器名 + */ + serverName?: string; + + /** + * 服务器入口背景图 + */ + serverEntryImage?: string; + + /** + * 是否禁用 Socketio 的 Msgpack 解析器 + */ + disableMsgpack?: boolean; + + /** + * 是否禁用注册功能 + */ + disableUserRegister?: boolean; + + /** + * 是否禁用游客登录 + */ + disableGuestLogin?: boolean; + + /** + * 是否禁用创建群组功能 + */ + disableCreateGroup?: boolean; + + /** + * 是否禁用插件中心 + */ + disablePluginStore?: boolean; + + /** + * 是否禁用添加好友功能 + */ + disableAddFriend?: boolean; + + /** + * 是否禁用遥测 + */ + disableTelemetry?: boolean; + + announcement?: + | false + | { + id: string; + text: string; + link?: string; + }; +} + +export function getGlobalConfig(): GlobalConfig { + return useGlobalConfigStore.getState(); +} + +export async function fetchGlobalClientConfig(): Promise { + const { data: config } = await request.get('/api/config/client'); + + useGlobalConfigStore.setState({ + ...defaultGlobalConfig, + ...config, + }); + + return config; +} diff --git a/client/shared/model/converse.ts b/client/shared/model/converse.ts new file mode 100644 index 00000000000..7445c04a094 --- /dev/null +++ b/client/shared/model/converse.ts @@ -0,0 +1,144 @@ +import { request } from '../api/request'; +import { + createAutoMergedRequest, + createAutoSplitRequest, +} from '../utils/request'; +import _uniq from 'lodash/uniq'; +import _flatten from 'lodash/flatten'; +import _zipObject from 'lodash/zipObject'; + +export enum ChatConverseType { + DM = 'DM', // 单人会话 + Multi = 'Multi', // 多人会话 + Group = 'Group', // 群组会话(暂时无用) +} + +export interface ChatConverseInfo { + _id: string; + name: string; + type: ChatConverseType; + members: string[]; +} + +/** + * 尝试创建私聊会话 + * 如果已创建则返回之前的 + */ +export async function createDMConverse( + memberIds: string[] +): Promise { + const { data } = await request.post('/api/chat/converse/createDMConverse', { + memberIds, + }); + + return data; +} + +/** + * 在多人会话中添加成员 + */ +export async function appendDMConverseMembers( + converseId: string, + memberIds: string[] +) { + const { data } = await request.post( + '/api/chat/converse/appendDMConverseMembers', + { + converseId, + memberIds, + } + ); + + return data; +} + +/** + * 获取会话信息 + * @param converseId 会话ID + */ +export async function fetchConverseInfo( + converseId: string +): Promise { + const { data } = await request.get('/api/chat/converse/findConverseInfo', { + params: { + converseId, + }, + }); + + return data; +} + +/** + * 更新会话已读 + * @param converseId 会话ID + * @param lastMessageId 最后一条消息ID + */ +export async function updateAck(converseId: string, lastMessageId: string) { + await request.post('/api/chat/ack/update', { converseId, lastMessageId }); +} + +interface AckInfo { + userId: string; + converseId: string; + lastMessageId: string; +} + +/** + * 获取用户存储在远程的会话信息 + */ +export async function fetchUserAck(): Promise { + const { data } = await request.get('/api/chat/ack/all'); + + if (!Array.isArray(data)) { + return []; + } + + return data; +} + +/** + * 获取用户存储在远程的会话信息 + */ +export async function fetchUserAckList( + converseIds: string[] +): Promise<(AckInfo | null)[]> { + const { data } = await request.post('/api/chat/ack/list', { + converseIds, + }); + + if (!Array.isArray(data)) { + return []; + } + + return data; +} + +const _fetchConverseAckInfo = createAutoMergedRequest< + string[], + (AckInfo | null)[] +>( + createAutoSplitRequest( + async (converseIdsList) => { + const uniqList = _uniq(_flatten(converseIdsList)); + const infoList = await fetchUserAckList(uniqList); + + const map = _zipObject(uniqList, infoList); + + // 将请求结果根据传输来源重新分组 + return converseIdsList.map((converseIds) => + converseIds.map((converseId) => map[converseId] ?? null) + ); + }, + 'serial', + 100 + ) +); + +/** + * 获取会话信息 + */ +export async function getConverseAckInfo( + converseIds: string[] +): Promise<(AckInfo | null)[]> { + return _fetchConverseAckInfo(converseIds); +} diff --git a/client/shared/model/friend.ts b/client/shared/model/friend.ts new file mode 100644 index 00000000000..2f7b3779995 --- /dev/null +++ b/client/shared/model/friend.ts @@ -0,0 +1,74 @@ +import { request } from '../api/request'; + +export interface FriendRequest { + _id: string; + from: string; + to: string; + message: string; +} + +/** + * 发送好友请求 + * @param targetId 目标用户id + */ +export async function addFriendRequest( + targetId: string +): Promise { + const { data } = await request.post('/api/friend/request/add', { + to: targetId, + }); + + return data; +} + +/** + * 同意好友请求 + * @param requestId 好友请求ID + */ +export async function acceptFriendRequest(requestId: string): Promise { + await request.post('/api/friend/request/accept', { + requestId, + }); +} + +/** + * 拒绝好友请求 + * @param requestId 好友请求ID + */ +export async function denyFriendRequest(requestId: string): Promise { + await request.post('/api/friend/request/deny', { + requestId, + }); +} + +/** + * 取消好友请求 + * @param requestId 好友请求ID + */ +export async function cancelFriendRequest(requestId: string): Promise { + await request.post('/api/friend/request/cancel', { + requestId, + }); +} + +/** + * 移除好友(单项) + */ +export async function removeFriend(friendUserId: string): Promise { + await request.post('/api/friend/removeFriend', { + friendUserId, + }); +} + +/** + * 设置好友昵称 + */ +export async function setFriendNickname( + targetId: string, + nickname: string +): Promise { + await request.post('/api/friend/setFriendNickname', { + targetId, + nickname, + }); +} diff --git a/client/shared/model/group.ts b/client/shared/model/group.ts new file mode 100644 index 00000000000..e9ef7da0b67 --- /dev/null +++ b/client/shared/model/group.ts @@ -0,0 +1,480 @@ +import { request } from '../api/request'; +import { + GroupPanelType, + GroupPanel, + GroupRole, + GroupInfo as IGroupInfo, + GroupBasicInfo, + GroupInvite, +} from 'tailchat-types'; + +export { GroupPanelType }; +export type { GroupPanel, GroupRole, GroupBasicInfo, GroupInvite }; + +export const groupConfigNames = [ + // 隐藏群组成员标识位 + 'hideGroupMemberDiscriminator', + + // 禁止从群组中发起私信 + 'disableCreateConverseFromGroup', + + // 群组背景图 + 'groupBackgroundImage', +] as const; + +export type GroupConfigNames = (typeof groupConfigNames)[number] | string; // string is plugin config + +export interface GroupMember { + roles: string[]; // 角色组 + userId: string; + /** + * 日期字符串 禁言到xxx + */ + muteUntil?: string; +} + +/** + * 群组面板特性 + */ +export type GroupPanelFeature = + | 'subscribe' // 订阅事件变更状态,用于加入socket.io群组 + | 'ack'; // 是否包含已读未读检查,如果包含的话需要同时开启 subscribe 特性 + +export interface GroupInfo extends Omit { + config?: Partial>; + pinnedPanelId?: string; +} + +/** + * 获取群组设置信息 + */ +export function getGroupConfigWithInfo( + groupInfo: GroupInfo | null | undefined +): { + hideGroupMemberDiscriminator: boolean; + disableCreateConverseFromGroup: boolean; + [key: string]: unknown; +} { + const config = groupInfo?.config ?? {}; + + return { + ...config, + hideGroupMemberDiscriminator: config.hideGroupMemberDiscriminator ?? false, + disableCreateConverseFromGroup: + config.disableCreateConverseFromGroup ?? false, + }; +} + +/** + * 创建群组 + * @param name 群组名 + * @param panels 初始面板 + */ +export async function createGroup( + name: string, + panels: GroupPanel[] +): Promise { + const { data } = await request.post('/api/group/createGroup', { + name, + panels, + }); + + return data; +} + +/** + * 获取群组基本信息 + */ +export async function getGroupBasicInfo( + groupId: string +): Promise { + const { data } = await request.get('/api/group/getGroupBasicInfo', { + params: { + groupId, + }, + }); + + return data; +} + +/** + * 修改群组属性 + * @param groupId 群组ID + * @param fieldName 要修改的群组属性 + * @param fieldValue 要修改的属性的值 + */ +type AllowedModifyField = + | 'name' + | 'avatar' + | 'description' + | 'panels' + | 'roles' + | 'fallbackPermissions'; +export async function modifyGroupField( + groupId: string, + fieldName: AllowedModifyField, + fieldValue: unknown +) { + await request.post('/api/group/updateGroupField', { + groupId, + fieldName, + fieldValue, + }); +} + +/** + * 修改群组配置 + * @param groupId 群组ID + * @param configName 要修改的群组属性 + * @param configValue 要修改的属性的值 + */ +export async function modifyGroupConfig( + groupId: string, + configName: GroupConfigNames, + configValue: unknown +) { + await request.post('/api/group/updateGroupConfig', { + groupId, + configName, + configValue, + }); +} + +/** + * 退出群组(群组拥有者是解散群组) + * 这里必须是一个socket请求因为后端需要进行房间的退出操作 + * @param groupId 群组ID + */ +export async function quitGroup(groupId: string) { + await request.post('/api/group/quitGroup', { + groupId, + }); +} + +/** + * 检查当前用户是否是群组成员 + * @param groupId 群组ID + */ +export async function isMember(groupId: string): Promise { + const { data } = await request.post('/api/group/isMember', { + groupId, + }); + + return data; +} + +/** + * 更新用户所在的权限组 + * @param groupId 群组ID + * @param memberIds 成员信息 + * @param roles 权限组名 + */ +export async function appendGroupMemberRoles( + groupId: string, + memberIds: string[], + roles: string[] +) { + await request.post('/api/group/appendGroupMemberRoles', { + groupId, + memberIds, + roles, + }); +} + +/** + * 更新用户所在的权限组 + * @param groupId 群组ID + * @param memberIds 成员信息 + * @param roles 权限组名 + */ +export async function removeGroupMemberRoles( + groupId: string, + memberIds: string[], + roles: string[] +) { + await request.post('/api/group/removeGroupMemberRoles', { + groupId, + memberIds, + roles, + }); +} + +/** + * 创建群组邀请码 + * 邀请码默认 7天有效期 + * @param groupId 群组id + */ +export async function createGroupInviteCode( + groupId: string, + inviteType: 'normal' | 'permanent' +): Promise { + const { data } = await request.post('/api/group/invite/createGroupInvite', { + groupId, + inviteType, + }); + + return data; +} + +/** + * 编辑群组邀请链接 + * @param groupId 群组ID + * @param code 邀请码 + * @param expiredAt 过期时间,是一个时间戳,单位ms,为undefined则为不限制 + * @param usageLimit 最大使用次数,为undefined则不限制 + */ +export async function editGroupInvite( + groupId: string, + code: string, + expiredAt?: number, + usageLimit?: number +) { + await request.post('/api/group/invite/editGroupInvite', { + groupId, + code, + expiredAt, + usageLimit, + }); +} + +/** + * 获取群组所有邀请码 + * @param groupId 群组ID + */ +export async function getAllGroupInviteCode( + groupId: string +): Promise { + const { data } = await request.get( + '/api/group/invite/getAllGroupInviteCode', + { + params: { + groupId, + }, + } + ); + + return data; +} + +/** + * 根据邀请码查找邀请信息 + * @param inviteCode 邀请码 + */ +export async function findGroupInviteByCode( + inviteCode: string +): Promise { + const { data } = await request.get('/api/group/invite/findInviteByCode', { + params: { + code: inviteCode, + }, + }); + + return data; +} + +/** + * 使用群组邀请 + * 即通过群组邀请加入群组 + */ +export async function applyGroupInvite(inviteCode: string): Promise { + await request.post('/api/group/invite/applyInvite', { + code: inviteCode, + }); +} + +/** + * 删除群组邀请 + */ +export async function deleteGroupInvite( + groupId: string, + inviteId: string +): Promise { + await request.post('/api/group/invite/deleteInvite', { + groupId, + inviteId, + }); +} + +/** + * 创建群组面板 + */ +export async function createGroupPanel( + groupId: string, + options: { + name: string; + type: number; + parentId?: string; + provider?: string; + pluginPanelName?: string; + meta?: Record; + } +) { + await request.post('/api/group/createGroupPanel', { + ...options, + groupId, + }); +} + +/** + * 创建群组面板 + */ +export async function modifyGroupPanel( + groupId: string, + panelId: string, + options: { + name: string; + type: number; + parentId?: string; + provider?: string; + pluginPanelName?: string; + meta?: Record; + } +) { + await request.post('/api/group/modifyGroupPanel', { + ...options, + groupId, + panelId, + }); +} + +/** + * 删除群组面板 + * @param groupId 群组Id + * @param panelId 面板Id + */ +export async function deleteGroupPanel(groupId: string, panelId: string) { + await request.post('/api/group/deleteGroupPanel', { + groupId, + panelId, + }); +} + +/** + * 创建群组身份组 + * @param groupId 群组id + * @param roleName 群组名 + * @param permissions 初始权限 + */ +export async function createGroupRole( + groupId: string, + roleName: string, + permissions: string[] +) { + await request.post('/api/group/createGroupRole', { + groupId, + roleName, + permissions, + }); +} + +/** + * 删除群组身份组 + * @param groupId 群组Id + * @param roleId 身份组Id + */ +export async function deleteGroupRole(groupId: string, roleId: string) { + await request.post('/api/group/deleteGroupRole', { + groupId, + roleId, + }); +} + +/** + * 删除群组身份组 + * @param groupId 群组Id + * @param roleId 身份组Id + * @param roleName 新身份组名 + */ +export async function updateGroupRoleName( + groupId: string, + roleId: string, + roleName: string +) { + await request.post('/api/group/updateGroupRoleName', { + groupId, + roleId, + roleName, + }); +} + +/** + * 删除群组身份组 + * @param groupId 群组Id + * @param roleId 身份组Id + * @param permissions 全量权限列表 + */ +export async function updateGroupRolePermission( + groupId: string, + roleId: string, + permissions: string[] +) { + await request.post('/api/group/updateGroupRolePermission', { + groupId, + roleId, + permissions, + }); +} + +/** + * 禁言群组成员 + * @param groupId 群组ID + * @param memberId 成员ID + * @param muteMs 禁言到xxx, 精确到毫秒 + */ +export async function muteGroupMember( + groupId: string, + memberId: string, + muteMs: number +) { + await request.post('/api/group/muteGroupMember', { + groupId, + memberId, + muteMs, + }); +} + +/** + * 移出群组成员 + * @param groupId 群组ID + * @param memberId 成员ID + */ +export async function deleteGroupMember(groupId: string, memberId: string) { + await request.post('/api/group/deleteGroupMember', { + groupId, + memberId, + }); +} + +/** + * Get Group Panel Data from group.extra service + */ +export async function getGroupPanelExtraData( + groupId: string, + panelId: string, + name: string +): Promise { + const { data } = await request.post('/api/group/extra/getPanelData', { + groupId, + panelId, + name, + }); + + return data.data ?? null; +} + +/** + * Save Group Panel Data to group.extra service + */ +export async function saveGroupPanelExtraData( + groupId: string, + panelId: string, + name: string, + data: any +): Promise { + await request.post('/api/group/extra/savePanelData', { + groupId, + panelId, + name, + data: typeof data === 'string' ? data : JSON.stringify(data), + }); +} diff --git a/client/shared/model/inbox.ts b/client/shared/model/inbox.ts new file mode 100644 index 00000000000..375b2dd7f4e --- /dev/null +++ b/client/shared/model/inbox.ts @@ -0,0 +1,23 @@ +import { request } from '../api/request'; +export type { + BasicInboxItem, + MessageInboxItem, + MarkdownInboxItem, + InboxItem, +} from 'tailchat-types'; + +/** + * 设置收件箱某条记录已读 + */ +export async function setInboxAck(inboxItemIds: string[]) { + await request.post('/api/chat/inbox/ack', { + inboxItemIds, + }); +} + +/** + * 清空收件箱 + */ +export async function clearInbox() { + await request.post('/api/chat/inbox/clear'); +} diff --git a/client/shared/model/message.ts b/client/shared/model/message.ts new file mode 100644 index 00000000000..35842a25c24 --- /dev/null +++ b/client/shared/model/message.ts @@ -0,0 +1,204 @@ +import { request } from '../api/request'; +import type { ChatMessageReaction, ChatMessage } from 'tailchat-types'; +import { + createAutoMergedRequest, + createAutoSplitRequest, +} from '../utils/request'; +import _uniq from 'lodash/uniq'; +import _flatten from 'lodash/flatten'; +import _zipObject from 'lodash/zipObject'; + +export { ChatMessageReaction, ChatMessage }; + +export interface LocalChatMessage extends ChatMessage { + /** + * 本地添加消息的标识,用于标记该条消息尚未确定已经发送到服务端 + */ + isLocal?: boolean; + /** + * 判断是否发送失败 + */ + sendFailed?: boolean; +} + +export interface SimpleMessagePayload { + groupId?: string; + converseId: string; + content: string; +} + +export interface SendMessagePayloadMeta { + mentions?: string[]; +} + +export interface SendMessagePayload extends SimpleMessagePayload { + /** + * content的plain内容 + * 用于inbox + */ + plain?: string; + meta?: SendMessagePayloadMeta; +} + +/** + * 获取会话消息 + * @param converseId 会话ID + * @param startId 开始ID + */ +export async function fetchConverseMessage( + converseId: string, + startId?: string +): Promise { + const { data } = await request.get('/api/chat/message/fetchConverseMessage', { + params: { + converseId, + startId, + }, + }); + + return data; +} + +/** + * 发送消息 + * @param payload 消息体 + */ +export async function sendMessage( + payload: SendMessagePayload +): Promise { + const { data } = await request.post('/api/chat/message/sendMessage', payload); + + return data; +} + +/** + * 撤回消息 + * @param messageId 消息ID + */ +export async function recallMessage(messageId: string): Promise { + const { data } = await request.post('/api/chat/message/recallMessage', { + messageId, + }); + + return data; +} + +export async function deleteMessage(messageId: string): Promise { + const { data } = await request.post('/api/chat/message/deleteMessage', { + messageId, + }); + + return data; +} + +/** + * 搜索聊天记录 + * @param converseId 会话id + * @param messageText 聊天文本 + */ +export async function searchMessage( + text: string, + converseId: string, + groupId?: string +): Promise { + const { data } = await request.post('/api/chat/message/searchMessage', { + text, + converseId, + groupId, + }); + + return data; +} + +interface LastMessageInfo { + converseId: string; + lastMessageId: string; +} + +/** + * 基于会话id获取会话最后一条消息的id + */ +async function fetchConverseLastMessages( + converseIds: string[] +): Promise<{ converseId: string; lastMessageId: string }[]> { + const { data } = await request.post( + '/api/chat/message/fetchConverseLastMessages', + { + converseIds, + } + ); + + return data; +} + +export const _fetchConverseLastMessageInfo = createAutoMergedRequest< + string[], + (LastMessageInfo | null)[] +>( + createAutoSplitRequest( + async (converseIdsList) => { + const uniqList = _uniq(_flatten(converseIdsList)); + const infoList = await fetchConverseLastMessages(uniqList); + + const map = _zipObject(uniqList, infoList); + + // 将请求结果根据传输来源重新分组 + return converseIdsList.map((converseIds) => + converseIds.map((converseId) => map[converseId] ?? null) + ); + }, + 'serial', + 100 + ) +); +export function getConverseLastMessageInfo(converseIds: string[]) { + return _fetchConverseLastMessageInfo(converseIds); +} + +/** + * @param converseId 会话ID + * @param messageId 消息ID + * @returns 消息附近的信息 + */ +export async function fetchNearbyMessage(params: { + groupId?: string; + converseId: string; + messageId: string; +}): Promise { + const { data } = await request.post( + '/api/chat/message/fetchNearbyMessage', + params + ); + + return data; +} + +/** + * 增加表情行为 + */ +export async function addReaction( + messageId: string, + emoji: string +): Promise { + const { data } = await request.post('/api/chat/message/addReaction', { + messageId, + emoji, + }); + + return data; +} + +/** + * 移除表情行为 + */ +export async function removeReaction( + messageId: string, + emoji: string +): Promise { + const { data } = await request.post('/api/chat/message/removeReaction', { + messageId, + emoji, + }); + + return data; +} diff --git a/shared/model/plugin.ts b/client/shared/model/plugin.ts similarity index 92% rename from shared/model/plugin.ts rename to client/shared/model/plugin.ts index da71c1e1143..3d88695252a 100644 --- a/shared/model/plugin.ts +++ b/client/shared/model/plugin.ts @@ -6,6 +6,7 @@ export interface PluginManifest { * @example 网页面板插件 */ label: string; + 'label.zh-CN'?: string; /** * 插件名, 插件唯一标识 @@ -42,6 +43,7 @@ export interface PluginManifest { * 插件描述 */ description: string; + 'description.zh-CN'?: string; /** * 是否需要重启才能应用插件 @@ -72,7 +74,7 @@ export async function fetchRegistryPlugins(): Promise { * 后端固定 */ export async function fetchServiceRegistryPlugins(): Promise { - const { data } = await request.get('/registry.json'); + const { data } = await request.get('/registry-be.json'); return data; } diff --git a/client/shared/model/user.ts b/client/shared/model/user.ts new file mode 100644 index 00000000000..47fcd54f8bc --- /dev/null +++ b/client/shared/model/user.ts @@ -0,0 +1,435 @@ +import { request } from '../api/request'; +import { buildCachedRequest } from '../cache/utils'; +import { sharedEvent } from '../event'; +import { SYSTEM_USERID } from '../utils/consts'; +import { + createAutoMergedRequest, + createAutoSplitRequest, +} from '../utils/request'; +import _pick from 'lodash/pick'; +import _uniq from 'lodash/uniq'; +import _flatten from 'lodash/flatten'; +import _zipObject from 'lodash/zipObject'; +import { t } from '../i18n'; +import type { UserBaseInfo } from 'tailchat-types'; +import { isObjectId } from '../utils/string-helper'; + +export type { UserBaseInfo }; + +export interface UserLoginInfo extends UserBaseInfo { + token: string; + createdAt: string; +} + +export interface UserSettings { + /** + * 消息列表虚拟化 + */ + messageListVirtualization?: boolean; + + /** + * 消息通知免打扰(静音) + */ + messageNotificationMuteList?: string[]; + + /** + * 群组排序, 内容为群组id + */ + groupOrderList?: string[]; + + /** + * 是否关闭消息右键菜单 + */ + disableMessageContextMenu?: boolean; + + /** + * 其他的设置项 + */ + [key: string]: any; +} + +export function pickUserBaseInfo(userInfo: UserLoginInfo): UserBaseInfo { + return _pick(userInfo, [ + '_id', + 'email', + 'nickname', + 'discriminator', + 'avatar', + 'temporary', + 'type', + 'emailVerified', + 'banned', + ]); +} + +// 内置用户信息 +const builtinUserInfo: Record UserBaseInfo> = { + [SYSTEM_USERID]: () => ({ + _id: SYSTEM_USERID, + email: 'admin@msgbyte.com', + nickname: t('系统'), + discriminator: '0000', + avatar: null, + temporary: false, + type: 'normalUser', + emailVerified: false, + banned: false, + }), + '': () => ({ + // dummy + _id: '', + email: '', + nickname: '', + discriminator: '0000', + avatar: null, + temporary: false, + type: 'normalUser', + emailVerified: false, + banned: false, + }), +}; + +/** + * 用户私信列表 + */ +export interface UserDMList { + userId: string; + converseIds: string[]; +} + +/** + * 邮箱登录 + * @param email 邮箱 + * @param password 密码 + */ +export async function loginWithEmail( + email: string, + password: string +): Promise { + const { data } = await request.post('/api/user/login', { + email, + password, + }); + + sharedEvent.emit('loginSuccess', pickUserBaseInfo(data)); + + return data; +} + +/** + * 使用 Token 登录 + * @param token JWT令牌 + */ +export async function loginWithToken(token: string): Promise { + const { data } = await request.post('/api/user/resolveToken', { + token, + }); + + sharedEvent.emit('loginSuccess', pickUserBaseInfo(data)); + + return data; +} + +/** + * 发送邮箱校验码 + * @param email 邮箱 + */ +export async function verifyEmail(email: string): Promise { + const { data } = await request.post('/api/user/verifyEmail', { + email, + }); + + return data; +} + +/** + * 检查邮箱校验码并更新用户字段 + * @param email 邮箱 + */ +export async function verifyEmailWithOTP( + emailOTP: string +): Promise { + const { data } = await request.post('/api/user/verifyEmailWithOTP', { + emailOTP, + }); + + return data; +} + +/** + * 邮箱注册账号 + * @param email 邮箱 + * @param password 密码 + */ +export async function registerWithEmail({ + email, + password, + nickname, + emailOTP, +}: { + email: string; + password: string; + nickname?: string; + emailOTP?: string; +}): Promise { + const { data } = await request.post('/api/user/register', { + email, + nickname, + password, + emailOTP, + }); + + return data; +} + +/** + * 修改密码 + */ +export async function modifyUserPassword( + oldPassword: string, + newPassword: string +): Promise { + await request.post('/api/user/modifyPassword', { + oldPassword, + newPassword, + }); +} + +/** + * 忘记密码 + * @param email 邮箱 + */ +export async function forgetPassword(email: string) { + await request.post('/api/user/forgetPassword', { + email, + }); +} + +/** + * 忘记密码 + * @param email 邮箱 + */ +export async function resetPassword( + email: string, + password: string, + otp: string +) { + await request.post('/api/user/resetPassword', { + email, + password, + otp, + }); +} + +/** + * 创建访客账号 + * @param nickname 访客昵称 + */ +export async function createTemporaryUser( + nickname: string +): Promise { + const { data } = await request.post('/api/user/createTemporaryUser', { + nickname, + }); + + return data; +} + +/** + * 认领访客账号 + */ +export async function claimTemporaryUser( + userId: string, + email: string, + password: string, + emailOTP?: string +): Promise { + const { data } = await request.post('/api/user/claimTemporaryUser', { + userId, + email, + password, + emailOTP, + }); + + return data; +} + +/** + * 使用唯一标识名搜索用户 + * @param uniqueName 唯一标识用户昵称: 用户昵称#0000 + */ +export async function searchUserWithUniqueName( + uniqueName: string +): Promise { + const { data } = await request.post('/api/user/searchUserWithUniqueName', { + uniqueName, + }); + + return data; +} + +const _fetchUserInfo = createAutoMergedRequest( + createAutoSplitRequest( + async (userIds) => { + // 这里用post是为了防止一次性获取的userId过多超过url限制 + const { data } = await request.post('/api/user/getUserInfoList', { + userIds, + }); + + return data; + }, + 'serial', + 1000 + ) +); +/** + * 获取用户基本信息 + * @param userId 用户ID + */ +export async function fetchUserInfo(userId: string): Promise { + if ( + builtinUserInfo[userId] && + typeof builtinUserInfo[userId] === 'function' + ) { + return builtinUserInfo[userId](); + } + + if (!isObjectId(userId)) { + throw new Error(`Invalid userId: ${userId}`); + } + + const userInfo = await _fetchUserInfo(userId); + + return userInfo; +} + +const _fetchUserOnlineStatus = createAutoMergedRequest( + createAutoSplitRequest( + async (userIdsList) => { + const uniqList = _uniq(_flatten(userIdsList)); + // 这里用post是为了防止一次性获取的userId过多超过url限制 + const { data } = await request.post('/api/gateway/checkUserOnline', { + userIds: uniqList, + }); + + const map = _zipObject(uniqList, data); + + // 将请求结果根据传输来源重新分组 + return userIdsList.map((userIds) => + userIds.map((userId) => map[userId] ?? false) + ); + }, + 'serial', + 1000 + ) +); + +/** + * 获取用户在线状态 + */ +export async function getUserOnlineStatus( + userIds: string[] +): Promise { + return _fetchUserOnlineStatus(userIds); +} + +/** + * 将会话添加到用户私信列表 + * 如果已添加则后端忽略 + */ +export async function appendUserDMConverse( + converseId: string +): Promise { + const { data } = await request.post( + '/api/user/dmlist/addConverse', + { + converseId, + } + ); + + return data; +} + +/** + * 移除会话列表 + */ +export async function removeUserDMConverse( + converseId: string +): Promise { + const { data } = await request.post( + '/api/user/dmlist/removeConverse', + { + converseId, + } + ); + + return data; +} + +/** + * 修改用户属性 + * @param fieldName 要修改的属性名 + * @param fieldValue 要修改的属性的值 + */ +type AllowedModifyField = 'nickname' | 'avatar'; +export async function modifyUserField( + fieldName: AllowedModifyField, + fieldValue: unknown +): Promise { + const { data } = await request.post('/api/user/updateUserField', { + fieldName, + fieldValue, + }); + + return data; +} + +export async function modifyUserExtra( + fieldName: string, + fieldValue: unknown +): Promise { + const { data } = await request.post('/api/user/updateUserExtra', { + fieldName, + fieldValue, + }); + + return data; +} + +/** + * 获取用户设置 + */ +export async function getUserSettings(): Promise { + const { data } = await request.get('/api/user/getUserSettings'); + + sharedEvent.emit('userSettingsUpdate', data); + + return data; +} + +/** + * 设置用户设置 + */ +export async function setUserSettings( + settings: UserSettings +): Promise { + const { data } = await request.post('/api/user/setUserSettings', { + settings, + }); + + return data; +} + +/** + * 检查Token是否可用 + */ +export const checkTokenValid = buildCachedRequest( + 'tokenValid', + async (token: string): Promise => { + const { data } = await request.post('/api/user/checkTokenValid', { + token, + }); + + return data; + } +); diff --git a/client/shared/package.json b/client/shared/package.json new file mode 100644 index 00000000000..6e49b7d145d --- /dev/null +++ b/client/shared/package.json @@ -0,0 +1,45 @@ +{ + "name": "tailchat-shared", + "private": true, + "version": "1.0.0", + "main": "index.tsx", + "repository": "https://github.com/msgbyte/tailchat.git", + "author": "moonrailgun ", + "license": "GPLv3", + "dependencies": { + "@reduxjs/toolkit": "^1.7.1", + "@tanstack/query-async-storage-persister": "4.32.6", + "@tanstack/react-query": "4.33.0", + "@tanstack/react-query-persist-client": "4.33.0", + "axios": "^0.21.1", + "crc": "^3.8.0", + "dayjs": "^1.10.6", + "eventemitter-strict": "^1.0.1", + "filesize": "^8.0.7", + "flatted": "^3.2.4", + "formik": "^2.2.9", + "i18next": "^21.9.2", + "i18next-http-backend": "^1.4.1", + "lodash": "^4.17.21", + "react-i18next": "^11.18.6", + "react-native-storage": "npm:@trpgengine/react-native-storage@^1.0.1", + "react-redux": "^8.0.2", + "regenerator-runtime": "^0.13.9", + "socket.io-client": "^4.1.2", + "socket.io-msgpack-parser": "^3.0.2", + "tailchat-types": "workspace:^", + "url-regex": "^5.0.0", + "yup": "^0.32.9", + "zustand": "^4.3.6" + }, + "devDependencies": { + "@types/crc": "^3.4.0", + "@types/lodash": "^4.14.170", + "@types/react": "18.0.20", + "react": "18.2.0" + }, + "peerDependencies": { + "react": "18.2.0", + "react-dom": "18.2.0" + } +} diff --git a/client/shared/redux/hooks/useAckInfo.ts b/client/shared/redux/hooks/useAckInfo.ts new file mode 100644 index 00000000000..2f141190ded --- /dev/null +++ b/client/shared/redux/hooks/useAckInfo.ts @@ -0,0 +1,41 @@ +import { useAppDispatch, useAppSelector } from './useAppSelector'; +import { chatActions } from '../slices'; +import { useEvent } from '../../hooks/useEvent'; +import { getCachedAckInfo } from '../../cache/cache'; + +export function useAckInfoChecker() { + const ack = useAppSelector((state) => state.chat.ack); + const lastMessageMap = useAppSelector((state) => state.chat.lastMessageMap); + const dispatch = useAppDispatch(); + + const ensureAckInfo = useEvent((converseId: string) => { + if ( + ack[converseId] === undefined || + lastMessageMap[converseId] === undefined + ) { + getCachedAckInfo(converseId).then((info) => { + if (info.ack?.lastMessageId) { + dispatch( + chatActions.setConverseAck({ + converseId, + lastMessageId: info.ack.lastMessageId, + }) + ); + } + + if (info.lastMessage?.lastMessageId) { + dispatch( + chatActions.setLastMessageMap([ + { + converseId, + lastMessageId: info.lastMessage.lastMessageId, + }, + ]) + ); + } + }); + } + }); + + return { ensureAckInfo }; +} diff --git a/shared/redux/hooks/useAppSelector.ts b/client/shared/redux/hooks/useAppSelector.ts similarity index 100% rename from shared/redux/hooks/useAppSelector.ts rename to client/shared/redux/hooks/useAppSelector.ts diff --git a/client/shared/redux/hooks/useConverse.ts b/client/shared/redux/hooks/useConverse.ts new file mode 100644 index 00000000000..ff15ec80aee --- /dev/null +++ b/client/shared/redux/hooks/useConverse.ts @@ -0,0 +1,31 @@ +import { useMemo } from 'react'; +import { ChatConverseType } from '../../model/converse'; +import type { ChatConverseState } from '../slices/chat'; +import { useAppSelector } from './useAppSelector'; + +/** + * 获取私信会话列表 + * 并补充一些信息 + */ +export function useDMConverseList(): ChatConverseState[] { + const converses = useAppSelector((state) => state.chat.converses); + const lastMessageMap = useAppSelector((state) => state.chat.lastMessageMap); + + const filteredConverse = useMemo( + () => + Object.entries(converses) + .filter(([, info]) => + [ChatConverseType.DM, ChatConverseType.Multi].includes(info.type) + ) + .map(([, info]) => info), + [converses] + ); + + return useMemo(() => { + return filteredConverse.sort((a, b) => { + return (lastMessageMap[a._id] ?? '') < (lastMessageMap[b._id] ?? '') + ? 1 + : -1; + }); + }, [filteredConverse, lastMessageMap]); +} diff --git a/client/shared/redux/hooks/useConverseAck.ts b/client/shared/redux/hooks/useConverseAck.ts new file mode 100644 index 00000000000..1689580b39c --- /dev/null +++ b/client/shared/redux/hooks/useConverseAck.ts @@ -0,0 +1,67 @@ +import { useRef } from 'react'; +import { useAppDispatch, useAppSelector } from './useAppSelector'; +import _debounce from 'lodash/debounce'; +import { isLocalMessageId, isValidStr } from '../../utils/string-helper'; +import { chatActions } from '../slices'; +import { updateAck } from '../../model/converse'; +import { useMemoizedFn } from '../../hooks/useMemoizedFn'; + +const updateAckDebounce = _debounce( + (converseId: string, lastMessageId: string) => { + updateAck(converseId, lastMessageId); + }, + 1000, + { leading: true, trailing: true } +); + +/** + * 会话已读信息管理 + */ +export function useConverseAck(converseId: string) { + const dispatch = useAppDispatch(); + const converseLastMessage = useAppSelector( + (state) => state.chat.lastMessageMap[converseId] + ); + + const lastMessageIdRef = useRef(''); + lastMessageIdRef.current = useAppSelector( + (state) => state.chat.ack[converseId] ?? '' + ); + + const setConverseAck = useMemoizedFn( + (converseId: string, lastMessageId: string) => { + if (isLocalMessageId(lastMessageId)) { + // 跳过本地消息 + return; + } + + if ( + isValidStr(lastMessageIdRef.current) && + lastMessageId <= lastMessageIdRef.current + ) { + // 更新的数字比较小,跳过 + return; + } + + dispatch(chatActions.setConverseAck({ converseId, lastMessageId })); + updateAckDebounce(converseId, lastMessageId); + lastMessageIdRef.current = lastMessageId; + } + ); + + /** + * 更新会话最新消息 + */ + const updateConverseAck = useMemoizedFn((lastMessageId: string) => { + setConverseAck(converseId, lastMessageId); + }); + + /** + * 标记为会话已读 + */ + const markConverseAllAck = useMemoizedFn(() => { + updateConverseAck(converseLastMessage); + }); + + return { updateConverseAck, markConverseAllAck }; +} diff --git a/client/shared/redux/hooks/useConverseMessage.ts b/client/shared/redux/hooks/useConverseMessage.ts new file mode 100644 index 00000000000..154fbd6e228 --- /dev/null +++ b/client/shared/redux/hooks/useConverseMessage.ts @@ -0,0 +1,227 @@ +import { useEffect } from 'react'; +import { ensureDMConverse } from '../../helper/converse-helper'; +import { useAsync } from '../../hooks/useAsync'; +import { showErrorToasts } from '../../manager/ui'; +import { + fetchConverseMessage, + sendMessage, + SendMessagePayload, +} from '../../model/message'; +import { chatActions } from '../slices'; +import { useAppDispatch, useAppSelector } from './useAppSelector'; +import _get from 'lodash/get'; +import _isNil from 'lodash/isNil'; +import _uniqueId from 'lodash/uniqueId'; +import { + ChatConverseState, + isValidStr, + t, + useAsyncRequest, + useChatBoxContext, + useEvent, + useMemoizedFn, +} from '../..'; +import { MessageHelper } from '../../utils/message-helper'; +import { ChatConverseType } from '../../model/converse'; +import { sharedEvent } from '../../event'; +import { useUpdateRef } from '../../hooks/useUpdateRef'; + +const genLocalMessageId = () => _uniqueId('localMessage_'); + +function useHandleSendMessage() { + const userId = useAppSelector((state) => state.user.info?._id); + const dispatch = useAppDispatch(); + const { hasContext, replyMsg, clearReplyMsg } = useChatBoxContext(); + const replyMsgRef = useUpdateRef(replyMsg); // NOTICE: 这个是为了修复一个边界case: 当先输入文本再选中消息回复时,直接发送无法带上回复信息 + + /** + * 发送消息 + */ + const handleSendMessage = useEvent((payload: SendMessagePayload) => { + // 输入合法性检测 + if (payload.content === '') { + showErrorToasts(t('无法发送空消息')); + return; + } + + if (hasContext === true) { + // 如果有上下文, 则组装payload + const msgHelper = new MessageHelper(payload); + if (!_isNil(replyMsgRef.current)) { + msgHelper.setReplyMsg(replyMsgRef.current); + clearReplyMsg(); + } + + payload = msgHelper.generatePayload(); + } + + const localMessageId = genLocalMessageId(); + dispatch( + chatActions.appendLocalMessage({ + author: userId, + localMessageId, + payload, + }) + ); + + sendMessage(payload) + .then((message) => { + dispatch( + chatActions.deleteMessageById({ + converseId: payload.converseId, + messageId: localMessageId, + }) + ); + dispatch( + chatActions.appendConverseMessage({ + converseId: payload.converseId, + messages: [message], + }) + ); // 确保删除消息后会立即显示消息,适用于网络卡顿的情况,同时远程的socket会接收到消息广播,在redux中会自动去重 + + sharedEvent.emit('sendMessage', payload); + }) + .catch((err) => { + showErrorToasts(err); + dispatch( + chatActions.updateMessageInfo({ + messageId: localMessageId, + message: { + sendFailed: true, + }, + }) + ); + }); + }); + + return handleSendMessage; +} + +/** + * 会话消息管理 + */ +interface ConverseContext { + converseId: string; + isGroup: boolean; +} +export function useConverseMessage(context: ConverseContext) { + const { converseId, isGroup } = context; + const converse = useAppSelector( + (state) => state.chat.converses[converseId] + ); + const reconnectNum = useAppSelector((state) => state.global.reconnectNum); + const hasMoreMessage = converse?.hasMoreMessage ?? true; + const dispatch = useAppDispatch(); + const messages = converse?.messages ?? []; + const currentUserId = useAppSelector((state) => state.user.info?._id); + + useEffect(() => { + dispatch(chatActions.updateCurrentConverseId(converseId)); + + return () => { + dispatch(chatActions.updateCurrentConverseId(null)); + }; + }, [converseId]); + + // NOTICE: 该hook只会在converseId变化和重新链接时执行 + const { loading, error } = useAsync(async () => { + if (!currentUserId) { + // 如果当前用户不存在则跳过逻辑 + return; + } + + if (!converse) { + // 如果是一个新会话(或者当前会话列表中没有) + if (!isGroup) { + // 如果是私信会话 + // Step 1. 创建会话 并确保私信列表中存在该会话 + const converse = await ensureDMConverse(converseId, currentUserId); + dispatch(chatActions.setConverseInfo(converse)); + } else { + // 如果是群组会话(文本频道) + // Step 1. 确保群组会话存在 + dispatch( + chatActions.setConverseInfo({ + _id: converseId, + name: '', + type: ChatConverseType.Group, + members: [], + }) + ); + } + + // Step 2. 拉取消息 + const historyMessages = await fetchConverseMessage(converseId); + dispatch( + chatActions.initialHistoryMessage({ + converseId, + historyMessages, + }) + ); + } else { + // 已存在会话 + if (!converse.hasFetchedHistory) { + // 没有获取过历史消息 + // 拉取历史消息 + const startId = _isNil(converse.messages[0]) + ? undefined + : converse.messages[0]._id; + const messages = await fetchConverseMessage(converseId, startId); + dispatch( + chatActions.initialHistoryMessage({ + converseId, + historyMessages: messages, + }) + ); + } + } + }, [converseId, reconnectNum, currentUserId]); + + // 加载更多消息 + const [{ loading: isLoadingMore }, _handleFetchMoreMessage] = + useAsyncRequest(async () => { + const firstMessageId = _get(messages, [0, '_id']); + if (!isValidStr(firstMessageId)) { + return; + } + + if (hasMoreMessage === false) { + return; + } + + const olderMessages = await fetchConverseMessage( + converseId, + firstMessageId + ); + dispatch( + chatActions.appendHistoryMessage({ + converseId, + historyMessages: olderMessages, + }) + ); + }, [converseId, hasMoreMessage, _get(messages, [0, '_id'])]); + + /** + * 加载更多 + * 同一时间只能请求一次 + */ + const handleFetchMoreMessage = useMemoizedFn(async () => { + if (isLoadingMore) { + return; + } + + await _handleFetchMoreMessage(); + }); + + const handleSendMessage = useHandleSendMessage(); + + return { + messages, + loading, + error, + isLoadingMore, + hasMoreMessage, + handleFetchMoreMessage, + handleSendMessage, + }; +} diff --git a/client/shared/redux/hooks/useDMConverseName.ts b/client/shared/redux/hooks/useDMConverseName.ts new file mode 100644 index 00000000000..2f69d3e62e4 --- /dev/null +++ b/client/shared/redux/hooks/useDMConverseName.ts @@ -0,0 +1,23 @@ +import { getDMConverseName } from '../../helper/converse-helper'; +import { isValidStr, useAppSelector, useAsync } from '../../index'; +import type { ChatConverseState } from '../slices/chat'; +import { useUserId } from './useUserInfo'; +import type { FriendInfo } from '../slices/user'; + +export function useDMConverseName(converse: ChatConverseState | undefined) { + const userId = useUserId(); + const friends: FriendInfo[] = useAppSelector((state) => state.user.friends); + const { value: name = '' } = useAsync(async () => { + if (!converse) { + return ''; + } + + if (!isValidStr(userId)) { + return ''; + } + + return getDMConverseName(userId, converse); + }, [userId, converse?.name, converse?.members.join(','), friends]); + + return name; +} diff --git a/client/shared/redux/hooks/useFriendNickname.ts b/client/shared/redux/hooks/useFriendNickname.ts new file mode 100644 index 00000000000..061a94b7324 --- /dev/null +++ b/client/shared/redux/hooks/useFriendNickname.ts @@ -0,0 +1,33 @@ +import { useMemo } from 'react'; +import { buildFriendNicknameMap } from '../../helper/converse-helper'; +import { isValidStr } from '../../utils/string-helper'; +import { useAppSelector } from './useAppSelector'; + +/** + * 获取好友自定义的昵称 + * 用于覆盖原始昵称 + * + * @param userId 用户id + */ +export function useFriendNickname(userId: string): string | null { + const nickname = useAppSelector( + (state) => state.user.friends.find((f) => f.id === userId)?.nickname + ); + + if (isValidStr(nickname)) { + return nickname; + } + + return null; +} + +export function useFriendNicknameMap(): Record { + const friends = useAppSelector((state) => state.user.friends); + + const friendNicknameMap = useMemo( + () => buildFriendNicknameMap(friends), + [friends] + ); + + return friendNicknameMap; +} diff --git a/shared/redux/hooks/useGroup.ts b/client/shared/redux/hooks/useGroup.ts similarity index 79% rename from shared/redux/hooks/useGroup.ts rename to client/shared/redux/hooks/useGroup.ts index 5310ab566a2..f575099e9bd 100644 --- a/shared/redux/hooks/useGroup.ts +++ b/client/shared/redux/hooks/useGroup.ts @@ -1,10 +1,12 @@ import { useMemo } from 'react'; -import { GroupInfo, GroupPanel, GroupPanelType } from '../../model/group'; +import { useUserInfoList } from '../..'; +import type { GroupInfo, GroupPanel } from '../../model/group'; import type { UserBaseInfo } from '../../model/user'; import { isValidStr } from '../../utils/string-helper'; import { useAppSelector } from './useAppSelector'; import { useUnread } from './useUnread'; -import { useUserId, useUserInfoList } from './useUserInfo'; +import { useUserId } from './useUserInfo'; +import _compact from 'lodash/compact'; /** * 获取群组信息 @@ -31,7 +33,7 @@ export function useGroupMemberInfos(groupId: string): UserBaseInfo[] { const groupMemberIds = useGroupMemberIds(groupId); const userInfos = useUserInfoList(groupMemberIds); - return userInfos; + return _compact(userInfos); // 开发环境,可能会出现member里面id为不存在的脏数据,生产环境原则上不会出现,兼容一下 } /** @@ -74,21 +76,6 @@ export function useIsGroupOwner(groupId: string, userId?: string): boolean { } } -/** - * 检查群组是否有未读消息 - * @param groupId 群组id - */ -export function useGroupUnread(groupId: string): boolean { - const group = useGroupInfo(groupId); - const groupTextPanelIds = (group?.panels ?? []) - .filter((panel) => panel.type === GroupPanelType.TEXT) - .map((p) => p.id); - - const unread = useUnread(groupTextPanelIds); - - return unread.some((u) => u === true); -} - /** * 检查群组聊天面板是否有未读消息 * @param textPanelId 文字面板id diff --git a/client/shared/redux/hooks/useGroupAck.ts b/client/shared/redux/hooks/useGroupAck.ts new file mode 100644 index 00000000000..62981f4c4d9 --- /dev/null +++ b/client/shared/redux/hooks/useGroupAck.ts @@ -0,0 +1,31 @@ +import { useMemoizedFn } from '../../hooks/useMemoizedFn'; +import { updateAck } from '../../model/converse'; +import { isConversePanel } from '../../utils/panel-helper'; +import { chatActions } from '../slices'; +import { useAppDispatch, useAppSelector } from './useAppSelector'; +import { useGroupInfo } from './useGroup'; + +/** + * 群组级别的已读管理 + */ +export function useGroupAck(groupId: string) { + const groupInfo = useGroupInfo(groupId); + const lastMessageMap = useAppSelector((state) => state.chat.lastMessageMap); + const dispatch = useAppDispatch(); + + const markGroupAllAck = useMemoizedFn(() => { + const conversePanels = (groupInfo?.panels ?? []).filter(isConversePanel); + + for (const converse of conversePanels) { + const converseId = converse.id; + const lastMessageId = lastMessageMap[converseId]; + + if (converseId && lastMessageId) { + dispatch(chatActions.setConverseAck({ converseId, lastMessageId })); + updateAck(converseId, lastMessageId); + } + } + }); + + return { markGroupAllAck }; +} diff --git a/client/shared/redux/hooks/useGroupMemberMute.ts b/client/shared/redux/hooks/useGroupMemberMute.ts new file mode 100644 index 00000000000..dba6a683e22 --- /dev/null +++ b/client/shared/redux/hooks/useGroupMemberMute.ts @@ -0,0 +1,24 @@ +import { useAppSelector } from './useAppSelector'; + +/** + * 获取用户禁言状态 + * @param groupId 群组ID + * @param userId 用户ID + * @returns 如果没有禁言状态或者有禁言但是已过期则返回false,否则返回禁言到的时间 + */ +export function useGroupMemberMute( + groupId: string, + userId: string +): string | false { + const muteUntil = useAppSelector( + (state) => + state.group.groups[groupId]?.members.find((m) => m.userId === userId) + ?.muteUntil + ); + + if (!muteUntil || new Date(muteUntil).valueOf() < new Date().valueOf()) { + return false; + } + + return muteUntil; +} diff --git a/client/shared/redux/hooks/useGroupPermission.ts b/client/shared/redux/hooks/useGroupPermission.ts new file mode 100644 index 00000000000..9e604841cf0 --- /dev/null +++ b/client/shared/redux/hooks/useGroupPermission.ts @@ -0,0 +1,137 @@ +import { useGroupInfo } from './useGroup'; +import { useUserId } from './useUserInfo'; +import _uniq from 'lodash/uniq'; +import _flatten from 'lodash/flatten'; +import { useDebugValue, useMemo } from 'react'; +import { getPermissionList } from '../..'; + +/** + * 获取群组用户的所有权限 + */ +export function useGroupMemberAllPermissions(groupId: string): string[] { + const groupInfo = useGroupInfo(groupId); + const userId = useUserId(); + + if (!groupInfo || !userId) { + return []; + } + + if (groupInfo.owner === userId) { + // 群组管理员拥有一切权限 + // 返回所有权限 + return getPermissionList().map((p) => p.key); + } + + const members = groupInfo.members; + + const groupRoles = groupInfo.roles; + const userRoles = members.find((m) => m.userId === userId)?.roles ?? []; + const userPermissions = _uniq([ + ..._flatten( + userRoles.map( + (roleId) => + groupRoles.find((role) => String(role._id) === roleId)?.permissions ?? + [] + ) + ), + ...groupInfo.fallbackPermissions, + ]); + + useDebugValue({ + groupRoles, + userRoles, + userPermissions, + fallbackPermissions: groupInfo.fallbackPermissions, + }); + + return userPermissions; +} + +/** + * 获取面板的所有权限 + * 不包含群组本身的权限 + */ +export function useGroupPanelMemberAllPermissions( + groupId: string, + panelId: string +): string[] { + const groupInfo = useGroupInfo(groupId); + const userId = useUserId(); + + if (!groupInfo || !userId) { + return []; + } + + const panelInfo = groupInfo.panels.find((p) => p.id === panelId); + if (!panelInfo) { + return []; + } + + const fallbackPermissions = panelInfo.fallbackPermissions ?? []; + const permissionMap = panelInfo.permissionMap ?? {}; + const specPermissions = permissionMap[userId] ?? []; + + const userRoles = + groupInfo.members.find((m) => m.userId === userId)?.roles ?? []; // 当前用户角色 + const userPanelPermissions = _uniq([ + ..._flatten(userRoles.map((roleId) => permissionMap[roleId] ?? [])), + ...specPermissions, + ...fallbackPermissions, + ]); + + return userPanelPermissions; +} + +/** + * 判断用户是否拥有以下权限 + */ +export function useHasGroupPermission( + groupId: string, + permissions: string[] +): boolean[] { + const userPermissions = useGroupMemberAllPermissions(groupId); + + const result = useMemo( + () => permissions.map((p) => userPermissions.includes(p)), + [userPermissions.join(','), permissions.join(',')] + ); + + useDebugValue({ + groupId, + userPermissions, + checkedPermissions: permissions, + result, + }); + + return result; +} + +/** + * 判断用户是否在某个面板下拥有以下权限 + * 用于面板权限控制 + */ +export function useHasGroupPanelPermission( + groupId: string, + panelId: string, + permissions: string[] +) { + const groupPermissions = useGroupMemberAllPermissions(groupId); + const panelPermissions = useGroupPanelMemberAllPermissions(groupId, panelId); + + const fullPermissions = _uniq([...groupPermissions, ...panelPermissions]); + + const result = useMemo( + () => permissions.map((p) => fullPermissions.includes(p)), + [fullPermissions.join(','), permissions.join(',')] + ); + + useDebugValue({ + groupId, + panelId, + fullPermissions, + checkedPermissions: permissions, + result, + }); + + return result; +} diff --git a/client/shared/redux/hooks/useInbox.ts b/client/shared/redux/hooks/useInbox.ts new file mode 100644 index 00000000000..3ed96db0633 --- /dev/null +++ b/client/shared/redux/hooks/useInbox.ts @@ -0,0 +1,18 @@ +import type { InboxItem } from '../../model/inbox'; +import { useAppSelector } from './useAppSelector'; + +/** + * 返回收件箱列表 + */ +export function useInboxList(): InboxItem[] { + return useAppSelector((state) => state.chat.inbox ?? []); +} + +/** + * 返回收件箱某一项的值 + */ +export function useInboxItem(inboxItemId: string): InboxItem | null { + const list = useInboxList(); + + return list.find((item) => item._id === inboxItemId) ?? null; +} diff --git a/client/shared/redux/hooks/useUnread.ts b/client/shared/redux/hooks/useUnread.ts new file mode 100644 index 00000000000..80729f63daa --- /dev/null +++ b/client/shared/redux/hooks/useUnread.ts @@ -0,0 +1,32 @@ +import { useAppSelector } from './useAppSelector'; +import { useAckInfoChecker } from './useAckInfo'; +import { useEffect } from 'react'; + +/** + * 返回某些会话是否有未读信息 + */ +export function useUnread(converseIds: string[]) { + const ack = useAppSelector((state) => state.chat.ack); + const lastMessageMap = useAppSelector((state) => state.chat.lastMessageMap); + const { ensureAckInfo } = useAckInfoChecker(); + + useEffect(() => { + converseIds.forEach((converseId) => ensureAckInfo(converseId)); + }, [converseIds]); + + const unreadList = converseIds.map((converseId) => { + if ( + ack[converseId] === undefined && + lastMessageMap[converseId] !== undefined + ) { + // 远程没有已读记录且获取到了最后一条消息 + return true; + } + + // 当远端最后一条消息的id > 本地已读状态的最后一条消息id, + // 则返回true(有未读消息) + return lastMessageMap[converseId] > ack[converseId]; + }); + + return unreadList; +} diff --git a/client/shared/redux/hooks/useUserInfo.ts b/client/shared/redux/hooks/useUserInfo.ts new file mode 100644 index 00000000000..77f72db8cbe --- /dev/null +++ b/client/shared/redux/hooks/useUserInfo.ts @@ -0,0 +1,16 @@ +import type { UserLoginInfo } from '../../model/user'; +import { useAppSelector } from './useAppSelector'; + +/** + * 获取当前用户基本信息 + */ +export function useUserInfo(): UserLoginInfo | null { + return useAppSelector((state) => state.user.info); +} + +/** + * 用户基本Id + */ +export function useUserId(): string | undefined { + return useUserInfo()?._id; +} diff --git a/client/shared/redux/setup.ts b/client/shared/redux/setup.ts new file mode 100644 index 00000000000..15b2c2ec301 --- /dev/null +++ b/client/shared/redux/setup.ts @@ -0,0 +1,274 @@ +import type { AppStore } from './store'; +import type { AppSocket } from '../api/socket'; +import { + chatActions, + globalActions, + groupActions, + userActions, +} from './slices'; +import type { FriendRequest } from '../model/friend'; +import { getCachedConverseInfo } from '../cache/cache'; +import type { GroupInfo } from '../model/group'; +import type { ChatMessage, ChatMessageReaction } from '../model/message'; +import { socketEventListeners } from '../manager/socket'; +import { showToasts } from '../manager/ui'; +import { t } from '../i18n'; +import { ChatConverseInfo, ChatConverseType } from '../model/converse'; +import { appendUserDMConverse } from '../model/user'; +import { sharedEvent } from '../event'; +import type { InboxItem } from '../model/inbox'; +import { useGlobalConfigStore } from '../store/globalConfig'; +import type { GlobalConfig } from '../model/config'; + +/** + * 初始化 Redux 上下文 + * 该文件用于处理远程数据与本地 Redux 状态的交互 + */ +export function setupRedux(socket: AppSocket, store: AppStore) { + store.dispatch(globalActions.setNetworkStatus('initial')); + initial(socket, store); + listenNotify(socket, store); + + // 断线重连重新初始化信息 + socket.onReconnect(() => { + console.warn('因为断线重连触发重新同步远程数据'); + initial(socket, store); + /** + * 重置会话列表 + * 如果当前已经打开了一个会话列表则会让该会话自行更新(由useConverseMessage保障) + */ + store.dispatch(chatActions.clearAllConverses()); + store.dispatch(globalActions.incReconnectNum()); + }); + + sharedEvent.on('updateNetworkStatus', (status) => { + store.dispatch(globalActions.setNetworkStatus(status)); + }); +} + +/** + * 初始化数据 + */ +function initial(socket: AppSocket, store: AppStore) { + console.log('初始化Redux上下文...'); + + // 立即请求加入房间 + socket + .request<{ + dmConverseIds: string[]; + groupIds: string[]; + textPanelIds: string[]; + subscribeFeaturePanelIds: string[]; + }>('chat.converse.findAndJoinRoom') + .catch((err) => { + console.error(err); + showToasts( + t('无法加入房间, 您将无法获取到最新的信息, 请刷新页面后重试'), + 'error' + ); + throw new Error('findAndJoinRoom failed'); + }); + + // 获取好友列表 + socket + .request<{ id: string; nickname?: string }[]>('friend.getAllFriends') + .then((data) => { + store.dispatch(userActions.setFriendList(data)); + }); + + // 获取好友邀请列表 + socket.request('friend.request.allRelated').then((data) => { + store.dispatch(userActions.setFriendRequests(data)); + }); + + // 获取所有的当前用户会话列表 + socket.request('user.dmlist.getAllConverse').then((data) => { + (data ?? []).forEach(async (converseId) => { + // TODO: 待优化, 可以在后端一次性返回 + + try { + const converse = await getCachedConverseInfo(converseId); + store.dispatch(chatActions.setConverseInfo(converse)); + } catch (e) { + console.error(e); + } + }); + }); + + /** + * 获取用户群组列表 + */ + socket.request('group.getUserGroups').then((groups) => { + store.dispatch(groupActions.appendGroups(groups)); + }); + + socket.request('chat.inbox.all').then((list) => { + store.dispatch(chatActions.setInboxList(list)); + }); +} + +/** + * 监听远程通知 + */ +function listenNotify(socket: AppSocket, store: AppStore) { + socket.listen<{ userId: string }>('friend.add', ({ userId }) => { + if (typeof userId !== 'string') { + console.error('错误的信息', userId); + return; + } + store.dispatch(userActions.appendFriend({ id: userId })); + }); + + socket.listen('friend.request.add', (request) => { + store.dispatch(userActions.appendFriendRequest(request)); + }); + + socket.listen<{ requestId: string }>( + 'friend.request.remove', + ({ requestId }) => { + store.dispatch(userActions.removeFriendRequest(requestId)); + } + ); + + socket.listen('chat.message.add', (message) => { + // 处理接受到的消息 + const converseId = message.converseId; + const converse = store.getState().chat.converses[converseId]; + + // 添加消息到会话中 + const appendMessage = () => { + store.dispatch( + chatActions.appendConverseMessage({ + converseId, + messages: [message], + }) + ); + }; + + if (converse) { + // 如果该会话已经加载(群组面板) + appendMessage(); + } else if (!message.groupId) { + // 如果会话没有加载, 但是是私信消息 + // 则获取会话信息后添加到会话消息中 + getCachedConverseInfo(converseId).then((converse) => { + if ( + [ChatConverseType.DM, ChatConverseType.Multi].includes(converse.type) + ) { + // 如果是私人会话, 则添加到dmlist + appendUserDMConverse(converse._id); + } + + store.dispatch(chatActions.setConverseInfo(converse)); + + appendMessage(); + }); + } else { + // 是群组未加载的消息面板的消息 + // 设置会话信息 + store.dispatch( + chatActions.setLastMessageMap([ + { + converseId, + lastMessageId: message._id, + }, + ]) + ); + } + + sharedEvent.emit('receiveMessage', message); // 推送到通知中心 + }); + + socket.listen('chat.message.update', (message) => { + store.dispatch( + chatActions.updateMessageInfo({ + message, + }) + ); + }); + + socket.listen<{ + converseId: string; + messageId: string; + }>('chat.message.delete', ({ converseId, messageId }) => { + store.dispatch( + chatActions.deleteMessageById({ + converseId, + messageId, + }) + ); + }); + + socket.listen<{ + converseId: string; + messageId: string; + reaction: ChatMessageReaction; + }>('chat.message.addReaction', ({ converseId, messageId, reaction }) => { + store.dispatch( + chatActions.appendMessageReaction({ + converseId, + messageId, + reaction, + }) + ); + }); + + socket.listen<{ + converseId: string; + messageId: string; + reaction: ChatMessageReaction; + }>('chat.message.removeReaction', ({ converseId, messageId, reaction }) => { + store.dispatch( + chatActions.removeMessageReaction({ + converseId, + messageId, + reaction, + }) + ); + }); + + socket.listen( + 'chat.converse.updateDMConverse', + (converse) => { + store.dispatch(chatActions.setConverseInfo(converse)); + } + ); + + socket.listen('group.add', (groupInfo) => { + store.dispatch(groupActions.appendGroups([groupInfo])); + }); + + socket.listen('group.updateInfo', (groupInfo) => { + store.dispatch(groupActions.updateGroup(groupInfo)); + }); + + socket.listen<{ groupId: string }>('group.remove', ({ groupId }) => { + store.dispatch(groupActions.removeGroup(groupId)); + }); + + socket.listen('chat.inbox.append', (item) => { + store.dispatch(chatActions.appendInboxItem(item)); + }); + + socket.listen('chat.inbox.updated', () => { + // 检测到收件箱列表被更新,需要重新获取 + socket.request('chat.inbox.all').then((list) => { + store.dispatch(chatActions.setInboxList(list)); + }); + }); + + socket.listen( + 'config.updateClientConfig', + (config: Partial) => { + useGlobalConfigStore.setState((state) => ({ + ...state, + ...config, + })); + } + ); + + // 其他的额外的通知 + socketEventListeners.forEach(({ eventName, eventFn }) => { + socket.listen(eventName, eventFn); + }); +} diff --git a/client/shared/redux/slices/chat.ts b/client/shared/redux/slices/chat.ts new file mode 100644 index 00000000000..ca2b3e7a654 --- /dev/null +++ b/client/shared/redux/slices/chat.ts @@ -0,0 +1,414 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import type { ChatConverseInfo } from '../../model/converse'; +import type { + ChatMessage, + ChatMessageReaction, + LocalChatMessage, + SendMessagePayload, +} from '../../model/message'; +import _uniqBy from 'lodash/uniqBy'; +import _orderBy from 'lodash/orderBy'; +import _last from 'lodash/last'; +import { isLocalMessageId, isValidStr } from '../../utils/string-helper'; +import type { InboxItem } from '../../model/inbox'; + +export interface ChatConverseState extends ChatConverseInfo { + messages: LocalChatMessage[]; + hasFetchedHistory: boolean; + /** + * 判定是否还有更多的信息 + */ + hasMoreMessage: boolean; +} + +export interface ChatState { + currentConverseId: string | null; // 当前活跃的会话id + converses: Record; // <会话Id, 会话信息> + ack: Record; // <会话Id, 本地最后一条会话Id> + inbox: InboxItem[]; + + /** + * 会话最新消息mapping + * <会话Id, 远程会话列表最后一条会话Id> + */ + lastMessageMap: Record; +} + +const initialState: ChatState = { + currentConverseId: null, + converses: {}, + ack: {}, + inbox: [], + lastMessageMap: {}, +}; + +const chatSlice = createSlice({ + name: 'chat', + initialState, + reducers: { + updateCurrentConverseId(state, action: PayloadAction) { + state.currentConverseId = action.payload; + }, + + /** + * 设置会话信息 + */ + setConverseInfo(state, action: PayloadAction) { + const converseId = action.payload._id; + + const originInfo = state.converses[converseId] + ? { ...state.converses[converseId] } + : { messages: [], hasFetchedHistory: false, hasMoreMessage: true }; + + state.converses[converseId] = { + ...originInfo, + ...action.payload, + }; + }, + + /** + * 追加消息 + * 会根据id进行一次排序以确保顺序 + */ + appendConverseMessage( + state, + action: PayloadAction<{ + converseId: string; + messages: ChatMessage[]; + }> + ) { + const { converseId, messages } = action.payload; + + if (!state.converses[converseId]) { + // 没有会话信息, 请先设置会话信息 + console.error('没有会话信息, 请先设置会话信息'); + return; + } + + // NOTICE: 按照该规则能确保本地消息一直在最后,因为l大于任何ObjectId + const newMessages = _orderBy( + _uniqBy([...state.converses[converseId].messages, ...messages], '_id'), + '_id', + 'asc' + ); + + state.converses[converseId].messages = newMessages; + + /** + * 如果在当前会话中,则暂时不更新最后收到的消息的本地状态,避免可能出现的瞬间更新最后消息(出现小红点) 但是会立即已读(小红点消失) + * 所以仅对非当前会话的消息进行更新最后消息 + */ + if (state.currentConverseId !== converseId) { + const lastMessageId = _last( + newMessages.filter((m) => !isLocalMessageId(m._id)) + )?._id; + if (isValidStr(lastMessageId)) { + state.lastMessageMap[converseId] = lastMessageId; + } + } + }, + + /** + * 追加本地消息消息 + */ + appendLocalMessage( + state, + action: PayloadAction<{ + author?: string; + localMessageId: string; + payload: SendMessagePayload; + }> + ) { + const { author, localMessageId, payload } = action.payload; + const { converseId, groupId, content, meta } = payload; + + if (!state.converses[converseId]) { + // 没有会话信息, 请先设置会话信息 + console.error('没有会话信息, 请先设置会话信息'); + return; + } + + const message: LocalChatMessage = { + _id: localMessageId, + author, + groupId, + converseId, + content, + meta: meta as Record, + isLocal: true, + }; + + const newMessages = _orderBy( + _uniqBy([...state.converses[converseId].messages, message], '_id'), + '_id', + 'asc' + ); + + state.converses[converseId].messages = newMessages; + }, + + /** + * 初始化历史信息 + */ + initialHistoryMessage( + state, + action: PayloadAction<{ + converseId: string; + historyMessages: ChatMessage[]; + }> + ) { + const { converseId, historyMessages } = action.payload; + if (!state.converses[converseId]) { + // 没有会话信息, 请先设置会话信息 + console.error('没有会话信息, 请先设置会话信息'); + return; + } + + chatSlice.caseReducers.appendConverseMessage( + state, + chatSlice.actions.appendConverseMessage({ + converseId, + messages: [...historyMessages], + }) + ); + + if (historyMessages.length < 50) { + state.converses[converseId].hasMoreMessage = false; + } + + state.converses[converseId].hasFetchedHistory = true; + }, + + /** + * 追加历史信息 + */ + appendHistoryMessage( + state, + action: PayloadAction<{ + converseId: string; + historyMessages: ChatMessage[]; + }> + ) { + const { converseId, historyMessages } = action.payload; + if (!state.converses[converseId]) { + // 没有会话信息, 请先设置会话信息 + console.error('没有会话信息, 请先设置会话信息'); + return; + } + + chatSlice.caseReducers.appendConverseMessage( + state, + chatSlice.actions.appendConverseMessage({ + converseId, + messages: [...historyMessages], + }) + ); + + if (historyMessages.length < 50) { + state.converses[converseId].hasMoreMessage = false; + } + state.converses[converseId].hasFetchedHistory = true; + }, + + removeConverse(state, action: PayloadAction<{ converseId: string }>) { + const { converseId } = action.payload; + + if (!state.converses[converseId]) { + return; + } + + delete state.converses[converseId]; + }, + + /** + * 清理所有会话信息 + */ + clearAllConverses(state) { + state.converses = {}; + }, + + /** + * 设置已读消息 + */ + setConverseAck( + state, + action: PayloadAction<{ + converseId: string; + lastMessageId: string; + }> + ) { + const { converseId, lastMessageId } = action.payload; + state.ack[converseId] = lastMessageId; + }, + + /** + * 更新消息信息 + */ + updateMessageInfo( + state, + action: PayloadAction<{ + messageId?: string; + message: Partial; + }> + ) { + const { message } = action.payload; + const messageId = action.payload.messageId ?? message._id; + const converseId = message.converseId; + if (!converseId) { + console.warn('Not found converse id,', message); + return; + } + + const converse = state.converses[converseId]; + if (!converse) { + console.warn('Not found converse,', converseId); + return; + } + + const index = converse.messages.findIndex((m) => m._id === messageId); + if (index >= 0) { + converse.messages[index] = { + ...converse.messages[index], + ...message, + }; + } + }, + + /** + * 删除消息 + */ + deleteMessageById( + state, + action: PayloadAction<{ + converseId: string; + messageId: string; + }> + ) { + const { converseId, messageId } = action.payload; + const converse = state.converses[converseId]; + if (!converse) { + console.warn('Not found converse,', converseId); + return; + } + + const index = converse.messages.findIndex((m) => m._id === messageId); + if (index >= 0) { + converse.messages.splice(index, 1); + } + }, + + /** + * 设置远程的最后一条会话的id + */ + setLastMessageMap( + state, + action: PayloadAction< + { + converseId: string; + lastMessageId: string; + }[] + > + ) { + const list = action.payload; + + if (Array.isArray(list)) { + list.forEach((item) => { + state.lastMessageMap[item.converseId] = item.lastMessageId; + }); + } + }, + + /** + * 追加消息反应 + */ + appendMessageReaction( + state, + action: PayloadAction<{ + converseId: string; + messageId: string; + reaction: ChatMessageReaction; + }> + ) { + const { converseId, messageId, reaction } = action.payload; + const converse = state.converses[converseId]; + if (!converse) { + console.warn('Not found converse,', converseId); + return; + } + + const message = converse.messages.find((m) => m._id === messageId); + if (!message) { + console.warn('Not found message,', messageId); + return; + } + + if (!Array.isArray(message.reactions)) { + message.reactions = []; + } + + message.reactions.push(reaction); + }, + + /** + * 移除消息反应 + */ + removeMessageReaction( + state, + action: PayloadAction<{ + converseId: string; + messageId: string; + reaction: ChatMessageReaction; + }> + ) { + const { converseId, messageId, reaction } = action.payload; + const converse = state.converses[converseId]; + if (!converse) { + console.warn('Not found converse,', converseId); + return; + } + + const message = converse.messages.find((m) => m._id === messageId); + if (!message) { + console.warn('Not found message,', messageId); + return; + } + + if (!Array.isArray(message.reactions)) { + message.reactions = []; + } + + const reactionIndex = message.reactions.findIndex( + (r) => r.name === reaction.name && r.author === reaction.author + ); + message.reactions.splice(reactionIndex, 1); + }, + /** + * 设置收件箱 + */ + setInboxList(state, action: PayloadAction) { + const list = action.payload; + state.inbox = list; + }, + + /** + * 增加收件箱项目 + */ + appendInboxItem(state, action: PayloadAction) { + state.inbox.push(action.payload); + }, + /** + * 设置收件箱 + */ + setInboxItemAck(state, action: PayloadAction) { + const inboxItemId = action.payload; + const item = state.inbox.find((item) => item._id === inboxItemId); + + if (item) { + item.readed = true; + } + }, + }, +}); + +export const chatActions = chatSlice.actions; +export const chatReducer = chatSlice.reducer; diff --git a/shared/redux/slices/global.ts b/client/shared/redux/slices/global.ts similarity index 100% rename from shared/redux/slices/global.ts rename to client/shared/redux/slices/global.ts diff --git a/client/shared/redux/slices/group.ts b/client/shared/redux/slices/group.ts new file mode 100644 index 00000000000..bb4b610f6db --- /dev/null +++ b/client/shared/redux/slices/group.ts @@ -0,0 +1,103 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import type { GroupInfo } from '../../model/group'; + +export interface GroupState { + groups: Record; +} + +const initialState: GroupState = { + groups: {}, +}; + +const groupSlice = createSlice({ + name: 'group', + initialState, + reducers: { + /** + * 追加或更新群组信息 + */ + appendGroups(state, action: PayloadAction) { + const groups = action.payload; + + for (const group of groups) { + state.groups[group._id] = { + ...state.groups[group._id], + ...group, + }; + } + }, + updateGroup(state, action: PayloadAction) { + const group = action.payload; + const groupId = group._id; + + if (state.groups[groupId]) { + // NOTICE: updateGroup 只会去更新,不会去添加新的 + state.groups[groupId] = { + ...state.groups[groupId], + ...group, + }; + } + }, + removeGroup(state, action: PayloadAction) { + const groupId = action.payload; + delete state.groups[groupId]; + }, + pinGroupPanel( + state, + action: PayloadAction<{ + groupId: string; + panelId: string; + }> + ) { + const { groupId, panelId } = action.payload; + + if (state.groups[groupId]) { + // NOTICE: updateGroup 只会去更新,不会去添加新的 + state.groups[groupId] = { + ...state.groups[groupId], + pinnedPanelId: panelId, + }; + } + }, + unpinGroupPanel( + state, + action: PayloadAction<{ + groupId: string; + }> + ) { + const { groupId } = action.payload; + + if (state.groups[groupId]) { + // NOTICE: updateGroup 只会去更新,不会去添加新的 + state.groups[groupId] = { + ...state.groups[groupId], + pinnedPanelId: undefined, + }; + } + }, + updateGroupConfig( + state, + action: PayloadAction<{ + groupId: string; + configName: string; + configValue: any; + }> + ) { + const { groupId, configName, configValue } = action.payload; + + const groupInfo = state.groups[groupId]; + if (groupInfo) { + state.groups[groupId] = { + ...groupInfo, + config: { + ...(groupInfo.config ?? {}), + [configName]: configValue, + }, + }; + } + }, + }, +}); + +export const groupActions = groupSlice.actions; +export const groupReducer = groupSlice.reducer; diff --git a/shared/redux/slices/index.ts b/client/shared/redux/slices/index.ts similarity index 100% rename from shared/redux/slices/index.ts rename to client/shared/redux/slices/index.ts diff --git a/shared/redux/slices/ui.ts b/client/shared/redux/slices/ui.ts similarity index 100% rename from shared/redux/slices/ui.ts rename to client/shared/redux/slices/ui.ts diff --git a/client/shared/redux/slices/user.ts b/client/shared/redux/slices/user.ts new file mode 100644 index 00000000000..65ba94e5698 --- /dev/null +++ b/client/shared/redux/slices/user.ts @@ -0,0 +1,101 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import _set from 'lodash/set'; +import type { UserLoginInfo } from '../../model/user'; +import type { FriendRequest } from '../../model/friend'; + +export interface FriendInfo { + id: string; + nickname?: string; +} + +export interface UserState { + info: UserLoginInfo | null; + friends: FriendInfo[]; // 好友的id列表 + friendRequests: FriendRequest[]; +} + +const initialState: UserState = { + info: null, + friends: [], + friendRequests: [], +}; + +const userSlice = createSlice({ + name: 'user', + initialState, + reducers: { + setUserInfo(state, action: PayloadAction) { + state.info = action.payload; + }, + setUserInfoField( + state, + action: PayloadAction<{ fieldName: keyof UserLoginInfo; fieldValue: any }> + ) { + const { fieldName, fieldValue } = action.payload; + if (state.info === null) { + return; + } + + _set(state.info, [fieldName], fieldValue); + }, + setUserInfoExtra( + state, + action: PayloadAction<{ fieldName: string; fieldValue: any }> + ) { + const { fieldName, fieldValue } = action.payload; + if (state.info === null) { + return; + } + + _set(state.info, ['extra', fieldName], fieldValue); + }, + setFriendList(state, action: PayloadAction) { + state.friends = action.payload; + }, + setFriendRequests(state, action: PayloadAction) { + state.friendRequests = action.payload; + }, + appendFriend(state, action: PayloadAction) { + if (state.friends.some((id) => id === action.payload)) { + return; + } + + state.friends.push(action.payload); + }, + removeFriend(state, action: PayloadAction) { + const friendId = action.payload; + const index = state.friends.findIndex((item) => item.id === friendId); + if (index >= 0) { + state.friends.splice(index, 1); + } + }, + appendFriendRequest(state, action: PayloadAction) { + if (state.friendRequests.some(({ _id }) => _id === action.payload._id)) { + return; + } + + state.friendRequests.push(action.payload); + }, + removeFriendRequest(state, action: PayloadAction) { + const index = state.friendRequests.findIndex( + ({ _id }) => _id === action.payload + ); + if (index >= 0) { + state.friendRequests.splice(index, 1); + } + }, + setFriendNickname( + state, + action: PayloadAction<{ friendId: string; nickname: string }> + ) { + const { friendId, nickname } = action.payload; + const target = state.friends.find((f) => f.id === friendId); + if (target) { + target.nickname = nickname; + } + }, + }, +}); + +export const userActions = userSlice.actions; +export const userReducer = userSlice.reducer; diff --git a/client/shared/redux/store.ts b/client/shared/redux/store.ts new file mode 100644 index 00000000000..ff31df4e98c --- /dev/null +++ b/client/shared/redux/store.ts @@ -0,0 +1,25 @@ +import { configureStore } from '@reduxjs/toolkit'; +import { appReducer } from './slices'; + +function createStore() { + const store = configureStore({ + reducer: appReducer, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + serializableCheck: false, + }), + devTools: process.env.NODE_ENV !== 'production', + }); + + return store; +} + +const reduxStore = createStore(); + +export function getReduxStore() { + return reduxStore; +} +export type AppStore = ReturnType; +export type AppState = ReturnType; +export type AppDispatch = AppStore['dispatch']; +export { Provider as ReduxProvider } from 'react-redux'; diff --git a/client/shared/store/globalConfig.ts b/client/shared/store/globalConfig.ts new file mode 100644 index 00000000000..e711c176779 --- /dev/null +++ b/client/shared/store/globalConfig.ts @@ -0,0 +1,17 @@ +import { create } from 'zustand'; +import { persist } from 'zustand/middleware'; +import type { GlobalConfig } from '../model/config'; +import { defaultGlobalConfig } from '../utils/consts'; + +type GlobalConfigState = GlobalConfig; + +export const useGlobalConfigStore = create()( + persist( + (set) => ({ + ...defaultGlobalConfig, + }), + { + name: 'globalConfigStore', + } + ) +); diff --git a/shared/types.ts b/client/shared/types.ts similarity index 100% rename from shared/types.ts rename to client/shared/types.ts diff --git a/shared/utils/__tests__/array-helper.spec.ts b/client/shared/utils/__tests__/array-helper.spec.ts similarity index 100% rename from shared/utils/__tests__/array-helper.spec.ts rename to client/shared/utils/__tests__/array-helper.spec.ts diff --git a/shared/utils/__tests__/color-scheme-helper.spec.ts b/client/shared/utils/__tests__/color-scheme-helper.spec.ts similarity index 100% rename from shared/utils/__tests__/color-scheme-helper.spec.ts rename to client/shared/utils/__tests__/color-scheme-helper.spec.ts diff --git a/shared/utils/__tests__/date-helper.spec.ts b/client/shared/utils/__tests__/date-helper.spec.ts similarity index 100% rename from shared/utils/__tests__/date-helper.spec.ts rename to client/shared/utils/__tests__/date-helper.spec.ts diff --git a/shared/utils/__tests__/is-promise.spec.ts b/client/shared/utils/__tests__/is-promise.spec.ts similarity index 100% rename from shared/utils/__tests__/is-promise.spec.ts rename to client/shared/utils/__tests__/is-promise.spec.ts diff --git a/shared/utils/__tests__/json-helper.spec.ts b/client/shared/utils/__tests__/json-helper.spec.ts similarity index 100% rename from shared/utils/__tests__/json-helper.spec.ts rename to client/shared/utils/__tests__/json-helper.spec.ts diff --git a/client/shared/utils/__tests__/string-helper.spec.ts b/client/shared/utils/__tests__/string-helper.spec.ts new file mode 100644 index 00000000000..4b0f79bd4f9 --- /dev/null +++ b/client/shared/utils/__tests__/string-helper.spec.ts @@ -0,0 +1,41 @@ +import { isAvailableString, isObjectId, isUrl } from '../string-helper'; + +describe('string-helper', () => { + describe('isAvailableString', () => { + test.each<[any, boolean]>([ + ['any string', true], + ['', false], + [1, false], + [() => {}, false], + [{}, false], + [[], false], + [undefined, false], + [null, false], + ])('%p => %p', (url, res) => { + expect(isAvailableString(url)).toBe(res); + }); + }); + + describe('isUrl', () => { + test.each<[string, boolean]>([ + ['http://baidu.com/', true], + ['https://baidu.com/', true], + ['ws://baidu.com', true], + ['wss://baidu.com', true], + ['baidu.com', false], + ['baidu', false], + ])('%s => %p', (url, res) => { + expect(isUrl(url)).toBe(res); + }); + }); + + describe('isObjectId', () => { + test.each<[string, boolean]>([ + ['1', false], + ['unknown', false], + ['64b4a473a44c273805b25da5', true], + ])('%s => %p', (input, res) => { + expect(isObjectId(input)).toBe(res); + }); + }); +}); diff --git a/shared/utils/array-helper.ts b/client/shared/utils/array-helper.ts similarity index 77% rename from shared/utils/array-helper.ts rename to client/shared/utils/array-helper.ts index 3c784b2a5f3..0ef9e7f3dc1 100644 --- a/shared/utils/array-helper.ts +++ b/client/shared/utils/array-helper.ts @@ -3,6 +3,10 @@ import _flatten from 'lodash/flatten'; /** * 类似于join,但是返回一个数组 * join会将元素强制转化为字符串 + * + * 改函数可以用于join ReactNode + * + * @example joinArray([1, 2, 3], '5') => [1, '5', 2, '5', 3] */ export function joinArray(arr: T[], separator: K): (T | K)[] { return _flatten( diff --git a/shared/utils/color-scheme-helper.ts b/client/shared/utils/color-scheme-helper.ts similarity index 100% rename from shared/utils/color-scheme-helper.ts rename to client/shared/utils/color-scheme-helper.ts diff --git a/client/shared/utils/consts.ts b/client/shared/utils/consts.ts new file mode 100644 index 00000000000..11b44fa6f71 --- /dev/null +++ b/client/shared/utils/consts.ts @@ -0,0 +1,34 @@ +import type { GlobalConfig } from '../model/config'; + +/** + * 昵称合法性匹配 + * 最大八个汉字内容或者16字英文 + * 且中间不能有空格 + */ +export const NAME_REGEXP = + /^([0-9a-zA-Z]{1,2}|[\u4e00-\u9eff]|[\u3040-\u309Fー]|[\u30A0-\u30FF]){1,8}$/; + +/** + * 系统语言的常量 + */ +export const LANGUAGE_KEY = 'i18n:language'; + +/** + * 系统用户id + */ +export const SYSTEM_USERID = '000000000000000000000000'; + +export const defaultGlobalConfig: GlobalConfig = { + tianji: {}, + uploadFileLimit: 1 * 1024 * 1024, + emailVerification: false, + serverName: 'Tailchat', + disableMsgpack: false, + disableUserRegister: false, + disableGuestLogin: false, + disableCreateGroup: false, + disablePluginStore: false, + disableAddFriend: false, + disableTelemetry: false, + announcement: false, +}; diff --git a/client/shared/utils/date-helper.ts b/client/shared/utils/date-helper.ts new file mode 100644 index 00000000000..eace9cca2f2 --- /dev/null +++ b/client/shared/utils/date-helper.ts @@ -0,0 +1,104 @@ +import dayjs from 'dayjs'; +import relativeTime from 'dayjs/plugin/relativeTime'; // 导入插件 +import duration from 'dayjs/plugin/duration'; // 导入插件 +import 'dayjs/locale/zh-cn'; // 导入本地化语言 +import { onLanguageChanged } from '../i18n'; + +/** + * Reference: https://day.js.org/ + */ + +dayjs.extend(relativeTime); +dayjs.extend(duration); +dayjs.locale('zh-cn'); // 默认使用中文 +onLanguageChanged((lang) => { + if (lang === 'en-US') { + dayjs.locale('en'); + return; + } + + dayjs.locale('zh-cn'); +}); + +/** + * 是否为当天 + */ +export function isToday(date: dayjs.ConfigType): boolean { + return dayjs(date).isSame(dayjs(), 'd'); +} + +/** + * 获取消息显示时间 + */ +export function getMessageTimeDiff(input: Date): string { + const date = dayjs(input); + + if (isToday(date)) { + return date.fromNow(); + } else { + return date.format('YYYY-MM-DD HH:mm:ss'); + } +} + +/** + * 小时消息时间 + * 如果是当天则显示短时间,如果不是当天则显示完整时间 + */ +export function showMessageTime(input: Date): string { + const date = dayjs(input); + + if (isToday(date)) { + return formatShortTime(date); + } else { + return formatFullTime(date); + } +} + +/** + * 是否应该显示消息时间 + * 间隔时间大于十五分钟则显示 + */ +export function shouldShowMessageTime(date1: Date, date2: Date): boolean { + return Math.abs(date1.valueOf() - date2.valueOf()) > 15 * 60 * 1000; +} + +/** + * 格式化为 小时:分钟 + */ +export function formatShortTime(date: dayjs.ConfigType): string { + return dayjs(date).format('HH:mm'); +} + +/** + * 格式化为完整时间 YYYY-MM-DD HH:mm:ss + */ +export function formatFullTime(date: dayjs.ConfigType): string { + return dayjs(date).format('YYYY-MM-DD HH:mm:ss'); +} + +/** + * 返回当前实例到现在的相对时间。 + * @example + * dayjs('1999-01-01').toNow() // 22 年后 + */ +export function datetimeToNow(input: dayjs.ConfigType): string { + const date = dayjs(input); + return date.toNow(); +} + +/** + * 返回当前实例到现在的相对时间。 + * @example + * dayjs('1999-01-01').toNow() // 22 年前 + */ +export function datetimeFromNow(input: dayjs.ConfigType): string { + const date = dayjs(input); + return date.fromNow(); +} + +/** + * 将毫秒转换为易读的人类语言 + */ +export function humanizeMsDuration(ms: number): string { + return dayjs.duration(ms, 'ms').humanize(); +} diff --git a/shared/utils/environment.ts b/client/shared/utils/environment.ts similarity index 78% rename from shared/utils/environment.ts rename to client/shared/utils/environment.ts index 7ec2b17b9dc..996c61c11d1 100644 --- a/shared/utils/environment.ts +++ b/client/shared/utils/environment.ts @@ -4,4 +4,6 @@ export const isNavigator = typeof navigator !== 'undefined'; export const isDevelopment = process.env.NODE_ENV === 'development'; +export const isProduction = process.env.NODE_ENV === 'production'; + export const version = process.env.VERSION || '0.0.0'; diff --git a/shared/utils/is-promise.ts b/client/shared/utils/is-promise.ts similarity index 100% rename from shared/utils/is-promise.ts rename to client/shared/utils/is-promise.ts diff --git a/shared/utils/json-helper.ts b/client/shared/utils/json-helper.ts similarity index 100% rename from shared/utils/json-helper.ts rename to client/shared/utils/json-helper.ts diff --git a/shared/utils/message-helper.ts b/client/shared/utils/message-helper.ts similarity index 100% rename from shared/utils/message-helper.ts rename to client/shared/utils/message-helper.ts diff --git a/client/shared/utils/panel-helper.ts b/client/shared/utils/panel-helper.ts new file mode 100644 index 00000000000..f8787232fed --- /dev/null +++ b/client/shared/utils/panel-helper.ts @@ -0,0 +1,16 @@ +import { GroupPanel, GroupPanelType } from '../model/group'; + +/** + * 判断面板是否为会话面板 + * + * 会话面板的属性是带有已读未读属性的(如默认的文本面板) + */ +export function isConversePanel(panel: GroupPanel) { + // 目前只有文本面板 + + if (panel.type === GroupPanelType.TEXT) { + return true; + } + + return false; +} diff --git a/client/shared/utils/request.ts b/client/shared/utils/request.ts new file mode 100644 index 00000000000..8c72d801ebe --- /dev/null +++ b/client/shared/utils/request.ts @@ -0,0 +1,89 @@ +import _chunk from 'lodash/chunk'; +import _flatten from 'lodash/flatten'; + +interface QueueItem { + params: T; + resolve: (r: R) => void; + reject: (reason: unknown) => void; +} + +/** + * 创建一个自动合并请求的函数 + * 在一定窗口期内的所有请求都会被合并提交合并发送 + * @param fn 合并后的请求函数 + * @param windowMs 窗口期 + */ +export function createAutoMergedRequest( + fn: (mergedParams: T[]) => Promise, + windowMs = 200 +): (params: T) => Promise { + let queue: QueueItem[] = []; + let timer: number | null = null; + + async function submitQueue() { + timer = null; // 清空计时器以接受后续请求 + const _queue = [...queue]; + queue = []; // 清空队列 + + try { + const list = await fn(_queue.map((q) => q.params)); + _queue.forEach((q1, i) => { + q1.resolve(list[i]); + }); + } catch (err) { + _queue.forEach((q2) => { + q2.reject(err); + }); + } + } + + return (params: T): Promise => { + if (!timer) { + // 如果没有开始窗口期,则创建 + timer = window.setTimeout(() => { + submitQueue(); + }, windowMs); + } + + return new Promise((resolve, reject) => { + queue.push({ + params, + resolve, + reject, + }); + }); + }; +} + +/** + * 创建一个自动拆分请求参数的函数 + */ +export function createAutoSplitRequest( + fn: (keys: Key[]) => Promise, + type: 'serial' | 'parallel', + limit = 100 +): (arr: Key[]) => Promise { + return async (arr: Key[]): Promise => { + const groups = _chunk(arr, limit); + + if (type === 'serial') { + const list: Item[] = []; + for (const group of groups) { + const res = await fn(group); + if (Array.isArray(res)) { + list.push(...res); + } else { + console.warn('[createAutoSplitRequest] fn should be return array'); + } + } + + return list; + } else if (type === 'parallel') { + const res = await Promise.all(groups.map((group) => fn(group))); + + return _flatten(res); + } + + return []; + }; +} diff --git a/client/shared/utils/role-helper.ts b/client/shared/utils/role-helper.ts new file mode 100644 index 00000000000..15e77331de3 --- /dev/null +++ b/client/shared/utils/role-helper.ts @@ -0,0 +1,176 @@ +import { GroupPanelType } from 'tailchat-types'; +import { model, t } from '..'; + +/** + * 所有人权限 + * 群组最低权限标识 + */ +export const ALL_PERMISSION = Symbol('AllPermission'); + +export interface PermissionItemType { + /** + * 权限唯一key, 用于写入数据库 + * 如果为插件则权限点应当符合命名规范, 如: plugin.com.msgbyte.github.manage + */ + key: string; + /** + * 权限点显示名称 + */ + title: string; + /** + * 权限描述 + */ + desc: string; + /** + * 是否默认开启 + */ + default: boolean; + /** + * 是否依赖其他权限点 + */ + required?: string[]; + /** + * 面板权限 + * 如果是内置类型(数字) 则仅会在规定的类型中展示 + * 如果是字符串数组则仅会在特定的插件面板中显示 + * 如果不传则视为不适用于面板 + * + * @default undefined + */ + panel?: boolean | (string | GroupPanelType)[]; +} + +export const PERMISSION = { + /** + * 非插件的权限点都叫core + */ + core: { + viewPanel: 'core.viewPanel', + message: 'core.message', + invite: 'core.invite', + unlimitedInvite: 'core.unlimitedInvite', + editInvite: 'core.editInvite', + groupDetail: 'core.groupDetail', + groupBaseInfo: 'core.groupBaseInfo', + groupConfig: 'core.groupConfig', + manageUser: 'core.manageUser', + managePanel: 'core.managePanel', + manageInvite: 'core.manageInvite', + manageRoles: 'core.manageRoles', + deleteMessage: 'core.deleteMessage', + }, +}; + +export const getPermissionList = (): PermissionItemType[] => [ + { + key: PERMISSION.core.viewPanel, + title: t('查看面板'), + desc: t('允许成员查看面板'), + default: true, + panel: true, + }, + { + key: PERMISSION.core.message, + title: t('发送消息'), + desc: t('允许成员在文字频道发送消息'), + default: true, + panel: [GroupPanelType.TEXT], + }, + { + key: PERMISSION.core.invite, + title: t('邀请链接'), + desc: t('允许成员创建邀请链接'), + default: false, + }, + { + key: PERMISSION.core.unlimitedInvite, + title: t('不限时邀请链接'), + desc: t('允许成员创建不限时邀请链接'), + default: false, + required: [PERMISSION.core.invite], + }, + { + key: PERMISSION.core.editInvite, + title: t('编辑邀请链接'), + desc: t('允许成员编辑邀请链接'), + default: false, + required: [PERMISSION.core.unlimitedInvite], + }, + { + key: PERMISSION.core.groupDetail, + title: t('查看群组详情'), + desc: t('允许成员查看群组详情'), + default: false, + }, + { + key: PERMISSION.core.groupBaseInfo, + title: t('修改群组基本信息'), + desc: t('允许成员修改群组基本信息'), + default: false, + required: [PERMISSION.core.groupDetail], + }, + { + key: PERMISSION.core.groupConfig, + title: t('修改群组配置'), + desc: t('允许成员修改群组配置'), + default: false, + required: [PERMISSION.core.groupDetail], + }, + { + key: PERMISSION.core.manageUser, + title: t('允许管理用户'), + desc: t('允许成员管理用户,如禁言、移除用户等操作'), + default: false, + required: [PERMISSION.core.groupDetail], + }, + { + key: PERMISSION.core.managePanel, + title: t('允许管理频道'), + desc: t('允许成员查看管理频道'), + default: false, + required: [PERMISSION.core.groupDetail], + }, + { + key: PERMISSION.core.manageInvite, + title: t('允许管理邀请链接'), + desc: t('允许成员管理邀请链接'), + default: false, + required: [PERMISSION.core.groupDetail], + }, + { + key: PERMISSION.core.manageRoles, + title: t('允许管理身份组'), + desc: t('允许成员管理身份组'), + default: false, + required: [PERMISSION.core.groupDetail], + }, + { + key: PERMISSION.core.deleteMessage, + title: t('删除消息'), + desc: t('允许删除用户信息'), + default: false, + required: [PERMISSION.core.groupDetail], + }, +]; + +/** + * 获取默认权限列表 + * + * @default ['core.message'] + */ +export function getDefaultPermissionList(): string[] { + return getPermissionList() + .filter((p) => p.default === true) + .map((p) => p.key); +} + +/** + * 初始化默认所有人身份组权限 + */ +export async function applyDefaultFallbackGroupPermission(groupId: string) { + await model.group.modifyGroupField( + groupId, + 'fallbackPermissions', + getDefaultPermissionList() + ); +} diff --git a/client/shared/utils/string-helper.ts b/client/shared/utils/string-helper.ts new file mode 100644 index 00000000000..960fae8d10c --- /dev/null +++ b/client/shared/utils/string-helper.ts @@ -0,0 +1,72 @@ +import _isString from 'lodash/isString'; +import urlRegex from 'url-regex'; + +/** + * 判断一个字符串是否可用() + * @param str 要判断的字符串 + */ +export function isAvailableString(str: unknown): boolean { + return typeof str === 'string' && str.length > 0; +} + +/** + * 判断一个字符串是否是url + * @param str 要判断的字符串 + */ +export function isUrl(str: string) { + return urlRegex({ exact: true }).test(str); +} + +/** + * 判断字符串是否是一个blobUrl + * @param str url字符串 + */ +export const isBlobUrl = (str: string) => { + return _isString(str) && str.startsWith('blob:'); +}; + +/** + * 获取一段字符串中的所有url + * @param str 字符串 + */ +export const getUrls = (str: string): string[] => { + return str.match(urlRegex()) ?? []; +}; + +/** + * 用于判定环境变量的值 + */ +export function is(it: string) { + return !!it && it !== '0' && it !== 'false'; +} + +/** + * 是否一个可用的字符串 + * 定义为有长度的字符串 + */ +export function isValidStr(str: unknown): str is string { + return typeof str == 'string' && str !== ''; +} + +export function isLocalMessageId(str: unknown): boolean { + if (typeof str !== 'string') { + return false; + } + + return str.startsWith('localMessage_'); +} + +/** + * 是一个MongoDB的objectId + */ +export function isObjectId(str: any): boolean { + if (typeof str === 'string' && str.length === 12) { + return true; + } + + if (typeof str === 'string' && /^[0-9A-Fa-f]{24}$/.test(str)) { + return true; + } + + return false; +} diff --git a/shared/utils/upload-helper.ts b/client/shared/utils/upload-helper.ts similarity index 87% rename from shared/utils/upload-helper.ts rename to client/shared/utils/upload-helper.ts index 2e534d8c94a..a9e7119a8b5 100644 --- a/shared/utils/upload-helper.ts +++ b/client/shared/utils/upload-helper.ts @@ -5,7 +5,10 @@ import { getGlobalConfig } from '../model/config'; import { showErrorToasts } from '../manager/ui'; import filesize from 'filesize'; +export type UploadFileUsage = 'chat' | 'group' | 'user' | 'unknown'; + interface UploadFileOptions { + usage?: UploadFileUsage; onProgress?: (percent: number, progressEvent: unknown) => void; } export interface UploadFileResult { @@ -23,6 +26,7 @@ export async function uploadFile( ): Promise { const form = new FormData(); form.append('file', file); + form.append('usage', options.usage ?? 'unknown'); const uploadFileLimit = getGlobalConfig().uploadFileLimit; if (file.size > uploadFileLimit) { @@ -51,7 +55,7 @@ export async function uploadFile( return data; } catch (e) { - showToasts(`${t('上传失败')}: ${t('可能是图片体积过大')}`, 'error'); + showToasts(`${t('上传失败')}: ${t('可能是文件体积过大')}`, 'error'); console.error(`${t('上传失败')}: ${_get(e, 'message')}`); throw e; } diff --git a/client/shared/utils/url-helper.ts b/client/shared/utils/url-helper.ts new file mode 100644 index 00000000000..f1cba5f7e5d --- /dev/null +++ b/client/shared/utils/url-helper.ts @@ -0,0 +1,12 @@ +import { getServiceUrl } from '../manager/service'; + +/** + * 解析url, 将中间的常量替换成变量 + * @param originUrl 原始Url + * @returns 解析后的url + */ +export function parseUrlStr(originUrl: string): string { + return String(originUrl) + .replace('{BACKEND}', getServiceUrl()) + .replace('%7BBACKEND%7D', getServiceUrl()); +} diff --git a/shared/utils/utils.ts b/client/shared/utils/utils.ts similarity index 100% rename from shared/utils/utils.ts rename to client/shared/utils/utils.ts diff --git a/test/client.ts b/client/test/client.ts similarity index 100% rename from test/client.ts rename to client/test/client.ts diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 00000000000..efcd1a3d905 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "target": "esnext", + "lib": ["DOM"], + "jsx": "react", + "module": "ESNext", + "moduleResolution": "node", + "importsNotUsedAsValues": "error", + "resolveJsonModule": true, + "typeRoots": ["./node_modules/@types", "../node_modules/@types", "./types"] + } +} diff --git a/client/web/.ministarrc.js b/client/web/.ministarrc.js new file mode 100644 index 00000000000..c9f9e7075fc --- /dev/null +++ b/client/web/.ministarrc.js @@ -0,0 +1,65 @@ +const copy = require('rollup-plugin-copy'); +const replace = require('rollup-plugin-replace'); +const sourceRef = require('rollup-plugin-source-ref').default; +const path = require('path'); +const normalize = require('normalize-path'); + +const isDev = process.env.NODE_ENV === 'development'; + +module.exports = { + externalDeps: [ + 'react', + 'react-router', + 'axios', + 'styled-components', + 'zustand', + 'zustand/middleware/immer', + ], + rollupPlugins: ({ pluginName }) => [ + copy({ + targets: [ + { + src: path.resolve( + __dirname, + `./plugins/${pluginName}`, + './assets/**/*' + ), + dest: path.resolve(__dirname, `./dist/plugins/${pluginName}/assets/`), + }, + { + src: path.resolve( + __dirname, + `./plugins/${pluginName}`, + './docs/**/*' + ), + dest: path.resolve(__dirname, `./dist/plugins/${pluginName}/docs/`), + }, + { + src: path.resolve( + __dirname, + `./plugins/${pluginName}`, + './README.md' + ), + dest: path.resolve(__dirname, `./dist/plugins/${pluginName}/`), + }, + ].map((item) => ({ + // For windows + src: normalize(item.src), + dest: normalize(item.dest, false), + })), + }), + replace({ + 'process.env.NODE_ENV': JSON.stringify('production'), + }), + ], + buildRollupPlugins(plugins) { + if (isDev) { + return [ + sourceRef(), // make sure to change to source + ...plugins, + ]; + } + + return plugins; + }, +}; diff --git a/web/.npmrc b/client/web/.npmrc similarity index 100% rename from web/.npmrc rename to client/web/.npmrc diff --git a/client/web/assets/_redirects b/client/web/assets/_redirects new file mode 100644 index 00000000000..7797f7c6a73 --- /dev/null +++ b/client/web/assets/_redirects @@ -0,0 +1 @@ +/* /index.html 200 diff --git a/client/web/assets/audio/telephone.mp3 b/client/web/assets/audio/telephone.mp3 new file mode 100644 index 00000000000..61deeaf40b3 Binary files /dev/null and b/client/web/assets/audio/telephone.mp3 differ diff --git a/client/web/assets/images/avatar/github-color.webp b/client/web/assets/images/avatar/github-color.webp new file mode 100644 index 00000000000..c1a81c6b491 Binary files /dev/null and b/client/web/assets/images/avatar/github-color.webp differ diff --git a/client/web/assets/images/avatar/github-dark.svg b/client/web/assets/images/avatar/github-dark.svg new file mode 100644 index 00000000000..46a93e9e6f0 --- /dev/null +++ b/client/web/assets/images/avatar/github-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/web/assets/images/avatar/github.svg b/client/web/assets/images/avatar/github.svg new file mode 100644 index 00000000000..a7ca7f5491d --- /dev/null +++ b/client/web/assets/images/avatar/github.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/web/assets/images/avatar/robot.webp b/client/web/assets/images/avatar/robot.webp new file mode 100644 index 00000000000..7d5c4873d7a Binary files /dev/null and b/client/web/assets/images/avatar/robot.webp differ diff --git a/client/web/assets/images/bg.webp b/client/web/assets/images/bg.webp new file mode 100644 index 00000000000..ca1fbe578d9 Binary files /dev/null and b/client/web/assets/images/bg.webp differ diff --git a/web/assets/images/fallback/403.svg b/client/web/assets/images/fallback/403.svg similarity index 100% rename from web/assets/images/fallback/403.svg rename to client/web/assets/images/fallback/403.svg diff --git a/web/assets/images/fallback/404.svg b/client/web/assets/images/fallback/404.svg similarity index 100% rename from web/assets/images/fallback/404.svg rename to client/web/assets/images/fallback/404.svg diff --git a/web/assets/images/fallback/failed.svg b/client/web/assets/images/fallback/failed.svg similarity index 100% rename from web/assets/images/fallback/failed.svg rename to client/web/assets/images/fallback/failed.svg diff --git a/web/assets/images/fallback/in-develop.svg b/client/web/assets/images/fallback/in-develop.svg similarity index 100% rename from web/assets/images/fallback/in-develop.svg rename to client/web/assets/images/fallback/in-develop.svg diff --git a/web/assets/images/fallback/no-content.svg b/client/web/assets/images/fallback/no-content.svg similarity index 100% rename from web/assets/images/fallback/no-content.svg rename to client/web/assets/images/fallback/no-content.svg diff --git a/web/assets/images/fallback/no-image.svg b/client/web/assets/images/fallback/no-image.svg similarity index 100% rename from web/assets/images/fallback/no-image.svg rename to client/web/assets/images/fallback/no-image.svg diff --git a/web/assets/images/fallback/no-message.svg b/client/web/assets/images/fallback/no-message.svg similarity index 100% rename from web/assets/images/fallback/no-message.svg rename to client/web/assets/images/fallback/no-message.svg diff --git a/web/assets/images/fallback/no-network.svg b/client/web/assets/images/fallback/no-network.svg similarity index 100% rename from web/assets/images/fallback/no-network.svg rename to client/web/assets/images/fallback/no-network.svg diff --git a/web/assets/images/fallback/no-permission.svg b/client/web/assets/images/fallback/no-permission.svg similarity index 100% rename from web/assets/images/fallback/no-permission.svg rename to client/web/assets/images/fallback/no-permission.svg diff --git a/web/assets/images/fallback/no-searchresult.svg b/client/web/assets/images/fallback/no-searchresult.svg similarity index 100% rename from web/assets/images/fallback/no-searchresult.svg rename to client/web/assets/images/fallback/no-searchresult.svg diff --git a/client/web/assets/images/favicon.ico b/client/web/assets/images/favicon.ico new file mode 100644 index 00000000000..94ac22cf74e Binary files /dev/null and b/client/web/assets/images/favicon.ico differ diff --git a/web/assets/images/login-pattern.svg b/client/web/assets/images/login-pattern.svg similarity index 100% rename from web/assets/images/login-pattern.svg rename to client/web/assets/images/login-pattern.svg diff --git a/web/assets/images/logo.svg b/client/web/assets/images/logo.svg similarity index 100% rename from web/assets/images/logo.svg rename to client/web/assets/images/logo.svg diff --git a/web/assets/images/logo/logo@192.png b/client/web/assets/images/logo/logo@192.png similarity index 100% rename from web/assets/images/logo/logo@192.png rename to client/web/assets/images/logo/logo@192.png diff --git a/web/assets/images/logo/logo@32.png b/client/web/assets/images/logo/logo@32.png similarity index 100% rename from web/assets/images/logo/logo@32.png rename to client/web/assets/images/logo/logo@32.png diff --git a/web/assets/images/logo/logo@512.png b/client/web/assets/images/logo/logo@512.png similarity index 100% rename from web/assets/images/logo/logo@512.png rename to client/web/assets/images/logo/logo@512.png diff --git a/web/assets/images/problem.svg b/client/web/assets/images/problem.svg similarity index 100% rename from web/assets/images/problem.svg rename to client/web/assets/images/problem.svg diff --git a/web/assets/images/ripple.svg b/client/web/assets/images/ripple.svg similarity index 100% rename from web/assets/images/ripple.svg rename to client/web/assets/images/ripple.svg diff --git a/web/assets/pwa.webmanifest b/client/web/assets/pwa.webmanifest similarity index 100% rename from web/assets/pwa.webmanifest rename to client/web/assets/pwa.webmanifest diff --git a/client/web/assets/robots.txt b/client/web/assets/robots.txt new file mode 100644 index 00000000000..a6377b86262 --- /dev/null +++ b/client/web/assets/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: /invite/ diff --git a/web/assets/template.html b/client/web/assets/template.html similarity index 76% rename from web/assets/template.html rename to client/web/assets/template.html index b59578d8557..a0635572a54 100644 --- a/web/assets/template.html +++ b/client/web/assets/template.html @@ -3,16 +3,17 @@ - - + + + + - <%= htmlWebpackPlugin.options.title %> `; + +// umami +appendScript( + `` +); +// tianji +appendScript( + `` +); diff --git a/client/web/build/utils.ts b/client/web/build/utils.ts new file mode 100644 index 00000000000..91277abc366 --- /dev/null +++ b/client/web/build/utils.ts @@ -0,0 +1,37 @@ +import type { RuntimeCaching } from 'workbox-build'; +/** + * workbox 匹配plugin的缓存 + */ +export const workboxPluginEntryPattern = + /plugins\/com\.msgbyte(.*?)\/index\.js/; + +export const workboxPluginDetailPattern = + /plugins\/com\.msgbyte\.(.*?)\/(\S+?)\-(\S*?)\.js/; + +export function buildRuntimePluginJSResourceCacheGroup( + pattern: RegExp, + name: string, + expiration: number +): RuntimeCaching { + return { + urlPattern: pattern, + // urlPattern: ({ url }) => { + // // 使用自定义匹配函数而不是直接传是为了方便解决跨域资源的service worker存储 + // // 否则需要填入完整的前缀以解决跨域匹配(workbox对此进行了特殊的处理) + // return pattern.test(url.pathname); + // }, + handler: 'StaleWhileRevalidate' as const, + options: { + cacheName: name, + expiration: { + maxAgeSeconds: expiration, + }, + cacheableResponse: { + // 只缓存js, 防止404后台直接fallback到html + headers: { + 'content-type': 'application/javascript; charset=utf-8', + }, + }, + }, + }; +} diff --git a/client/web/build/webpack.config.ts b/client/web/build/webpack.config.ts new file mode 100644 index 00000000000..82c29ebad16 --- /dev/null +++ b/client/web/build/webpack.config.ts @@ -0,0 +1,277 @@ +/** + * Reference: https://webpack.js.org/configuration/configuration-languages/ + */ + +import type { Configuration } from 'webpack'; +import { DefinePlugin } from 'webpack'; +import type WebpackDevServer from 'webpack-dev-server'; +import path from 'path'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import CopyPlugin from 'copy-webpack-plugin'; +import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import WebpackBar from 'webpackbar'; +import fs from 'fs'; +import dayjs from 'dayjs'; +import { BundleStatsWebpackPlugin } from 'bundle-stats-webpack-plugin'; +import { WebpackStatsViewerPlugin } from 'webpack-stats-viewer-plugin'; +import { buildWorkboxPlugin } from './workbox'; +import { RetryChunkLoadPlugin } from 'webpack-retry-chunk-load-plugin'; +import GenerateJsonPlugin from 'generate-json-webpack-plugin'; +import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; +import TerserPlugin from 'terser-webpack-plugin'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +require('dotenv').config(); + +delete process.env.TS_NODE_PROJECT; // https://github.com/dividab/tsconfig-paths-webpack-plugin/issues/32 +require('../../build/script/buildPublicTranslation.js'); // 编译前先执行一下构建翻译的脚本 + +const ROOT_PATH = path.resolve(__dirname, '../'); +const DIST_PATH = path.resolve(ROOT_PATH, './dist'); +const ASSET_PATH = process.env.ASSET_PATH || '/'; +const PORT = Number(process.env.PORT || 11011); +const ANALYSIS = process.env.ANALYSIS === 'true'; + +declare module 'webpack' { + interface Configuration { + devServer?: WebpackDevServer.Configuration; + } +} + +const NODE_ENV = process.env.NODE_ENV ?? 'production'; +const PREF_REPORT = !!process.env.PREF_REPORT; +const VERSION = + process.env.VERSION || `nightly-${dayjs().format('YYYYMMDDHHmm')}`; +const SERVICE_URL = process.env.SERVICE_URL; // 如果不传则为当前服务,用于前后端分离的场景 + +const isDev = NODE_ENV === 'development'; +const mode = isDev ? 'development' : 'production'; + +const plugins: Configuration['plugins'] = [ + new DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(NODE_ENV), + 'process.env.SERVICE_URL': JSON.stringify(SERVICE_URL), + 'process.env.VERSION': JSON.stringify(VERSION), + }), + new HtmlWebpackPlugin({ + inject: 'body', + hash: false, + favicon: path.resolve(ROOT_PATH, './assets/images/favicon.ico'), + template: path.resolve(ROOT_PATH, './assets/template.html'), + preloadImage: `data:image/svg+xml;base64,${Buffer.from( + fs.readFileSync(path.resolve(ROOT_PATH, './assets/images/ripple.svg'), { + encoding: 'utf-8', + }) + ).toString('base64')}`, + }), + new CopyPlugin({ + patterns: [ + { + from: path.resolve(ROOT_PATH, '../locales'), + to: 'locales', + }, + { + from: path.resolve(ROOT_PATH, './registry.json'), + to: 'registry.json', + }, + { + from: path.resolve(ROOT_PATH, './assets/pwa.webmanifest'), + to: 'pwa.webmanifest', + }, + { + from: path.resolve(ROOT_PATH, './assets/robots.txt'), + to: 'robots.txt', + }, + { + from: path.resolve(ROOT_PATH, './assets/_redirects'), + to: './', // for netlify + }, + { + from: path.resolve(ROOT_PATH, './assets/images/logo/'), + to: 'images/logo/', + }, + { + from: path.resolve(ROOT_PATH, './assets/images/avatar/'), + to: 'images/avatar/', + }, + { + from: path.resolve(ROOT_PATH, './assets/audio/'), + to: 'audio/', + }, + { + from: path.resolve(ROOT_PATH, '../../vercel.json'), + to: 'vercel.json', + }, + ], + }) as any, + new GenerateJsonPlugin('tailchat.manifest', { + version: VERSION, + env: NODE_ENV, + serviceUrl: SERVICE_URL, + }), + new MiniCssExtractPlugin({ filename: 'styles-[contenthash].css' }), + new RetryChunkLoadPlugin({ + maxRetries: 2, + }), + buildWorkboxPlugin(isDev), + new WebpackBar({ + name: `Tailchat`, + }), +]; + +if (ANALYSIS) { + plugins.push( + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: true, + }) as any, + new BundleStatsWebpackPlugin(), + new WebpackStatsViewerPlugin({ + open: true, + }) + ); +} + +if (PREF_REPORT) { + const PerfseePlugin = require('@perfsee/webpack').PerfseePlugin; + plugins.push( + new PerfseePlugin({ + project: 'tailchat', + }) + ); +} + +const splitChunks: Required['optimization']['splitChunks'] = { + chunks: 'async', + minSize: 20000, + minRemainingSize: 0, + minChunks: 1, + maxAsyncRequests: 30, + maxInitialRequests: 30, + enforceSizeThreshold: 50000, + cacheGroups: { + vendors: { + chunks: 'initial', + name: 'vendors', + test: /[\\/]node_modules[\\/]/, + priority: -10, + reuseExistingChunk: true, + maxSize: 2 * 1000 * 1000, + }, + default: { + minChunks: 2, + priority: -20, + reuseExistingChunk: true, + }, + }, +}; + +const config: Configuration = { + mode, + entry: { + app: path.resolve(ROOT_PATH, './src/index.tsx'), + }, + output: { + path: DIST_PATH, + filename: '[name].[contenthash].js', + publicPath: ASSET_PATH, + }, + devServer: { + open: false, + port: PORT, + historyApiFallback: true, + static: { + directory: path.resolve(ROOT_PATH, './dist'), + }, + client: { + overlay: false, + }, + }, + module: { + rules: [ + { + test: /\.tsx?$/, + exclude: /node_modules/, + use: [ + { + loader: 'esbuild-loader', + options: { + loader: 'tsx', + target: 'es2015', + tsconfigRaw: require('../tsconfig.json'), + }, + }, + { + loader: 'source-ref-loader', + options: { + available: isDev, + }, + }, + ], + }, + { + test: /\.(less|css)$/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + }, + { + loader: 'css-loader', + options: { + // https://github.com/webpack-contrib/css-loader#auto + modules: { + auto: /\.module\.\w+$/i, + localIdentName: '[path][name]__[local]--[hash:base64:5]', + }, + sourceMap: process.env.NODE_ENV !== 'production', + }, + }, + { + loader: 'postcss-loader', + options: { + postcssOptions: { + config: path.resolve(ROOT_PATH, 'postcss.config.js'), + }, + }, + }, + { + loader: 'less-loader', + }, + ], + }, + { + test: /\.(png|jpg|gif|woff|woff2|svg|eot|ttf|webp|webm)$/, + loader: 'url-loader', + options: { + limit: 8192, + name: 'assets/[name].[hash:7].[ext]', + }, + }, + ], + }, + optimization: { + splitChunks, + minimizer: [ + new CssMinimizerPlugin(), + new TerserPlugin({ + minify: TerserPlugin.esbuildMinify, + }), + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js', '.css'], + plugins: [ + new TsconfigPathsPlugin({ + configFile: path.resolve(ROOT_PATH, './tsconfig.json'), + }), + ], + fallback: { + url: require.resolve('url/'), + }, + }, + plugins, +}; + +export default config; diff --git a/client/web/build/workbox.ts b/client/web/build/workbox.ts new file mode 100644 index 00000000000..5e1729a3472 --- /dev/null +++ b/client/web/build/workbox.ts @@ -0,0 +1,86 @@ +import { + buildRuntimePluginJSResourceCacheGroup, + workboxPluginDetailPattern, + workboxPluginEntryPattern, +} from './utils'; +import WorkboxPlugin from 'workbox-webpack-plugin'; + +/** + * 构建webpack workbox sw插件 + */ +export function buildWorkboxPlugin(isDev: boolean) { + const workboxPlugin = new WorkboxPlugin.GenerateSW({ + // https://developers.google.com/web/tools/workbox + // these options encourage the ServiceWorkers to get in there fast + // and not allow any straggling "old" SWs to hang around + clientsClaim: true, + skipWaiting: true, + + exclude: isDev + ? // https://github.com/GoogleChrome/workbox/issues/1790#issuecomment-1241356293 + // In dev, exclude everything. + // This avoids irrelevant warnings about chunks being too large for caching. + // In non-dev, use the default `exclude` option, don't override. + [/./] + : // Do not precache images in production + [/\.(?:png|jpg|jpeg|svg)$/], + + maximumFileSizeToCacheInBytes: 8 * 1024 * 1024, // 限制最大缓存 8M + + // Define runtime caching rules. + runtimeCaching: [ + { + // Match any request that ends with .png, .jpg, .jpeg or .svg. + urlPattern: /\.(?:png|jpg|jpeg|svg)$/, + + // Apply a cache-first strategy. + // Reference: https://developers.google.com/web/tools/workbox/reference-docs/latest/module-workbox-strategies + handler: 'CacheFirst', + + options: { + // Use a custom cache name. + cacheName: 'images', + + // Only cache 10 images. + expiration: { + maxEntries: 10, + maxAgeSeconds: 14 * 24 * 60 * 60, // 2 week + }, + }, + }, + //#region 插件缓存匹配 + + // 匹配内置 plugins 入口文件 以加速 + buildRuntimePluginJSResourceCacheGroup( + workboxPluginEntryPattern, + 'builtin-plugins-entry', + 24 * 60 * 60 // 1 day + ), + // 匹配内置 plugins 内容 以加速 + buildRuntimePluginJSResourceCacheGroup( + workboxPluginDetailPattern, + 'builtin-plugins-detail', + 7 * 24 * 60 * 60 // 1 week + ), + //#endregion + ], + }); + + if (isDev) { + // Suppress the "InjectManifest has been called multiple times" warning by reaching into + // the private properties of the plugin and making sure it never ends up in the state + // where it makes that warning. + // https://github.com/GoogleChrome/workbox/blob/v6/packages/workbox-webpack-plugin/src/inject-manifest.ts#L260-L282 + Object.defineProperty(workboxPlugin, 'alreadyCalled', { + get() { + return false; + }, + set() { + // do nothing; the internals try to set it to true, which then results in a warning + // on the next run of webpack. + }, + }); + } + + return workboxPlugin; +} diff --git a/web/e2e/cypress/.gitignore b/client/web/e2e/cypress/.gitignore similarity index 100% rename from web/e2e/cypress/.gitignore rename to client/web/e2e/cypress/.gitignore diff --git a/web/e2e/cypress/cypress.json b/client/web/e2e/cypress/cypress.json similarity index 100% rename from web/e2e/cypress/cypress.json rename to client/web/e2e/cypress/cypress.json diff --git a/web/e2e/cypress/cypress/components/antd.test.tsx b/client/web/e2e/cypress/cypress/components/antd.test.tsx similarity index 100% rename from web/e2e/cypress/cypress/components/antd.test.tsx rename to client/web/e2e/cypress/cypress/components/antd.test.tsx diff --git a/web/e2e/cypress/cypress/components/utils/TestWrapper.tsx b/client/web/e2e/cypress/cypress/components/utils/TestWrapper.tsx similarity index 100% rename from web/e2e/cypress/cypress/components/utils/TestWrapper.tsx rename to client/web/e2e/cypress/cypress/components/utils/TestWrapper.tsx diff --git a/web/e2e/cypress/cypress/plugins/index.js b/client/web/e2e/cypress/cypress/plugins/index.js similarity index 100% rename from web/e2e/cypress/cypress/plugins/index.js rename to client/web/e2e/cypress/cypress/plugins/index.js diff --git a/web/e2e/cypress/cypress/plugins/load-webpack.js b/client/web/e2e/cypress/cypress/plugins/load-webpack.js similarity index 100% rename from web/e2e/cypress/cypress/plugins/load-webpack.js rename to client/web/e2e/cypress/cypress/plugins/load-webpack.js diff --git a/web/e2e/cypress/cypress/plugins/utils/tryLoadWebpackConfig.js b/client/web/e2e/cypress/cypress/plugins/utils/tryLoadWebpackConfig.js similarity index 100% rename from web/e2e/cypress/cypress/plugins/utils/tryLoadWebpackConfig.js rename to client/web/e2e/cypress/cypress/plugins/utils/tryLoadWebpackConfig.js diff --git a/web/e2e/cypress/cypress/support/commands.ts b/client/web/e2e/cypress/cypress/support/commands.ts similarity index 100% rename from web/e2e/cypress/cypress/support/commands.ts rename to client/web/e2e/cypress/cypress/support/commands.ts diff --git a/web/e2e/cypress/cypress/support/index.ts b/client/web/e2e/cypress/cypress/support/index.ts similarity index 100% rename from web/e2e/cypress/cypress/support/index.ts rename to client/web/e2e/cypress/cypress/support/index.ts diff --git a/web/e2e/cypress/package.json b/client/web/e2e/cypress/package.json similarity index 100% rename from web/e2e/cypress/package.json rename to client/web/e2e/cypress/package.json diff --git a/web/e2e/cypress/yarn.lock b/client/web/e2e/cypress/yarn.lock similarity index 100% rename from web/e2e/cypress/yarn.lock rename to client/web/e2e/cypress/yarn.lock diff --git a/web/e2e/playwright/.gitignore b/client/web/e2e/playwright/.gitignore similarity index 100% rename from web/e2e/playwright/.gitignore rename to client/web/e2e/playwright/.gitignore diff --git a/client/web/e2e/playwright/.npmrc b/client/web/e2e/playwright/.npmrc new file mode 100644 index 00000000000..059ab334509 --- /dev/null +++ b/client/web/e2e/playwright/.npmrc @@ -0,0 +1,2 @@ +# https://npmmirror.com/ +registry = https://registry.npmmirror.com diff --git a/web/e2e/playwright/package.json b/client/web/e2e/playwright/package.json similarity index 100% rename from web/e2e/playwright/package.json rename to client/web/e2e/playwright/package.json diff --git a/web/e2e/playwright/playwright.config.ts b/client/web/e2e/playwright/playwright.config.ts similarity index 100% rename from web/e2e/playwright/playwright.config.ts rename to client/web/e2e/playwright/playwright.config.ts diff --git a/web/e2e/playwright/tests/entry.spec.ts b/client/web/e2e/playwright/tests/entry.spec.ts similarity index 100% rename from web/e2e/playwright/tests/entry.spec.ts rename to client/web/e2e/playwright/tests/entry.spec.ts diff --git a/web/e2e/playwright/tests/example.spec.ts.skip b/client/web/e2e/playwright/tests/example.spec.ts.skip similarity index 100% rename from web/e2e/playwright/tests/example.spec.ts.skip rename to client/web/e2e/playwright/tests/example.spec.ts.skip diff --git a/web/e2e/playwright/tests/main.spec.ts b/client/web/e2e/playwright/tests/main.spec.ts similarity index 100% rename from web/e2e/playwright/tests/main.spec.ts rename to client/web/e2e/playwright/tests/main.spec.ts diff --git a/web/e2e/playwright/tests/utils/user.ts b/client/web/e2e/playwright/tests/utils/user.ts similarity index 100% rename from web/e2e/playwright/tests/utils/user.ts rename to client/web/e2e/playwright/tests/utils/user.ts diff --git a/web/e2e/playwright/yarn.lock b/client/web/e2e/playwright/yarn.lock similarity index 100% rename from web/e2e/playwright/yarn.lock rename to client/web/e2e/playwright/yarn.lock diff --git a/client/web/jest.config.js b/client/web/jest.config.js new file mode 100644 index 00000000000..805d7a36ccc --- /dev/null +++ b/client/web/jest.config.js @@ -0,0 +1,80 @@ +const regeneratorRuntime = require('regenerator-runtime'); +const { pathsToModuleNameMapper } = require('ts-jest'); +const webCompilerOptions = require('./tsconfig.test.json').compilerOptions; + +// 用于处理编译出来是esmodule会抛出 SyntaxError: Unexpected token 'export' 问题的包 +const esModules = [ + 'react-markdown', + 'vfile', + 'unist-util-stringify-position', + 'unified', + 'bail', + 'is-plain-obj', + 'trough', + 'remark-parse', + 'mdast-util-from-markdown', + 'mdast-util-to-string', + 'micromark', + 'decode-named-character-reference', + 'character-entities', + 'remark-rehype', + 'mdast-util-to-hast', + 'unist-builder', + 'unist-util-visit', + 'unist-util-is', + 'unist-util-position', + 'unist-util-generated', + 'mdast-util-definitions', + 'trim-lines', + 'property-information', + 'hast-util-whitespace', + 'space-separated-tokens', + 'comma-separated-tokens', + 'remark-gfm', + 'mdast-util-gfm', + 'mdast-util-gfm-autolink-literal', + 'mdast-util-find-and-replace', + 'mdast-util-to-markdown', + 'markdown-table', + 'escape-string-regexp', + 'ccount', + 'hast-util-raw', + 'rehype-raw', + 'hast-util-from-parse5', + 'hast-util-to-parse5', + 'hastscript', + 'hast-util-parse-selector', + 'web-namespaces', + 'zwitch', + 'html-void-elements', +].join('|'); + +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'jsdom', + moduleNameMapper: { + '\\.(css|less|scss)$': 'identity-obj-proxy', + ...pathsToModuleNameMapper(webCompilerOptions.paths, { + prefix: '/', + }), + }, + // projects: ['/web/'], // https://jestjs.io/docs/configuration#projects-arraystring--projectconfig + rootDir: '.', + testRegex: '.*\\.(test|spec)\\.tsx?$', + testPathIgnorePatterns: ['/node_modules/', '/e2e/'], + transform: { + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/test/fileTransformer.js', + [`(${esModules}).+\\.(j|t)sx?$`]: 'ts-jest', + }, + transformIgnorePatterns: [`/node_modules/\.pnpm/(?!(${esModules}))`], + setupFiles: ['/test/setup.js'], + setupFilesAfterEnv: [], + globals: { + window: {}, + 'ts-jest': { + tsconfig: 'tsconfig.test.json', + }, + }, +}; diff --git a/client/web/package.json b/client/web/package.json new file mode 100644 index 00000000000..e840b9f3ad2 --- /dev/null +++ b/client/web/package.json @@ -0,0 +1,165 @@ +{ + "name": "tailchat-web", + "private": true, + "version": "1.0.0", + "main": "index.js", + "repository": "https://github.com/msgbyte/tailchat.git", + "author": "moonrailgun ", + "license": "Apache-2.0", + "scripts": { + "build": "cross-env NODE_ENV=production rimraf ./dist && pnpm plugins:all && pnpm build:webpack", + "build:webpack": "cross-env TS_NODE_PROJECT='tsconfig.node.json' webpack --config ./build/webpack.config.ts", + "build:stats": "pnpm build:webpack --profile --json=compilation-stats.json", + "build:ci": "cross-env PREF_REPORT=1 NODE_ENV=production pnpm build:webpack", + "dev": "concurrently --kill-others npm:dev:main npm:plugins:watch", + "dev:main": "cross-env TS_NODE_PROJECT='tsconfig.node.json' NODE_ENV=development SERVICE_URL=http://127.0.0.1:11000 webpack serve --config ./build/webpack.config.ts", + "serve": "npx http-server ./dist", + "test": "jest", + "analysis": "cross-env ANALYSIS=true pnpm build:webpack", + "check:type": "tsc --noEmit --skipLibCheck", + "preinstall": "npx only-allow pnpm", + "postinstall": "pnpm plugins:all", + "plugins:new": "tailchat create client-plugin", + "plugins:all": "ministar buildPlugin all", + "plugins:watch": "ministar watchPlugin all", + "plugins:declaration:generate": "cross-env TS_NODE_PROJECT='tsconfig.node.json' ts-node ./scripts/generate-plugin-declaration.typescript.ts" + }, + "dependencies": { + "@bytemd/plugin-gfm": "^1.21.0", + "@bytemd/react": "^1.21.0", + "@emoji-mart/data": "^1.1.2", + "@emoji-mart/react": "^1.1.1", + "@loadable/component": "^5.15.3", + "@tanstack/react-query-devtools": "4.33.0", + "@use-gesture/react": "^10.2.24", + "ahooks": "^3.7.4", + "antd": "^4.24.13", + "array-move": "3.0.1", + "axios": "^0.21.4", + "bytemd": "^1.21.0", + "clsx": "^1.2.1", + "compressorjs": "^1.1.1", + "copy-to-clipboard": "^3.3.3", + "detect-browser": "^5.3.0", + "emoji-mart": "^5.5.2", + "generate-json-webpack-plugin": "^2.0.0", + "immer": "9.0.15", + "is-electron": "^2.2.2", + "is-hotkey": "^0.2.0", + "jsonschema": "^1.4.1", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0", + "mini-star": "2.1.1", + "minimatch": "^5.1.6", + "p-min-delay": "^4.0.2", + "qs": "^6.11.0", + "rc-tree": "^5.7.2", + "react": "18.2.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "18.2.0", + "react-easy-crop": "^5.0.0", + "react-easy-sort": "^1.5.1", + "react-helmet": "^6.1.0", + "react-is": "^18.2.0", + "react-markdown": "^8.0.5", + "react-mentions": "^4.4.7", + "react-router": "^6.8.1", + "react-router-dom": "^6.8.1", + "react-split": "^2.0.14", + "react-transition-group": "^4.4.5", + "react-virtualized-auto-sizer": "^1.0.7", + "react-virtuoso": "^4.4.0", + "rehype-raw": "^6.1.1", + "rehype-sanitize": "^6.0.0", + "remark-gfm": "^3.0.1", + "socket.io-client": "^4.6.1", + "source-ref-runtime": "^1.0.7", + "styled-components": "^5.3.6", + "tailchat-design": "workspace:^1.0.0", + "tailchat-shared": "^1.0.0", + "tailwindcss": "^2.2.19", + "url": "^0.11.0", + "web-vitals": "^3.1.1", + "yup": "^0.32.11", + "zustand": "4.3.6" + }, + "devDependencies": { + "@perfsee/webpack": "1.0.0-alpha.4", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/react-hooks": "^8.0.1", + "@types/copy-webpack-plugin": "^8.0.1", + "@types/dts-generator": "^2.1.7", + "@types/fs-extra": "^9.0.13", + "@types/generate-json-webpack-plugin": "^0.3.4", + "@types/is-hotkey": "^0.1.7", + "@types/jest": "^29.4.0", + "@types/loadable__component": "^5.13.4", + "@types/lodash": "^4.14.191", + "@types/mini-css-extract-plugin": "^1.4.3", + "@types/minimatch": "^3.0.5", + "@types/node": "^15.14.9", + "@types/qs": "^6.9.7", + "@types/react": "18.0.20", + "@types/react-dom": "18.0.6", + "@types/react-helmet": "^6.1.6", + "@types/react-mentions": "^4.1.8", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", + "@types/react-transition-group": "^4.4.5", + "@types/react-virtualized": "^9.21.21", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/styled-components": "^5.1.26", + "@types/webpack": "^5.28.0", + "@types/webpack-bundle-analyzer": "^4.6.0", + "@types/webpack-dev-server": "^4.7.2", + "autoprefixer": "^10.4.13", + "bundle-stats-webpack-plugin": "^4.2.3", + "copy-webpack-plugin": "^11.0.0", + "cross-env": "^7.0.3", + "css-loader": "^5.2.7", + "css-minimizer-webpack-plugin": "^4.2.2", + "dotenv": "^10.0.0", + "dts-generator": "^3.0.0", + "esbuild-loader": "^2.21.0", + "execa": "^5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "glob": "^7.2.3", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "27.5.1", + "jest-environment-jsdom": "27.5.1", + "less": "^4.1.3", + "less-loader": "^10.2.0", + "mini-css-extract-plugin": "^2.7.2", + "normalize-path": "^3.0.0", + "postcss": "^8.4.21", + "postcss-loader": "^6.2.1", + "rimraf": "^3.0.2", + "rollup-plugin-copy": "^3.4.0", + "rollup-plugin-replace": "^2.2.0", + "rollup-plugin-source-ref": "^1.0.7", + "source-ref-loader": "^1.0.7", + "style-loader": "^3.3.1", + "tailchat-plugin-declaration-generator": "workspace:^1.0.0", + "terser-webpack-plugin": "^5.3.6", + "ts-jest": "27.1.4", + "ts-node": "^10.9.1", + "tsconfig-paths": "^3.14.1", + "tsconfig-paths-webpack-plugin": "^4.0.0", + "typescript": "^4.9.5", + "url-loader": "^4.1.1", + "webpack": "5.75.0", + "webpack-bundle-analyzer": "^4.8.0", + "webpack-cli": "^4.10.0", + "webpack-dev-server": "^4.11.1", + "webpack-retry-chunk-load-plugin": "^3.1.1", + "webpack-stats-viewer-plugin": "1.0.2", + "webpackbar": "^5.0.2", + "workbox-build": "^6.5.4", + "workbox-webpack-plugin": "^6.5.4" + } +} diff --git a/client/web/plugins/.eslintrc.js b/client/web/plugins/.eslintrc.js new file mode 100644 index 00000000000..d8425b51e53 --- /dev/null +++ b/client/web/plugins/.eslintrc.js @@ -0,0 +1,24 @@ +const rootlint = require('../../../.eslintrc.js'); + +module.exports = { + ...rootlint, + root: true, + rules: { + ...rootlint.rules, + 'no-restricted-imports': [ + 'error', + { + name: 'tailchat-shared', + message: 'Only allow use `@capital/*`', + }, + { + name: 'antd', + message: 'Only allow use `@capital/component`', + }, + { + name: 'translate', + message: 'Maybe you should use `./translate`', + }, + ], + }, +}; diff --git a/client/web/plugins/README.md b/client/web/plugins/README.md new file mode 100644 index 00000000000..612805d38cc --- /dev/null +++ b/client/web/plugins/README.md @@ -0,0 +1,41 @@ +## 如何创建一个插件 + +### 内部插件 + +> 内部插件是指随 `tailchat` 分发而提供的插件 + +在web目录执行: + +```bash +pnpm ministar createPlugin +``` + +插件名请准守反域名模式, 如: `com.msgbyte.xxx` + +设置`tsconfig.json`如下: +```json +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} +``` + +创建一个`manifest.json`文件 + +示例: +```json +{ + "label": "网页面板插件", + "name": "com.msgbyte.webview", + "url": "/plugins/com.msgbyte.webview/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "为群组提供创建网页面板的功能", + "requireRestart": false +} +``` diff --git a/client/web/plugins/com.msgbyte.ai-assistant/assets/icon.png b/client/web/plugins/com.msgbyte.ai-assistant/assets/icon.png new file mode 100644 index 00000000000..28e8a173309 Binary files /dev/null and b/client/web/plugins/com.msgbyte.ai-assistant/assets/icon.png differ diff --git a/client/web/plugins/com.msgbyte.ai-assistant/manifest.json b/client/web/plugins/com.msgbyte.ai-assistant/manifest.json new file mode 100644 index 00000000000..f5dfa1317bc --- /dev/null +++ b/client/web/plugins/com.msgbyte.ai-assistant/manifest.json @@ -0,0 +1,10 @@ +{ + "label": "AI Assistant", + "name": "com.msgbyte.ai-assistant", + "url": "/plugins/com.msgbyte.ai-assistant/index.js", + "icon": "/plugins/com.msgbyte.ai-assistant/assets/icon.png", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add chatgpt into Tailchat", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.ai-assistant/package.json b/client/web/plugins/com.msgbyte.ai-assistant/package.json new file mode 100644 index 00000000000..d689420b3f2 --- /dev/null +++ b/client/web/plugins/com.msgbyte.ai-assistant/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/com.msgbyte.ai-assistant", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Add chatgpt into Tailchat", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.ai-assistant/src/index.tsx b/client/web/plugins/com.msgbyte.ai-assistant/src/index.tsx new file mode 100644 index 00000000000..306193e3152 --- /dev/null +++ b/client/web/plugins/com.msgbyte.ai-assistant/src/index.tsx @@ -0,0 +1,22 @@ +import { regChatInputButton } from '@capital/common'; +import { BaseChatInputButton } from '@capital/component'; +import React from 'react'; +import { AssistantPopover } from './popover'; + +const PLUGIN_ID = 'com.msgbyte.ai-assistant'; +const PLUGIN_NAME = 'AI Assistant'; + +console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`); + +regChatInputButton({ + render: () => { + return ( + ( + + )} + /> + ); + }, +}); diff --git a/client/web/plugins/com.msgbyte.ai-assistant/src/popover.tsx b/client/web/plugins/com.msgbyte.ai-assistant/src/popover.tsx new file mode 100644 index 00000000000..397c29d81c5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.ai-assistant/src/popover.tsx @@ -0,0 +1,178 @@ +import React from 'react'; +import { Translate } from './translate'; +import { + useAsyncRequest, + useConverseMessageContext, + getCachedUserInfo, + getMessageTextDecorators, +} from '@capital/common'; +import { + LoadingSpinner, + useChatInputActionContext, + Tag, + Button, + Divider, +} from '@capital/component'; +import axios from 'axios'; +import styled from 'styled-components'; +import { + improveTextPrompt, + longerTextPrompt, + shorterTextPrompt, + summaryMessagesPrompt, + translateTextPrompt, +} from './prompt'; + +const Root = styled.div` + padding: 0.5rem; + max-width: 300px; +`; + +const Tip = styled.div` + margin-bottom: 4px; +`; + +const Answer = styled.pre` + white-space: pre-wrap; + max-height: 50vh; + overflow: auto; +`; + +const ActionButton = styled.div` + min-width: 180px; + padding: 4px 6px; + border-radius: 3px; + background-color: rgba(0, 0, 0, 0.1); + cursor: pointer; + margin-bottom: 4px; + + &:hover { + background-color: rgba(0, 0, 0, 0.2); + } +`; + +const ActionTip = styled.div` + font-size: 12px; + opacity: 0.6; +`; + +export const AssistantPopover: React.FC<{ + onCompleted: () => void; +}> = React.memo((props) => { + const { messages } = useConverseMessageContext(); + const { message, setMessage } = useChatInputActionContext(); + const [{ loading, value }, handleCallAI] = useAsyncRequest( + async (question: string) => { + // TODO: wait for replace + const { data } = await axios.post('https://yyejoq.laf.dev/chatgpt', { + question, + }); + + return data; + }, + [] + ); + + if (loading) { + return ( + + + + ); + } + + return ( + +
+ {typeof value === 'object' && ( + <> + {value.result ? ( +
+ {value.answer} +
+ + {Translate.usage}: {value.usage}ms + + + +
+
+ ) : ( +
+
{Translate.serviceBusy}
+ {Translate.callError} +
+ )} + + + + )} +
+ + {Translate.helpMeTo} + + { + const plainMessages = ( + await Promise.all( + [...messages] + .filter((item) => !item.hasRecall) // filter recalled message + .slice(messages.length - 30, messages.length) // get last 30 message, too much will throw error + .map( + async (item) => + `${ + ( + await getCachedUserInfo(item.author) + ).nickname + }: ${getMessageTextDecorators().serialize( + item.content ?? '' + )}` + ) + ) + ).join('\n'); + + handleCallAI(summaryMessagesPrompt + '\n' + plainMessages); + }} + > + {Translate.summaryMessages} + + + {typeof message === 'string' && message.length > 0 ? ( + <> + handleCallAI(improveTextPrompt + message)} + > + {Translate.improveText} + + handleCallAI(shorterTextPrompt + message)} + > + {Translate.makeShorter} + + handleCallAI(longerTextPrompt + message)} + > + {Translate.makeLonger} + + handleCallAI(translateTextPrompt + message)} + > + {Translate.translateInputText} + + + ) : ( + {Translate.inputTextShowMoreActionTip} + )} +
+ ); +}); +AssistantPopover.displayName = 'AssistantPopover'; diff --git a/client/web/plugins/com.msgbyte.ai-assistant/src/prompt.ts b/client/web/plugins/com.msgbyte.ai-assistant/src/prompt.ts new file mode 100644 index 00000000000..39f48873e7f --- /dev/null +++ b/client/web/plugins/com.msgbyte.ai-assistant/src/prompt.ts @@ -0,0 +1,11 @@ +import { Translate } from './translate'; + +export const improveTextPrompt = Translate.prompt.improveText; + +export const shorterTextPrompt = Translate.prompt.shorterText; + +export const longerTextPrompt = Translate.prompt.longerText; + +export const translateTextPrompt = Translate.prompt.translateText; + +export const summaryMessagesPrompt = Translate.prompt.summaryMessages; diff --git a/client/web/plugins/com.msgbyte.ai-assistant/src/translate.ts b/client/web/plugins/com.msgbyte.ai-assistant/src/translate.ts new file mode 100644 index 00000000000..39d2201a079 --- /dev/null +++ b/client/web/plugins/com.msgbyte.ai-assistant/src/translate.ts @@ -0,0 +1,84 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + name: localTrans({ + 'zh-CN': 'AI Assistant', + 'en-US': 'AI Assistant', + }), + helpMeTo: localTrans({ + 'zh-CN': '帮我:', + 'en-US': 'Help me to:', + }), + improveText: localTrans({ + 'zh-CN': '改进文本', + 'en-US': 'Improve Text', + }), + makeShorter: localTrans({ + 'zh-CN': '精简内容', + 'en-US': 'Make Shorter', + }), + makeLonger: localTrans({ + 'zh-CN': '扩写内容', + 'en-US': 'Make Longer', + }), + summaryMessages: localTrans({ + 'zh-CN': '总结内容', + 'en-US': 'Summary Messages', + }), + translateInputText: localTrans({ + 'zh-CN': '翻译输入内容', + 'en-US': 'Translate Input', + }), + inputTextShowMoreActionTip: localTrans({ + 'zh-CN': '或者输入内容后展示更多操作', + 'en-US': 'Or input message then show more actions', + }), + usage: localTrans({ + 'zh-CN': '用时', + 'en-US': 'Usage', + }), + serviceBusy: localTrans({ + 'zh-CN': '服务器忙,请稍后再试', + 'en-US': 'Server is busy, please try again later', + }), + callError: localTrans({ + 'zh-CN': '调用失败', + 'en-US': 'Call Error', + }), + apply: localTrans({ + 'zh-CN': '应用', + 'en-US': 'Apply', + }), + prompt: { + improveText: localTrans({ + 'zh-CN': + '你是一位文字美化师,你只需要美化文字,不需要解读。现在我需要你润色我的内容并保留我的母语:', + 'en-US': + "You are a text embellisher, you can only embellish the text, don't interpret it. Now i need you embellish it and keep my origin language:", + }), + shorterText: localTrans({ + 'zh-CN': + '你是一位文字美化师,你只需要简化文字,不需要解读。现在我需要你简化它并保留我的母语:', + 'en-US': + "You are a text embellisher, you can only shorter the text, don't interpret it. Now i need you shorter it and keep my origin language:", + }), + longerText: localTrans({ + 'zh-CN': + '你是一位文字美化师,你只需要扩写文字,不需要解读。现在我需要你扩写它并保留我的母语:', + 'en-US': + "You are a text embellisher, you can only longer the text, don't interpret it. Now i need you longer it and keep my origin language:", + }), + translateText: localTrans({ + 'zh-CN': + '你是一个负责翻译文本的程序。你的任务是根据输入的文本输出指定的目标语言。 请不要输出翻译以外的任何文本。 目标语言是英文,如果你收到的文字是英文,请翻译成中文(不需要拼音),以下是我的内容:', + 'en-US': + 'You are a program responsible for translating text. Your task is to output the specified target language based on the input text. Please do not output any text other than the translation. Target language is english, and if you receive text is english, please translate to chinese(no need pinyin), then its my text:', + }), + summaryMessages: localTrans({ + 'zh-CN': + '你将得到一串聊天记录,希望你能够对这些记录进行摘要。要求简明扼要,以包含列表的大纲形式输出。', + 'en-US': + 'You will receive a chat record and we hope you can summarize it. Please provide a concise outline format that includes a list.', + }), + }, +}; diff --git a/client/web/plugins/com.msgbyte.ai-assistant/tsconfig.json b/client/web/plugins/com.msgbyte.ai-assistant/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.ai-assistant/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.ai-assistant/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.ai-assistant/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.ai-assistant/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/client/web/plugins/com.msgbyte.bbcode/manifest.json b/client/web/plugins/com.msgbyte.bbcode/manifest.json new file mode 100644 index 00000000000..3874d1848a4 --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "BBCode Mmessage Interpreter", + "label.zh-CN": "BBCode 消息解释器", + "name": "com.msgbyte.bbcode", + "url": "/plugins/com.msgbyte.bbcode/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "A plugin for supporting bbcode syntax to interpret rich text messages", + "description.zh-CN": "一个用于支持bbcode语法解释富文本消息的插件", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.bbcode/package.json b/client/web/plugins/com.msgbyte.bbcode/package.json new file mode 100644 index 00000000000..3d888dd50bc --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/package.json @@ -0,0 +1,17 @@ +{ + "name": "@plugins/com.msgbyte.bbcode", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": { + "@bbob/parser": "^2.7.0", + "highlight.js": "^11.5.1", + "react-highlight": "^0.14.0", + "url-regex": "^5.0.0" + }, + "devDependencies": { + "@types/react-highlight": "^0.12.5", + "react": "18.2.0", + "react-dom": "18.2.0" + } +} diff --git a/web/plugins/com.msgbyte.bbcode/src/__tests__/__snapshots__/render.spec.tsx.snap b/client/web/plugins/com.msgbyte.bbcode/src/__tests__/__snapshots__/render.spec.tsx.snap similarity index 79% rename from web/plugins/com.msgbyte.bbcode/src/__tests__/__snapshots__/render.spec.tsx.snap rename to client/web/plugins/com.msgbyte.bbcode/src/__tests__/__snapshots__/render.spec.tsx.snap index 018836993f4..76061f3aaf7 100644 --- a/web/plugins/com.msgbyte.bbcode/src/__tests__/__snapshots__/render.spec.tsx.snap +++ b/client/web/plugins/com.msgbyte.bbcode/src/__tests__/__snapshots__/render.spec.tsx.snap @@ -7,7 +7,7 @@ exports[`render mention with space name 1`] = ` data-userid="6251986eab331ca2efbba9c6" > @ - Notify Bot + [UserName {"userId":"6251986eab331ca2efbba9c6","fallbackName":"Notify Bot"}]
 {
+  describe('preprocess text', () => {
+    it('simple url parse', () => {
+      const text = preProcessLinkText('http://baidu.com/');
+      expect(text).toBe('[url]http://baidu.com[/url]');
+    });
+
+    it('mix text and url parse', () => {
+      const text = preProcessLinkText('open:http://baidu.com');
+      expect(text).toBe('open:[url]http://baidu.com[/url]');
+    });
+
+    it('mix text and more url parse', () => {
+      const text = preProcessLinkText(
+        'open:http://baidu.com and http://google.com'
+      );
+      expect(text).toBe(
+        'open:[url]http://baidu.com[/url] and [url]http://google.com[/url]'
+      );
+    });
+  });
+
+  describe('preProcessText', () => {
+    test.each([
+      ['https://baidu.com/', '[url]https://baidu.com[/url]'],
+      ['[url]https://baidu.com[/url]', '[url]https://baidu.com[/url]'],
+      [
+        '[url=https://baidu.com]百度[/url]',
+        '[url="https://baidu.com/"]百度[/url]',
+      ],
+      [
+        '[url=https://baidu.com alt=test]百度[/url]',
+        '[url="https://baidu.com/" alt="test"]百度[/url]',
+      ],
+    ])('%s', (input, output) => {
+      expect(preProcessText(input)).toBe(output);
+    });
+  });
+});
diff --git a/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/parser.spec.ts b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/parser.spec.ts
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/parser.spec.ts
rename to client/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/parser.spec.ts
diff --git a/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/serialize.spec.ts b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/serialize.spec.ts
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/serialize.spec.ts
rename to client/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/serialize.spec.ts
diff --git a/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/utils.spec.ts b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/utils.spec.ts
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/utils.spec.ts
rename to client/web/plugins/com.msgbyte.bbcode/src/bbcode/__tests__/utils.spec.ts
diff --git a/client/web/plugins/com.msgbyte.bbcode/src/bbcode/index.tsx b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/index.tsx
new file mode 100644
index 00000000000..19fcac032b0
--- /dev/null
+++ b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/index.tsx
@@ -0,0 +1,31 @@
+import React, { Fragment } from 'react';
+import bbcodeParser from './parser';
+import urlRegex from 'url-regex';
+
+/**
+ * 客户端预处理文本
+ * @param plainText 服务端文本
+ */
+export function preProcessLinkText(plainText: string): string {
+  const text = plainText.replace(
+    urlRegex({ exact: false, strict: true }),
+    '[url]$&[/url]'
+  ); // 将聊天记录中的url提取成bbcode 需要过滤掉被bbcode包住的部分
+
+  return text;
+}
+
+// 处理所有的预处理文本
+export function preProcessText(plainText: string): string {
+  return bbcodeParser.preProcessText(plainText, preProcessLinkText);
+}
+
+interface BBCodeProps {
+  plainText: string;
+}
+export const BBCode: React.FC = React.memo(({ plainText }) => {
+  const bbcodeComponent = bbcodeParser.render(preProcessText(plainText ?? ''));
+
+  return {bbcodeComponent};
+});
+BBCode.displayName = 'BBCode';
diff --git a/web/plugins/com.msgbyte.bbcode/src/bbcode/parser.tsx b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/parser.tsx
similarity index 96%
rename from web/plugins/com.msgbyte.bbcode/src/bbcode/parser.tsx
rename to client/web/plugins/com.msgbyte.bbcode/src/bbcode/parser.tsx
index f22ed58b75c..ef66a3af19d 100644
--- a/web/plugins/com.msgbyte.bbcode/src/bbcode/parser.tsx
+++ b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/parser.tsx
@@ -79,10 +79,13 @@ class BBCodeParser {
         const { tag, content, attrs } = node;
         const attrsStr = _toPairs(attrs)
           .map(([key, value]) => {
+            /**
+             * 增加双引号以解决value中可能会出现空格的问题
+             */
             if (key === value) {
-              return `=${value}`;
+              return `="${value}"`;
             } else {
-              return ` ${key}=${value}`;
+              return ` ${key}="${value}"`;
             }
           })
           // NOTICE: 这里排序看起来好像有问题,但是attrs的顺序是有序的,所以没有问题
diff --git a/web/plugins/com.msgbyte.bbcode/src/bbcode/serialize.ts b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/serialize.ts
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/bbcode/serialize.ts
rename to client/web/plugins/com.msgbyte.bbcode/src/bbcode/serialize.ts
diff --git a/web/plugins/com.msgbyte.bbcode/src/bbcode/type.ts b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/type.ts
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/bbcode/type.ts
rename to client/web/plugins/com.msgbyte.bbcode/src/bbcode/type.ts
diff --git a/web/plugins/com.msgbyte.bbcode/src/bbcode/utils.tsx b/client/web/plugins/com.msgbyte.bbcode/src/bbcode/utils.tsx
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/bbcode/utils.tsx
rename to client/web/plugins/com.msgbyte.bbcode/src/bbcode/utils.tsx
diff --git a/web/plugins/com.msgbyte.bbcode/src/components/Highlight.tsx b/client/web/plugins/com.msgbyte.bbcode/src/components/Highlight.tsx
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/components/Highlight.tsx
rename to client/web/plugins/com.msgbyte.bbcode/src/components/Highlight.tsx
diff --git a/client/web/plugins/com.msgbyte.bbcode/src/index.tsx b/client/web/plugins/com.msgbyte.bbcode/src/index.tsx
new file mode 100644
index 00000000000..6cbad681014
--- /dev/null
+++ b/client/web/plugins/com.msgbyte.bbcode/src/index.tsx
@@ -0,0 +1,47 @@
+import React from 'react';
+import {
+  Loadable,
+  regMessageRender,
+  regMessageTextDecorators,
+} from '@capital/common';
+
+const PLUGIN_ID = 'com.msgbyte.bbcode';
+
+// 预加载
+import('./render');
+
+const BBCode = Loadable(() => import('./render'), {
+  componentName: `${PLUGIN_ID}:renderComponent`,
+  fallback: null,
+});
+let serialize: (bbcode: string) => string;
+import('./bbcode/serialize').then((module) => {
+  serialize = module.bbcodeToPlainText;
+});
+
+regMessageRender((message) => {
+  return ;
+});
+
+regMessageTextDecorators(() => ({
+  url: (url, label?) =>
+    label ? `[url=${url}]${label}[/url]` : `[url]${url}[/url]`,
+  image: (plain, attrs) => {
+    if (attrs.height && attrs.width) {
+      return `[img height=${attrs.height} width=${attrs.width}]${plain}[/img]`;
+    }
+
+    return `[img]${plain}[/img]`;
+  },
+  card: (plain, attrs) => {
+    const h = [
+      'card',
+      ...Object.entries(attrs).map(([k, v]) => `${k}=${v}`),
+    ].join(' ');
+
+    return `[${h}]${plain}[/card]`;
+  },
+  mention: (userId, userName) => `[at=${userId}]${userName}[/at]`,
+  emoji: (emojiCode) => `[emoji]${emojiCode}[/emoji]`,
+  serialize: (plain: string) => (serialize ? serialize(plain) : plain),
+}));
diff --git a/web/plugins/com.msgbyte.bbcode/src/render.ts b/client/web/plugins/com.msgbyte.bbcode/src/render.ts
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/render.ts
rename to client/web/plugins/com.msgbyte.bbcode/src/render.ts
diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/BoldTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/BoldTag.tsx
new file mode 100644
index 00000000000..e35a8a61313
--- /dev/null
+++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/BoldTag.tsx
@@ -0,0 +1,10 @@
+import React from 'react';
+import type { TagProps } from '../bbcode/type';
+
+export const BoldTag: React.FC = React.memo((props) => {
+  const { node } = props;
+  const text = node.content.join('');
+
+  return {text};
+});
+BoldTag.displayName = 'BoldTag';
diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/CardTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/CardTag.tsx
new file mode 100644
index 00000000000..a33399b36e6
--- /dev/null
+++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/CardTag.tsx
@@ -0,0 +1,17 @@
+import { Card } from '@capital/component';
+import React from 'react';
+import type { TagProps } from '../bbcode/type';
+
+export const CardTag: React.FC = React.memo((props) => {
+  const { node } = props;
+  const label = node.content.join('');
+  const attrs = node.attrs ?? {};
+
+  const payload: any = {
+    label,
+    ...attrs,
+  };
+
+  return ;
+});
+CardTag.displayName = 'CardTag';
diff --git a/web/plugins/com.msgbyte.bbcode/src/tags/CodeTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/CodeTag.tsx
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/tags/CodeTag.tsx
rename to client/web/plugins/com.msgbyte.bbcode/src/tags/CodeTag.tsx
diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/DeleteTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/DeleteTag.tsx
new file mode 100644
index 00000000000..2694ce0aa1f
--- /dev/null
+++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/DeleteTag.tsx
@@ -0,0 +1,10 @@
+import React from 'react';
+import type { TagProps } from '../bbcode/type';
+
+export const DeleteTag: React.FC = React.memo((props) => {
+  const { node } = props;
+  const text = node.content.join('');
+
+  return {text};
+});
+DeleteTag.displayName = 'DeleteTag';
diff --git a/web/plugins/com.msgbyte.bbcode/src/tags/EmojiTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/EmojiTag.tsx
similarity index 100%
rename from web/plugins/com.msgbyte.bbcode/src/tags/EmojiTag.tsx
rename to client/web/plugins/com.msgbyte.bbcode/src/tags/EmojiTag.tsx
diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/ImgTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/ImgTag.tsx
new file mode 100644
index 00000000000..d71398124b9
--- /dev/null
+++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/ImgTag.tsx
@@ -0,0 +1,62 @@
+import React from 'react';
+import { getPopupContainer } from '@capital/common';
+import { Image } from '@capital/component';
+import type { TagProps } from '../bbcode/type';
+
+const MAX_HEIGHT = 320;
+const MAX_WIDTH = 320;
+
+const imageStyle: React.CSSProperties = {
+  maxHeight: MAX_HEIGHT,
+  maxWidth: MAX_WIDTH,
+  width: 'auto',
+};
+
+function parseImageAttr(attr: { height: string; width: string }): {
+  height?: number;
+  width?: number;
+} {
+  const height = Number(attr.height);
+  const width = Number(attr.width);
+
+  if (!(height > 0 && width > 0)) {
+    // 确保宽高为数字且均大于0
+    return {};
+  }
+
+  if (height <= MAX_HEIGHT && width <= MAX_WIDTH) {
+    return {
+      height,
+      width,
+    };
+  }
+
+  const ratio = Math.max(height / MAX_HEIGHT, width / MAX_WIDTH);
+
+  return {
+    height: height / ratio,
+    width: width / ratio,
+  };
+}
+
+export const ImgTag: React.FC = React.memo((props) => {
+  const { node } = props;
+  const text = node.content.join('');
+  const url = node.attrs.url ?? text;
+
+  return (
+    
e.stopPropagation()}> + +
+ ); +}); +ImgTag.displayName = 'ImgTag'; diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/ItalicTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/ItalicTag.tsx new file mode 100644 index 00000000000..93651ea62bd --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/ItalicTag.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import type { TagProps } from '../bbcode/type'; + +export const ItalicTag: React.FC = React.memo((props) => { + const { node } = props; + const text = node.content.join(''); + + return {text}; +}); +ItalicTag.displayName = 'ItalicTag'; diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/MarkdownTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/MarkdownTag.tsx new file mode 100644 index 00000000000..1883e3d9e72 --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/MarkdownTag.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { Markdown } from '@capital/component'; +import type { TagProps } from '../bbcode/type'; + +export const MarkdownTag: React.FC = React.memo((props) => { + const { node } = props; + const text = node.content.join(''); + + return ; +}); +MarkdownTag.displayName = 'MarkdownTag'; diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/MentionTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/MentionTag.tsx new file mode 100644 index 00000000000..55ded3e364d --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/MentionTag.tsx @@ -0,0 +1,16 @@ +import { UserName } from '@capital/component'; +import React from 'react'; +import type { TagProps } from '../bbcode/type'; + +export const MentionTag: React.FC = React.memo((props) => { + const { node } = props; + const fallbackName = node.content.join(''); + const userId = node.attrs.at; + + return ( + + @{} + + ); +}); +MentionTag.displayName = 'MentionTag'; diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/PlainText.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/PlainText.tsx new file mode 100644 index 00000000000..29000a429ea --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/PlainText.tsx @@ -0,0 +1,11 @@ +import React, { PropsWithChildren } from 'react'; +import type { TagProps } from '../bbcode/type'; + +export const PlainText: React.FC> = React.memo( + (props) => ( +
+      {props.children}
+    
+ ) +); +PlainText.displayName = 'PlainText'; diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/UnderlinedTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/UnderlinedTag.tsx new file mode 100644 index 00000000000..4634e6e98ec --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/UnderlinedTag.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import type { TagProps } from '../bbcode/type'; + +export const UnderlinedTag: React.FC = React.memo((props) => { + const { node } = props; + const text = node.content.join(''); + + return {text}; +}); +UnderlinedTag.displayName = 'UnderlinedTag'; diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/UrlTag.tsx b/client/web/plugins/com.msgbyte.bbcode/src/tags/UrlTag.tsx new file mode 100644 index 00000000000..1cd65b11a83 --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/UrlTag.tsx @@ -0,0 +1,49 @@ +import { Link } from '@capital/component'; +import React from 'react'; +import styled from 'styled-components'; +import type { TagProps } from '../bbcode/type'; + +const UnderlineSpan = styled.span` + text-decoration: underline; + text-decoration-style: dotted; +`; + +export const UrlTag: React.FC = React.memo((props) => { + const { node } = props; + const text = node.content.join(''); + const url = node.attrs.url ?? text; + + if (url.startsWith('/')) { + // 内部地址,使用 react-router 进行导航 + return ( + e.stopPropagation()}> + {text} + + ); + } + + if (url.startsWith(window.location.origin)) { + // 内部地址,使用 react-router 进行导航 + return ( + e.stopPropagation()} + > + {text} + + ); + } + + return ( + e.stopPropagation()} + > + {text} + + ); +}); +UrlTag.displayName = 'UrlTag'; diff --git a/client/web/plugins/com.msgbyte.bbcode/src/tags/__all__.ts b/client/web/plugins/com.msgbyte.bbcode/src/tags/__all__.ts new file mode 100644 index 00000000000..c6f3b3dad5b --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/src/tags/__all__.ts @@ -0,0 +1,32 @@ +import { registerBBCodeTag } from '../bbcode/parser'; +import { CodeTag } from './CodeTag'; +import { ImgTag } from './ImgTag'; +import { MentionTag } from './MentionTag'; +import { PlainText } from './PlainText'; +import { UrlTag } from './UrlTag'; +import { EmojiTag } from './EmojiTag'; +import { MarkdownTag } from './MarkdownTag'; +import { BoldTag } from './BoldTag'; +import { ItalicTag } from './ItalicTag'; +import { UnderlinedTag } from './UnderlinedTag'; +import { DeleteTag } from './DeleteTag'; +import { CardTag } from './CardTag'; + +import './styles.less'; + +/** + * Reference: https://en.wikipedia.org/wiki/BBCode + */ +registerBBCodeTag('_text', PlainText); +registerBBCodeTag('b', BoldTag); +registerBBCodeTag('i', ItalicTag); +registerBBCodeTag('u', UnderlinedTag); +registerBBCodeTag('s', DeleteTag); +registerBBCodeTag('url', UrlTag); +registerBBCodeTag('img', ImgTag); +registerBBCodeTag('code', CodeTag); +registerBBCodeTag('at', MentionTag); +registerBBCodeTag('emoji', EmojiTag); +registerBBCodeTag('markdown', MarkdownTag); +registerBBCodeTag('md', MarkdownTag); // alias +registerBBCodeTag('card', CardTag); diff --git a/web/plugins/com.msgbyte.bbcode/src/tags/styles.less b/client/web/plugins/com.msgbyte.bbcode/src/tags/styles.less similarity index 100% rename from web/plugins/com.msgbyte.bbcode/src/tags/styles.less rename to client/web/plugins/com.msgbyte.bbcode/src/tags/styles.less diff --git a/client/web/plugins/com.msgbyte.bbcode/tsconfig.json b/client/web/plugins/com.msgbyte.bbcode/tsconfig.json new file mode 100644 index 00000000000..b6f63a690f3 --- /dev/null +++ b/client/web/plugins/com.msgbyte.bbcode/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/web/plugins/com.msgbyte.bbcode/types/index.d.ts b/client/web/plugins/com.msgbyte.bbcode/types/index.d.ts similarity index 100% rename from web/plugins/com.msgbyte.bbcode/types/index.d.ts rename to client/web/plugins/com.msgbyte.bbcode/types/index.d.ts diff --git a/client/web/plugins/com.msgbyte.biggerfont/manifest.json b/client/web/plugins/com.msgbyte.biggerfont/manifest.json new file mode 100644 index 00000000000..cf9d11180a6 --- /dev/null +++ b/client/web/plugins/com.msgbyte.biggerfont/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Bigger Font Size", + "label.zh-CN": "字号放大", + "name": "com.msgbyte.biggerfont", + "url": "/plugins/com.msgbyte.biggerfont/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add the feature of enlarging the font size to Tailchat, which is convenient for different user", + "description.zh-CN": "为Tailchat增加放大字号的功能,方便不同用户群体", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.biggerfont/package.json b/client/web/plugins/com.msgbyte.biggerfont/package.json new file mode 100644 index 00000000000..836f86cb8b7 --- /dev/null +++ b/client/web/plugins/com.msgbyte.biggerfont/package.json @@ -0,0 +1,19 @@ +{ + "name": "@plugins/com.msgbyte.biggerfont", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "为Tailchat增加放大字号的功能,方便不同用户群体", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": { + "lodash": "^4.17.21" + }, + "devDependencies": { + "@types/lodash": "^4.14.191", + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.biggerfont/src/const.ts b/client/web/plugins/com.msgbyte.biggerfont/src/const.ts new file mode 100644 index 00000000000..bc6ec47712b --- /dev/null +++ b/client/web/plugins/com.msgbyte.biggerfont/src/const.ts @@ -0,0 +1,3 @@ +export const PLUGIN_ID = 'com.msgbyte.biggerfont'; + +export const PLUGIN_CONFIG = `${PLUGIN_ID}.config`; diff --git a/client/web/plugins/com.msgbyte.biggerfont/src/index.tsx b/client/web/plugins/com.msgbyte.biggerfont/src/index.tsx new file mode 100644 index 00000000000..7e44be04dab --- /dev/null +++ b/client/web/plugins/com.msgbyte.biggerfont/src/index.tsx @@ -0,0 +1,49 @@ +import { + regPluginSettings, + getCachedUserSettings, + sharedEvent, +} from '@capital/common'; +import { PLUGIN_CONFIG, PLUGIN_ID } from './const'; +import { Translate } from './translate'; +import _get from 'lodash/get'; + +console.log(`Plugin ${PLUGIN_ID} is loaded`); + +regPluginSettings({ + name: PLUGIN_CONFIG, + label: Translate.name, + position: 'system', + type: 'select', + defaultValue: '', + options: [ + { label: Translate.default, value: '' }, + { label: Translate.md, value: 'md' }, + { label: Translate.lg, value: 'lg' }, + { label: Translate.xl, value: 'xl' }, + ], +}); + +getCachedUserSettings().then((settings) => { + updateFontsize(settings); +}); + +sharedEvent.on('userSettingsUpdate', (settings) => { + updateFontsize(settings); +}); + +function updateFontsize(settings: any) { + const fontSize = _get(settings, PLUGIN_CONFIG); + + if (typeof settings === 'object' && typeof fontSize === 'string') { + if (fontSize === '') { + // 清除字号设置 + document.documentElement.style.fontSize = ''; + } else if (fontSize === 'md') { + document.documentElement.style.fontSize = '18px'; + } else if (fontSize === 'lg') { + document.documentElement.style.fontSize = '20px'; + } else if (fontSize === 'xl') { + document.documentElement.style.fontSize = '22px'; + } + } +} diff --git a/client/web/plugins/com.msgbyte.biggerfont/src/translate.ts b/client/web/plugins/com.msgbyte.biggerfont/src/translate.ts new file mode 100644 index 00000000000..e5baff66b6d --- /dev/null +++ b/client/web/plugins/com.msgbyte.biggerfont/src/translate.ts @@ -0,0 +1,18 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + name: localTrans({ + 'zh-CN': '放大字号', + 'en-US': 'Increase font size', + }), + default: localTrans({ 'zh-CN': '默认', 'en-US': 'Default' }), + md: localTrans({ 'zh-CN': '中号', 'en-US': 'Middle' }), + lg: localTrans({ + 'zh-CN': '大号', + 'en-US': 'Large', + }), + xl: localTrans({ + 'zh-CN': '特大号', + 'en-US': 'Extra Large', + }), +}; diff --git a/client/web/plugins/com.msgbyte.biggerfont/tsconfig.json b/client/web/plugins/com.msgbyte.biggerfont/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.biggerfont/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.biggerfont/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.biggerfont/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.biggerfont/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/client/web/plugins/com.msgbyte.draw/manifest.json b/client/web/plugins/com.msgbyte.draw/manifest.json new file mode 100644 index 00000000000..a105dbbeb4b --- /dev/null +++ b/client/web/plugins/com.msgbyte.draw/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Drawing plugin", + "label.zh-CN": "绘图插件", + "name": "com.msgbyte.draw", + "url": "/plugins/com.msgbyte.draw/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "Allows sending custom drawings", + "description.zh-CN": "允许发送自定义绘图", + "requireRestart": false +} diff --git a/client/web/plugins/com.msgbyte.draw/package.json b/client/web/plugins/com.msgbyte.draw/package.json new file mode 100644 index 00000000000..f82c4d283cf --- /dev/null +++ b/client/web/plugins/com.msgbyte.draw/package.json @@ -0,0 +1,13 @@ +{ + "name": "@plugins/com.msgbyte.draw", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": { + "react-canvas-draw": "^1.2.1" + }, + "devDependencies": { + "@types/react-canvas-draw": "^1.1.1", + "react": "18.2.0" + } +} diff --git a/web/plugins/com.msgbyte.draw/src/DrawModal.tsx b/client/web/plugins/com.msgbyte.draw/src/DrawModal.tsx similarity index 100% rename from web/plugins/com.msgbyte.draw/src/DrawModal.tsx rename to client/web/plugins/com.msgbyte.draw/src/DrawModal.tsx diff --git a/web/plugins/com.msgbyte.draw/src/index.tsx b/client/web/plugins/com.msgbyte.draw/src/index.tsx similarity index 100% rename from web/plugins/com.msgbyte.draw/src/index.tsx rename to client/web/plugins/com.msgbyte.draw/src/index.tsx diff --git a/web/plugins/com.msgbyte.draw/src/translate.ts b/client/web/plugins/com.msgbyte.draw/src/translate.ts similarity index 100% rename from web/plugins/com.msgbyte.draw/src/translate.ts rename to client/web/plugins/com.msgbyte.draw/src/translate.ts diff --git a/client/web/plugins/com.msgbyte.draw/tsconfig.json b/client/web/plugins/com.msgbyte.draw/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.draw/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.env.electron/manifest.json b/client/web/plugins/com.msgbyte.env.electron/manifest.json new file mode 100644 index 00000000000..82427818056 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Electron Support", + "label.zh-CN": "Electron 支持", + "name": "com.msgbyte.env.electron", + "url": "/plugins/com.msgbyte.env.electron/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add support for Electron environment in Tailchat", + "description.zh-CN": "在 Tailchat 添加对 Electron 环境的支持", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.env.electron/package.json b/client/web/plugins/com.msgbyte.env.electron/package.json new file mode 100644 index 00000000000..e66fa3a8b09 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/package.json @@ -0,0 +1,19 @@ +{ + "name": "@plugins/com.msgbyte.env.electron", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Add support for Electron environment in Tailchat", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": { + "semver": "^7.5.4" + }, + "devDependencies": { + "@types/semver": "^7.5.0", + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.env.electron/src/DeviceInfoPanel.tsx b/client/web/plugins/com.msgbyte.env.electron/src/DeviceInfoPanel.tsx new file mode 100644 index 00000000000..3d29f0ee820 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/src/DeviceInfoPanel.tsx @@ -0,0 +1,35 @@ +import { showSuccessToasts } from '@capital/common'; +import { Button } from '@capital/component'; +import React from 'react'; +import { checkUpdate } from './checkUpdate'; +import { Translate } from './translate'; +import { getDeviceInfo } from './utils'; + +export const DeviceInfoPanel: React.FC = React.memo(() => { + const deviceInfo = getDeviceInfo(); + + return ( +
+
+ {Translate.clientName}: {deviceInfo.name} +
+
+ {Translate.clientVersion}: {deviceInfo.version} +
+
+ {Translate.platform}: {deviceInfo.platform} +
+ +
+ ); +}); +DeviceInfoPanel.displayName = 'DeviceInfoPanel'; diff --git a/client/web/plugins/com.msgbyte.env.electron/src/ElectronWebview.tsx b/client/web/plugins/com.msgbyte.env.electron/src/ElectronWebview.tsx new file mode 100644 index 00000000000..433dcb12204 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/src/ElectronWebview.tsx @@ -0,0 +1,121 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { Translate } from './translate'; + +interface ElectronWebviewProps { + className?: string; + src: string; +} +export const ElectronWebview: React.FC = React.memo( + (props) => { + const containerRef = useRef(null); + const [isVisiable, setIsVisiable] = useState(true); + const key = props.src; + const url = props.src; + + useEffect(() => { + if (!containerRef.current) { + return; + } + + const rect = containerRef.current.getBoundingClientRect(); + + (window as any).electron.ipcRenderer.sendMessage('$mount-webview', { + key, + url, + rect: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + }, + }); + + return () => { + (window as any).electron.ipcRenderer.sendMessage('$unmount-webview', { + key, + }); + }; + }, [key, url]); + + useEffect(() => { + if (!containerRef.current) { + return; + } + + const intersectionObserver = new IntersectionObserver( + (entries) => { + entries.forEach((entry: any) => { + if (entry.isVisible === true) { + // 完全可见,显示 + (window as any).electron.ipcRenderer.sendMessage( + '$show-webview', + { + key: key, + } + ); + } else { + (window as any).electron.ipcRenderer.sendMessage( + '$hide-webview', + { + key: key, + } + ); + } + setIsVisiable(entry.isVisible); + }); + }, + { + trackVisibility: true, + delay: 200, + } as any + ); + + const resizeObserver = new ResizeObserver((entries) => { + entries.forEach((entry) => { + const { target } = entry; + if (!target.parentElement) { + return; + } + + const rect = target.getBoundingClientRect(); + + (window as any).electron.ipcRenderer.sendMessage( + '$update-webview-rect', + { + key: key, + rect: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + }, + } + ); + }); + }); + + intersectionObserver.observe(containerRef.current); + resizeObserver.observe(containerRef.current); + + return () => { + if (containerRef.current) { + intersectionObserver.unobserve(containerRef.current); + resizeObserver.unobserve(containerRef.current); + } + }; + }, [key]); + + return ( +
+ {isVisiable === false && ( + {Translate.nativeWebviewRenderHideTip} + )} +
+ ); + } +); +ElectronWebview.displayName = 'ElectronWebview'; diff --git a/client/web/plugins/com.msgbyte.env.electron/src/checkUpdate.tsx b/client/web/plugins/com.msgbyte.env.electron/src/checkUpdate.tsx new file mode 100644 index 00000000000..d24e7c03321 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/src/checkUpdate.tsx @@ -0,0 +1,65 @@ +import { Button, notification } from '@capital/component'; +import React from 'react'; +import { Translate } from './translate'; +import { getDeviceInfo } from './utils'; + +const url = 'https://tailchat.msgbyte.com/downloads/client.json'; + +export async function checkUpdate(): Promise { + const deviceInfo = getDeviceInfo(); + const [semver, config] = await Promise.all([ + import('semver'), + fetch(url).then((res) => res.json()), + ]); + + const version = deviceInfo.version; + const platform = deviceInfo.platform; + const latestConfig = config?.[platform]; + const latestVersion = latestConfig?.version; + const latestUrl = latestConfig?.url; + + if (!latestVersion) { + console.warn('Not found latest version'); + return true; + } + if (!latestUrl) { + console.warn('Not found latest url'); + return true; + } + + if (version === '0.0.0') { + console.warn('Current version not valid'); + return true; + } + + if (semver.gt(latestVersion, version)) { + // 有新版本 + notification.info({ + message: Translate.newVersionTip, + description: ( +
+
{Translate.newVersionDesc}
+
+ {version} -> {latestVersion} +
+
+ ), + btn: ( + + ), + placement: 'topRight', + duration: 0, + }); + + return true; + } + + return false; +} diff --git a/client/web/plugins/com.msgbyte.env.electron/src/index.tsx b/client/web/plugins/com.msgbyte.env.electron/src/index.tsx new file mode 100644 index 00000000000..ba74b186f3c --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/src/index.tsx @@ -0,0 +1,101 @@ +import { + regCustomPanel, + regChatInputButton, + postMessageEvent, + sharedEvent, + regPluginSettings, + getCachedUserSettings, +} from '@capital/common'; +import { Icon } from '@capital/component'; +import React from 'react'; +import { DeviceInfoPanel } from './DeviceInfoPanel'; +import { Translate } from './translate'; +import { forwardSharedEvent } from './utils'; +import { checkUpdate } from './checkUpdate'; +import { setWebviewKernel, resetWebviewKernel } from '@capital/common'; +import { ElectronWebview } from './ElectronWebview'; +import './overwrite.css'; + +const PLUGIN_NAME = 'Electron Support'; +const WEBVIEW_CONFIG = 'electron:nativeWebviewRender'; + +console.log(`Plugin ${PLUGIN_NAME} is loaded`); + +regCustomPanel({ + position: 'setting', + icon: '', + name: 'com.msgbyte.env.electron/deviceInfoPanel', + label: Translate.deviceInfo, + render: DeviceInfoPanel, +}); + +regChatInputButton({ + render: () => { + return ( + { + postMessageEvent('callScreenshotsTool'); + }} + /> + ); + }, +}); + +regPluginSettings({ + position: 'system', + type: 'boolean', + name: WEBVIEW_CONFIG, + label: Translate.nativeWebviewRender, + desc: Translate.nativeWebviewRenderDesc, +}); + +forwardSharedEvent('receiveUnmutedMessage'); + +setTimeout(() => { + checkUpdate(); +}, 1000); + +let changedWithElectron = false; + +const checkSettingConfig = (settings: Record) => { + if (settings[WEBVIEW_CONFIG] === true) { + setWebviewKernel(() => ElectronWebview); + changedWithElectron = true; + } else if (changedWithElectron === true) { + // 如果关闭了配置且仅当之前用electron设置了webview,则重置 + resetWebviewKernel(); + } +}; + +sharedEvent.on('loginSuccess', () => { + getCachedUserSettings().then((settings) => { + checkSettingConfig(settings); + }); +}); + +sharedEvent.on('userSettingsUpdate', (settings) => { + checkSettingConfig(settings); +}); + +navigator.mediaDevices.getDisplayMedia = async ( + options: DisplayMediaStreamOptions +) => { + const source = await ( + window as any + ).electron.ipcRenderer.getDesktopCapturerSource(); + + const stream = await window.navigator.mediaDevices.getUserMedia({ + // audio: options.audio, + video: { + mandatory: { + chromeMediaSource: 'desktop', + chromeMediaSourceId: source.id, + }, + } as any, + }); + + return stream; +}; diff --git a/client/web/plugins/com.msgbyte.env.electron/src/overwrite.css b/client/web/plugins/com.msgbyte.env.electron/src/overwrite.css new file mode 100644 index 00000000000..de632ec7af0 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/src/overwrite.css @@ -0,0 +1,3 @@ +.ant-dropdown-menu { + box-shadow: none; /* avoid group detail dropdown's shadow will make dom invisiable */ +} diff --git a/client/web/plugins/com.msgbyte.env.electron/src/translate.ts b/client/web/plugins/com.msgbyte.env.electron/src/translate.ts new file mode 100644 index 00000000000..e7c987e2468 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/src/translate.ts @@ -0,0 +1,53 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + deviceInfo: localTrans({ + 'zh-CN': '设备信息', + 'en-US': 'Device Info', + }), + clientName: localTrans({ + 'zh-CN': '客户端名称', + 'en-US': 'Client Name', + }), + clientVersion: localTrans({ + 'zh-CN': '客户端版本号', + 'en-US': 'Client Version', + }), + platform: localTrans({ + 'zh-CN': '平台', + 'en-US': 'Platform', + }), + newVersionTip: localTrans({ + 'zh-CN': '新版本提示', + 'en-US': 'New Version Upgrade Tip', + }), + newVersionDesc: localTrans({ + 'zh-CN': '发现有新的版本可以安装', + 'en-US': 'A new version was found to be installed', + }), + upgradeNow: localTrans({ + 'zh-CN': '立即更新', + 'en-US': 'Upgrade Now', + }), + checkVersion: localTrans({ + 'zh-CN': '检查更新', + 'en-US': 'Check for updates', + }), + isLatest: localTrans({ + 'zh-CN': '已经是最新版', + 'en-US': 'Already the latest version', + }), + nativeWebviewRender: localTrans({ + 'zh-CN': '启用原生浏览器内核渲染', + 'en-US': 'Use Native Webview Render', + }), + nativeWebviewRenderDesc: localTrans({ + 'zh-CN': '解除默认网页访问限制,允许在Tailchat嵌入任意网站内容', + 'en-US': + 'Lift default web page access restrictions and allow any website content to be embedded in Tailchat', + }), + nativeWebviewRenderHideTip: localTrans({ + 'zh-CN': '组件被遮挡,暂时隐藏网页视图', + 'en-US': 'The component is obscured, temporarily hiding the web view', + }), +}; diff --git a/client/web/plugins/com.msgbyte.env.electron/src/utils.ts b/client/web/plugins/com.msgbyte.env.electron/src/utils.ts new file mode 100644 index 00000000000..ad5dd4d153f --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/src/utils.ts @@ -0,0 +1,41 @@ +import { sharedEvent, postMessageEvent } from '@capital/common'; + +/** + * 转发事件 + */ +export function forwardSharedEvent( + eventName: string, + processPayload?: (payload: any) => Promise<{ type: string; payload: any }> +) { + sharedEvent.on(eventName as any, async (payload: any) => { + let type = eventName; + if (processPayload) { + const res = await processPayload(payload); + if (!res) { + // Skip if res is undefined + return; + } + + payload = res.payload; + type = res.type; + } + + postMessageEvent(type, payload); + }); +} + +interface ElectronDeviceInfo { + name: string; + version: string; + platform: string; +} +export function getDeviceInfo() { + const deviceInfo: ElectronDeviceInfo = { + name: '', + version: '0.0.0', + platform: 'windows', + ...((window as any).__electronDeviceInfo ?? {}), + }; + + return deviceInfo; +} diff --git a/client/web/plugins/com.msgbyte.env.electron/tsconfig.json b/client/web/plugins/com.msgbyte.env.electron/tsconfig.json new file mode 100644 index 00000000000..efb75ed0339 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.electron/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.env.rn/manifest.json b/client/web/plugins/com.msgbyte.env.rn/manifest.json new file mode 100644 index 00000000000..f764e779b9d --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.rn/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "React Native Support", + "label.zh-CN": "ReactNative 支持", + "name": "com.msgbyte.env.rn", + "url": "/plugins/com.msgbyte.env.rn/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add support for ReactNative environment in Tailchat", + "description.zh-CN": "在 Tailchat 添加对 ReactNative 环境的支持", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.env.rn/package.json b/client/web/plugins/com.msgbyte.env.rn/package.json new file mode 100644 index 00000000000..172cc245edf --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.rn/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/com.msgbyte.env.rn", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Add support for ReactNative environment in Tailchat", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.env.rn/src/DeviceInfoPanel.tsx b/client/web/plugins/com.msgbyte.env.rn/src/DeviceInfoPanel.tsx new file mode 100644 index 00000000000..bdf6240be3d --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.rn/src/DeviceInfoPanel.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Translate } from './translate'; + +interface WindowRnDeviceInfo { + version: string; + readableVersion: string; +} + +export const DeviceInfoPanel: React.FC = React.memo(() => { + const deviceInfo: WindowRnDeviceInfo = (window as any).__rnDeviceInfo ?? {}; + return ( +
+
+ {Translate.clientVersion}: {deviceInfo.version}( + {deviceInfo.readableVersion}) +
+
+ ); +}); +DeviceInfoPanel.displayName = 'DeviceInfoPanel'; diff --git a/client/web/plugins/com.msgbyte.env.rn/src/index.tsx b/client/web/plugins/com.msgbyte.env.rn/src/index.tsx new file mode 100644 index 00000000000..fa08a133062 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.rn/src/index.tsx @@ -0,0 +1,77 @@ +import { + getGlobalState, + getCachedUserInfo, + getCachedBaseGroupInfo, + getMessageTextDecorators, + getServiceUrl, + regCustomPanel, +} from '@capital/common'; +import { DeviceInfoPanel } from './DeviceInfoPanel'; +import { Translate } from './translate'; +import { forwardSharedEvent } from './utils'; + +const PLUGIN_NAME = 'ReactNative Support'; + +console.log(`Plugin ${PLUGIN_NAME} is loaded`); + +regCustomPanel({ + position: 'setting', + icon: '', + name: 'com.msgbyte.env.rn/deviceInfoPanel', + label: Translate.deviceInfo, + render: DeviceInfoPanel, +}); + +forwardSharedEvent('loadColorScheme'); +forwardSharedEvent('ensureWebRTCPermission'); +forwardSharedEvent('loginSuccess', async (payload) => { + let token = window.localStorage.getItem('jsonwebtoken'); + try { + token = JSON.parse(token).rawData; + } catch (e) {} + + if (typeof token !== 'string') { + console.error('Cannot get token:', token); + return; + } + + return { + type: 'bindWebsocket', + payload: { + url: getServiceUrl(), + token, + userInfo: payload, + }, + }; +}); +forwardSharedEvent('receiveUnmutedMessage', async (payload) => { + const message = payload; + const currentUserId = getGlobalState()?.user.info._id; + + if (currentUserId === message.author) { + // 忽略本人消息 + return; + } + + const [userInfo, scopeName] = await Promise.all([ + getCachedUserInfo(message.author), + message.groupId + ? getCachedBaseGroupInfo(message.groupId).then((d) => d.name) + : Promise.resolve(Translate.dm), + ]); + const nickname = userInfo?.nickname ?? ''; + const icon = userInfo?.avatar ?? undefined; + const content = message.content; + + const title = `${Translate.from} [${scopeName}] ${nickname}`; + const body = getMessageTextDecorators().serialize(content); + + return { + type: 'showNotification', + payload: { + title, + body, + icon, + }, + }; +}); diff --git a/client/web/plugins/com.msgbyte.env.rn/src/translate.ts b/client/web/plugins/com.msgbyte.env.rn/src/translate.ts new file mode 100644 index 00000000000..e0eb977ed04 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.rn/src/translate.ts @@ -0,0 +1,20 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + from: localTrans({ + 'zh-CN': '来自', + 'en-US': 'From', + }), + dm: localTrans({ + 'zh-CN': '私信', + 'en-US': 'DM', + }), + deviceInfo: localTrans({ + 'zh-CN': '设备信息', + 'en-US': 'Device Info', + }), + clientVersion: localTrans({ + 'zh-CN': '客户端版本号', + 'en-US': 'Client Version', + }), +}; diff --git a/client/web/plugins/com.msgbyte.env.rn/src/utils.ts b/client/web/plugins/com.msgbyte.env.rn/src/utils.ts new file mode 100644 index 00000000000..da078dccdcb --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.rn/src/utils.ts @@ -0,0 +1,35 @@ +import { sharedEvent } from '@capital/common'; + +/** + * 转发事件 + */ +export function forwardSharedEvent( + eventName: string, + processPayload?: (payload: any) => Promise<{ type: string; payload: any }> +) { + if (!(window as any).ReactNativeWebView) { + return; + } + + sharedEvent.on(eventName, async (payload: any) => { + let type = eventName; + if (processPayload) { + const res = await processPayload(payload); + if (!res) { + // Skip if res is undefined + return; + } + + payload = res.payload; + type = res.type; + } + + (window as any).ReactNativeWebView.postMessage( + JSON.stringify({ + _isTailchat: true, + type, + payload, + }) + ); + }); +} diff --git a/client/web/plugins/com.msgbyte.env.rn/tsconfig.json b/client/web/plugins/com.msgbyte.env.rn/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.rn/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.env.rn/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.env.rn/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.env.rn/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/client/web/plugins/com.msgbyte.filepizza/assets/icon.png b/client/web/plugins/com.msgbyte.filepizza/assets/icon.png new file mode 100644 index 00000000000..629045908e6 Binary files /dev/null and b/client/web/plugins/com.msgbyte.filepizza/assets/icon.png differ diff --git a/client/web/plugins/com.msgbyte.filepizza/manifest.json b/client/web/plugins/com.msgbyte.filepizza/manifest.json new file mode 100644 index 00000000000..abaae43970b --- /dev/null +++ b/client/web/plugins/com.msgbyte.filepizza/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "file.pizza", + "label.zh-CN": "file.pizza", + "name": "com.msgbyte.filepizza", + "url": "/plugins/com.msgbyte.filepizza/index.js", + "icon": "/plugins/com.msgbyte.filepizza/assets/icon.png", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Quickly open filepizza in the chat input box to support p2p file transfer", + "description.zh-CN": "在聊天输入框快捷打开 filepizza 以支持p2p传输文件", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.filepizza/package.json b/client/web/plugins/com.msgbyte.filepizza/package.json new file mode 100644 index 00000000000..45f08d59685 --- /dev/null +++ b/client/web/plugins/com.msgbyte.filepizza/package.json @@ -0,0 +1,14 @@ +{ + "name": "@plugins/com.msgbyte.filepizza", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "在聊天输入框快捷打开filepizza以支持p2p传输文件", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "react": "18.2.0" + } +} diff --git a/client/web/plugins/com.msgbyte.filepizza/src/index.tsx b/client/web/plugins/com.msgbyte.filepizza/src/index.tsx new file mode 100644 index 00000000000..c2542cf27d3 --- /dev/null +++ b/client/web/plugins/com.msgbyte.filepizza/src/index.tsx @@ -0,0 +1,35 @@ +import { regChatInputAction } from '@capital/common'; + +regChatInputAction({ + label: 'File Pizza', + onClick: () => { + const width = 414; + const height = 736; + const top = (window.screen.height - height) / 2; + const left = (window.screen.width - width) / 2; + + window.open( + 'https://file.pizza/', + 'filepizza', + buildWindowFeatures({ + top, + left, + width, + height, + menubar: false, + toolbar: false, + location: false, + status: false, + resizable: true, + }) + ); + }, +}); + +function buildWindowFeatures( + options: Record +): string { + return Object.entries(options) + .map(([key, val]) => `${key}=${val}`) + .join(','); +} diff --git a/client/web/plugins/com.msgbyte.filepizza/tsconfig.json b/client/web/plugins/com.msgbyte.filepizza/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.filepizza/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.filepizza/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.filepizza/types/tailchat.d.ts new file mode 100644 index 00000000000..8fbeaea475e --- /dev/null +++ b/client/web/plugins/com.msgbyte.filepizza/types/tailchat.d.ts @@ -0,0 +1,326 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/// + +/** + * 该文件由 Tailchat 自动生成 + * 用于插件的类型声明 + * 生成命令: pnpm run plugins:declaration:generate + */ + +/** + * Tailchat 通用 + */ +declare module '@capital/common' { + export const useGroupPanelParams: any; + + /** + * 打开模态框 + */ + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loadable: any; + + export const getGlobalState: any; + + export const getJWTUserInfo: () => Promise<{ + _id?: string; + nickname?: string; + email?: string; + avatar?: string; + }>; + + export const dataUrlToFile: any; + + export const urlSearchStringify: any; + + export const urlSearchParse: any; + + export const appendUrlSearch: any; + + export const getServiceWorkerRegistration: any; + + export const getServiceUrl: () => string; + + export const getCachedUserInfo: ( + userId: string, + refetch?: boolean + ) => Promise<{ + _id: string; + email: string; + nickname: string; + discriminator: string; + avatar: string | null; + temporary: boolean; + }>; + + export const getCachedConverseInfo: any; + + /** + * 本地翻译 + * @example + * localTrans({'zh-CN': '你好', 'en-US': 'Hello'}); + * + * @param trans 翻译对象 + */ + export const localTrans: (trans: Record<'zh-CN' | 'en-US', string>) => string; + + export const getLanguage: any; + + export const sharedEvent: any; + + export const useAsync: any; + + export const useAsyncFn: any; + + export const useAsyncRefresh: any; + + export const useAsyncRequest: any; + + export const uploadFile: any; + + export const showToasts: any; + + export const showErrorToasts: any; + + export const fetchAvailableServices: any; + + export const isValidStr: any; + + export const useGroupPanelInfo: any; + + export const sendMessage: any; + + export const useLocation: any; + + export const useNavigate: any; + + export const createFastFormSchema: any; + + export const fieldSchema: any; + + export const useCurrentUserInfo: any; + + export const createPluginRequest: (pluginName: string) => { + get: (actionName: string, config?: any) => Promise; + post: (actionName: string, data?: any, config?: any) => Promise; + }; + + export const postRequest: any; + + export const pluginCustomPanel: any; + + export const regCustomPanel: any; + + export const pluginGroupPanel: any; + + export const regGroupPanel: any; + + export const messageInterpreter: any; + + export const regMessageInterpreter: any; + + export const getMessageRender: any; + + export const regMessageRender: any; + + export const getMessageTextDecorators: any; + + export const regMessageTextDecorators: any; + + export const ChatInputActionContextProps: any; + + export const pluginChatInputActions: any; + + export const regChatInputAction: any; + + export const regSocketEventListener: (item: { + eventName: string; + eventFn: (...args: any[]) => void; + }) => void; + + export const pluginColorScheme: any; + + export const regPluginColorScheme: any; + + export const pluginInspectServices: any; + + export const regInspectService: any; + + export const pluginMessageExtraParsers: any; + + export const regMessageExtraParser: any; + + export const pluginRootRoute: any; + + export const regPluginRootRoute: any; + + export const pluginPanelActions: any; + + export const regPluginPanelAction: any; + + export const pluginPermission: any; + + export const regPluginPermission: (permission: { + /** + * 权限唯一key, 用于写入数据库 + * 如果为插件则权限点应当符合命名规范, 如: plugin.com.msgbyte.github.manage + */ + key: string; + /** + * 权限点显示名称 + */ + title: string; + /** + * 权限描述 + */ + desc: string; + /** + * 是否默认开启 + */ + default: boolean; + /** + * 是否依赖其他权限点 + */ + required?: string[]; + }) => void; + + export const useGroupIdContext: () => string; + + export const useGroupPanelContext: () => { + groupId: string; + panelId: string; + } | null; + + export const useSocketContext: any; +} + +/** + * Tailchat 组件 + */ +declare module '@capital/component' { + export const Button: any; + + export const Checkbox: any; + + export const Input: any; + + export const Divider: any; + + export const Space: any; + + export const Menu: any; + + export const Table: any; + + export const Switch: any; + + export const Tooltip: any; + + /** + * @link https://ant.design/components/notification-cn/ + */ + export const notification: any; + + export const Empty: any; + + export const Avatar: any; + + export const SensitiveText: React.FC<{ className?: string; text: string }>; + + export const TextArea: any; + + export const Image: any; + + export const Icon: React.FC<{ icon: string } & React.SVGProps>; + + export const IconBtn: React.FC<{ + icon: string; + iconClassName?: string; + shape?: 'circle' | 'square'; + title?: string; + }>; + + export const PillTabs: any; + + export const PillTabPane: any; + + export const LoadingSpinner: any; + + export const WebFastForm: any; + + export const WebMetaForm: any; + + export const createMetaFormSchema: any; + + export const metaFormFieldSchema: any; + + export const FullModalField: any; + + export const DefaultFullModalInputEditorRender: any; + + export const DefaultFullModalTextAreaEditorRender: any; + + export const openModal: any; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loading: any; + + export const SidebarView: any; + + export const GroupPanelSelector: any; + + export const Emoji: any; + + export const PortalAdd: any; + + export const PortalRemove: any; + + export const ErrorBoundary: any; + + export const UserName: React.FC<{ + userId: string; + className?: string; + }>; + + export const Markdown: any; +} diff --git a/client/web/plugins/com.msgbyte.filesend/manifest.json b/client/web/plugins/com.msgbyte.filesend/manifest.json new file mode 100644 index 00000000000..bfc8eb4be45 --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesend/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "filesend", + "label.zh-CN": "filesend", + "name": "com.msgbyte.filesend", + "url": "/plugins/com.msgbyte.filesend/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Quickly open Filesend in the chat input box to support file transfer", + "description.zh-CN": "在聊天输入框快捷打开 Filesend 以支持传输文件", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.filesend/package.json b/client/web/plugins/com.msgbyte.filesend/package.json new file mode 100644 index 00000000000..a7950569523 --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesend/package.json @@ -0,0 +1,14 @@ +{ + "name": "@plugins/com.msgbyte.filesend", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "在聊天输入框快捷打开 filesend 以支持传输文件", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "react": "18.2.0" + } +} diff --git a/client/web/plugins/com.msgbyte.filesend/src/index.tsx b/client/web/plugins/com.msgbyte.filesend/src/index.tsx new file mode 100644 index 00000000000..92de24d6d44 --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesend/src/index.tsx @@ -0,0 +1,35 @@ +import { regChatInputAction } from '@capital/common'; + +regChatInputAction({ + label: 'FileSend', + onClick: () => { + const width = 414; + const height = 736; + const top = (window.screen.height - height) / 2; + const left = (window.screen.width - width) / 2; + + window.open( + 'https://filesend.standardnotes.com/', + 'FileSend', + buildWindowFeatures({ + top, + left, + width, + height, + menubar: false, + toolbar: false, + location: false, + status: false, + resizable: true, + }) + ); + }, +}); + +function buildWindowFeatures( + options: Record +): string { + return Object.entries(options) + .map(([key, val]) => `${key}=${val}`) + .join(','); +} diff --git a/client/web/plugins/com.msgbyte.filesend/tsconfig.json b/client/web/plugins/com.msgbyte.filesend/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesend/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.filesend/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.filesend/types/tailchat.d.ts new file mode 100644 index 00000000000..8fbeaea475e --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesend/types/tailchat.d.ts @@ -0,0 +1,326 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/// + +/** + * 该文件由 Tailchat 自动生成 + * 用于插件的类型声明 + * 生成命令: pnpm run plugins:declaration:generate + */ + +/** + * Tailchat 通用 + */ +declare module '@capital/common' { + export const useGroupPanelParams: any; + + /** + * 打开模态框 + */ + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loadable: any; + + export const getGlobalState: any; + + export const getJWTUserInfo: () => Promise<{ + _id?: string; + nickname?: string; + email?: string; + avatar?: string; + }>; + + export const dataUrlToFile: any; + + export const urlSearchStringify: any; + + export const urlSearchParse: any; + + export const appendUrlSearch: any; + + export const getServiceWorkerRegistration: any; + + export const getServiceUrl: () => string; + + export const getCachedUserInfo: ( + userId: string, + refetch?: boolean + ) => Promise<{ + _id: string; + email: string; + nickname: string; + discriminator: string; + avatar: string | null; + temporary: boolean; + }>; + + export const getCachedConverseInfo: any; + + /** + * 本地翻译 + * @example + * localTrans({'zh-CN': '你好', 'en-US': 'Hello'}); + * + * @param trans 翻译对象 + */ + export const localTrans: (trans: Record<'zh-CN' | 'en-US', string>) => string; + + export const getLanguage: any; + + export const sharedEvent: any; + + export const useAsync: any; + + export const useAsyncFn: any; + + export const useAsyncRefresh: any; + + export const useAsyncRequest: any; + + export const uploadFile: any; + + export const showToasts: any; + + export const showErrorToasts: any; + + export const fetchAvailableServices: any; + + export const isValidStr: any; + + export const useGroupPanelInfo: any; + + export const sendMessage: any; + + export const useLocation: any; + + export const useNavigate: any; + + export const createFastFormSchema: any; + + export const fieldSchema: any; + + export const useCurrentUserInfo: any; + + export const createPluginRequest: (pluginName: string) => { + get: (actionName: string, config?: any) => Promise; + post: (actionName: string, data?: any, config?: any) => Promise; + }; + + export const postRequest: any; + + export const pluginCustomPanel: any; + + export const regCustomPanel: any; + + export const pluginGroupPanel: any; + + export const regGroupPanel: any; + + export const messageInterpreter: any; + + export const regMessageInterpreter: any; + + export const getMessageRender: any; + + export const regMessageRender: any; + + export const getMessageTextDecorators: any; + + export const regMessageTextDecorators: any; + + export const ChatInputActionContextProps: any; + + export const pluginChatInputActions: any; + + export const regChatInputAction: any; + + export const regSocketEventListener: (item: { + eventName: string; + eventFn: (...args: any[]) => void; + }) => void; + + export const pluginColorScheme: any; + + export const regPluginColorScheme: any; + + export const pluginInspectServices: any; + + export const regInspectService: any; + + export const pluginMessageExtraParsers: any; + + export const regMessageExtraParser: any; + + export const pluginRootRoute: any; + + export const regPluginRootRoute: any; + + export const pluginPanelActions: any; + + export const regPluginPanelAction: any; + + export const pluginPermission: any; + + export const regPluginPermission: (permission: { + /** + * 权限唯一key, 用于写入数据库 + * 如果为插件则权限点应当符合命名规范, 如: plugin.com.msgbyte.github.manage + */ + key: string; + /** + * 权限点显示名称 + */ + title: string; + /** + * 权限描述 + */ + desc: string; + /** + * 是否默认开启 + */ + default: boolean; + /** + * 是否依赖其他权限点 + */ + required?: string[]; + }) => void; + + export const useGroupIdContext: () => string; + + export const useGroupPanelContext: () => { + groupId: string; + panelId: string; + } | null; + + export const useSocketContext: any; +} + +/** + * Tailchat 组件 + */ +declare module '@capital/component' { + export const Button: any; + + export const Checkbox: any; + + export const Input: any; + + export const Divider: any; + + export const Space: any; + + export const Menu: any; + + export const Table: any; + + export const Switch: any; + + export const Tooltip: any; + + /** + * @link https://ant.design/components/notification-cn/ + */ + export const notification: any; + + export const Empty: any; + + export const Avatar: any; + + export const SensitiveText: React.FC<{ className?: string; text: string }>; + + export const TextArea: any; + + export const Image: any; + + export const Icon: React.FC<{ icon: string } & React.SVGProps>; + + export const IconBtn: React.FC<{ + icon: string; + iconClassName?: string; + shape?: 'circle' | 'square'; + title?: string; + }>; + + export const PillTabs: any; + + export const PillTabPane: any; + + export const LoadingSpinner: any; + + export const WebFastForm: any; + + export const WebMetaForm: any; + + export const createMetaFormSchema: any; + + export const metaFormFieldSchema: any; + + export const FullModalField: any; + + export const DefaultFullModalInputEditorRender: any; + + export const DefaultFullModalTextAreaEditorRender: any; + + export const openModal: any; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loading: any; + + export const SidebarView: any; + + export const GroupPanelSelector: any; + + export const Emoji: any; + + export const PortalAdd: any; + + export const PortalRemove: any; + + export const ErrorBoundary: any; + + export const UserName: React.FC<{ + userId: string; + className?: string; + }>; + + export const Markdown: any; +} diff --git a/client/web/plugins/com.msgbyte.filesfm/assets/icon.png b/client/web/plugins/com.msgbyte.filesfm/assets/icon.png new file mode 100644 index 00000000000..23298e92806 Binary files /dev/null and b/client/web/plugins/com.msgbyte.filesfm/assets/icon.png differ diff --git a/client/web/plugins/com.msgbyte.filesfm/manifest.json b/client/web/plugins/com.msgbyte.filesfm/manifest.json new file mode 100644 index 00000000000..87b1cfe7a1d --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesfm/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "files.fm", + "label.zh-CN": "files.fm", + "name": "com.msgbyte.filesfm", + "url": "/plugins/com.msgbyte.filesfm/index.js", + "icon": "/plugins/com.msgbyte.filesfm/assets/icon.png", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Quickly open files.fm in the chat input box to support file transfer", + "description.zh-CN": "在聊天输入框快捷打开 files.fm 以支持传输文件", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.filesfm/package.json b/client/web/plugins/com.msgbyte.filesfm/package.json new file mode 100644 index 00000000000..e0dae9154ba --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesfm/package.json @@ -0,0 +1,14 @@ +{ + "name": "@plugins/com.msgbyte.filesfm", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "在聊天输入框快捷打开 files.fm 以支持传输文件", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "react": "18.2.0" + } +} diff --git a/client/web/plugins/com.msgbyte.filesfm/src/index.tsx b/client/web/plugins/com.msgbyte.filesfm/src/index.tsx new file mode 100644 index 00000000000..f7c7a28692b --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesfm/src/index.tsx @@ -0,0 +1,35 @@ +import { regChatInputAction } from '@capital/common'; + +regChatInputAction({ + label: 'files.fm', + onClick: () => { + const width = 414; + const height = 736; + const top = (window.screen.height - height) / 2; + const left = (window.screen.width - width) / 2; + + window.open( + 'https://files.fm/', + 'files.fm', + buildWindowFeatures({ + top, + left, + width, + height, + menubar: false, + toolbar: false, + location: false, + status: false, + resizable: true, + }) + ); + }, +}); + +function buildWindowFeatures( + options: Record +): string { + return Object.entries(options) + .map(([key, val]) => `${key}=${val}`) + .join(','); +} diff --git a/client/web/plugins/com.msgbyte.filesfm/tsconfig.json b/client/web/plugins/com.msgbyte.filesfm/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesfm/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.filesfm/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.filesfm/types/tailchat.d.ts new file mode 100644 index 00000000000..8fbeaea475e --- /dev/null +++ b/client/web/plugins/com.msgbyte.filesfm/types/tailchat.d.ts @@ -0,0 +1,326 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/// + +/** + * 该文件由 Tailchat 自动生成 + * 用于插件的类型声明 + * 生成命令: pnpm run plugins:declaration:generate + */ + +/** + * Tailchat 通用 + */ +declare module '@capital/common' { + export const useGroupPanelParams: any; + + /** + * 打开模态框 + */ + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loadable: any; + + export const getGlobalState: any; + + export const getJWTUserInfo: () => Promise<{ + _id?: string; + nickname?: string; + email?: string; + avatar?: string; + }>; + + export const dataUrlToFile: any; + + export const urlSearchStringify: any; + + export const urlSearchParse: any; + + export const appendUrlSearch: any; + + export const getServiceWorkerRegistration: any; + + export const getServiceUrl: () => string; + + export const getCachedUserInfo: ( + userId: string, + refetch?: boolean + ) => Promise<{ + _id: string; + email: string; + nickname: string; + discriminator: string; + avatar: string | null; + temporary: boolean; + }>; + + export const getCachedConverseInfo: any; + + /** + * 本地翻译 + * @example + * localTrans({'zh-CN': '你好', 'en-US': 'Hello'}); + * + * @param trans 翻译对象 + */ + export const localTrans: (trans: Record<'zh-CN' | 'en-US', string>) => string; + + export const getLanguage: any; + + export const sharedEvent: any; + + export const useAsync: any; + + export const useAsyncFn: any; + + export const useAsyncRefresh: any; + + export const useAsyncRequest: any; + + export const uploadFile: any; + + export const showToasts: any; + + export const showErrorToasts: any; + + export const fetchAvailableServices: any; + + export const isValidStr: any; + + export const useGroupPanelInfo: any; + + export const sendMessage: any; + + export const useLocation: any; + + export const useNavigate: any; + + export const createFastFormSchema: any; + + export const fieldSchema: any; + + export const useCurrentUserInfo: any; + + export const createPluginRequest: (pluginName: string) => { + get: (actionName: string, config?: any) => Promise; + post: (actionName: string, data?: any, config?: any) => Promise; + }; + + export const postRequest: any; + + export const pluginCustomPanel: any; + + export const regCustomPanel: any; + + export const pluginGroupPanel: any; + + export const regGroupPanel: any; + + export const messageInterpreter: any; + + export const regMessageInterpreter: any; + + export const getMessageRender: any; + + export const regMessageRender: any; + + export const getMessageTextDecorators: any; + + export const regMessageTextDecorators: any; + + export const ChatInputActionContextProps: any; + + export const pluginChatInputActions: any; + + export const regChatInputAction: any; + + export const regSocketEventListener: (item: { + eventName: string; + eventFn: (...args: any[]) => void; + }) => void; + + export const pluginColorScheme: any; + + export const regPluginColorScheme: any; + + export const pluginInspectServices: any; + + export const regInspectService: any; + + export const pluginMessageExtraParsers: any; + + export const regMessageExtraParser: any; + + export const pluginRootRoute: any; + + export const regPluginRootRoute: any; + + export const pluginPanelActions: any; + + export const regPluginPanelAction: any; + + export const pluginPermission: any; + + export const regPluginPermission: (permission: { + /** + * 权限唯一key, 用于写入数据库 + * 如果为插件则权限点应当符合命名规范, 如: plugin.com.msgbyte.github.manage + */ + key: string; + /** + * 权限点显示名称 + */ + title: string; + /** + * 权限描述 + */ + desc: string; + /** + * 是否默认开启 + */ + default: boolean; + /** + * 是否依赖其他权限点 + */ + required?: string[]; + }) => void; + + export const useGroupIdContext: () => string; + + export const useGroupPanelContext: () => { + groupId: string; + panelId: string; + } | null; + + export const useSocketContext: any; +} + +/** + * Tailchat 组件 + */ +declare module '@capital/component' { + export const Button: any; + + export const Checkbox: any; + + export const Input: any; + + export const Divider: any; + + export const Space: any; + + export const Menu: any; + + export const Table: any; + + export const Switch: any; + + export const Tooltip: any; + + /** + * @link https://ant.design/components/notification-cn/ + */ + export const notification: any; + + export const Empty: any; + + export const Avatar: any; + + export const SensitiveText: React.FC<{ className?: string; text: string }>; + + export const TextArea: any; + + export const Image: any; + + export const Icon: React.FC<{ icon: string } & React.SVGProps>; + + export const IconBtn: React.FC<{ + icon: string; + iconClassName?: string; + shape?: 'circle' | 'square'; + title?: string; + }>; + + export const PillTabs: any; + + export const PillTabPane: any; + + export const LoadingSpinner: any; + + export const WebFastForm: any; + + export const WebMetaForm: any; + + export const createMetaFormSchema: any; + + export const metaFormFieldSchema: any; + + export const FullModalField: any; + + export const DefaultFullModalInputEditorRender: any; + + export const DefaultFullModalTextAreaEditorRender: any; + + export const openModal: any; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loading: any; + + export const SidebarView: any; + + export const GroupPanelSelector: any; + + export const Emoji: any; + + export const PortalAdd: any; + + export const PortalRemove: any; + + export const ErrorBoundary: any; + + export const UserName: React.FC<{ + userId: string; + className?: string; + }>; + + export const Markdown: any; +} diff --git a/web/plugins/com.msgbyte.theme.genshin/assets/icon.jpg b/client/web/plugins/com.msgbyte.genshin/assets/icon.jpg similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/assets/icon.jpg rename to client/web/plugins/com.msgbyte.genshin/assets/icon.jpg diff --git a/client/web/plugins/com.msgbyte.genshin/manifest.json b/client/web/plugins/com.msgbyte.genshin/manifest.json new file mode 100644 index 00000000000..537277f484d --- /dev/null +++ b/client/web/plugins/com.msgbyte.genshin/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "Genshin Toolbox", + "label.zh-CN": "原神工具箱", + "name": "com.msgbyte.genshin", + "url": "/plugins/com.msgbyte.genshin/index.js", + "icon": "/plugins/com.msgbyte.genshin/assets/icon.jpg", + "version": "0.0.0", + "author": "msgbyte", + "description": "Add Genshin-related entertainment capabilities to Tailchat", + "description.zh-CN": "为Tailchat增加原神相关的娱乐能力", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.genshin/package.json b/client/web/plugins/com.msgbyte.genshin/package.json new file mode 100644 index 00000000000..7fcf2631072 --- /dev/null +++ b/client/web/plugins/com.msgbyte.genshin/package.json @@ -0,0 +1,13 @@ +{ + "name": "@plugins/com.msgbyte.genshin", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": { + "genshin-gacha-kit": "^1.1.0", + "html-react-parser": "^1.4.5" + }, + "devDependencies": { + "react": "18.2.0" + } +} diff --git a/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/GachaPoolItem.tsx b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/GachaPoolItem.tsx new file mode 100644 index 00000000000..4c31de2be17 --- /dev/null +++ b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/GachaPoolItem.tsx @@ -0,0 +1,36 @@ +import { OfficialGachaPoolItem } from 'genshin-gacha-kit'; +import React from 'react'; +import styled from 'styled-components'; + +const ItemRoot = styled.div` + position: relative; + + .text { + position: absolute; + bottom: 0; + color: #444; + font-size: 24px; + width: 100%; + text-align: center; + font-weight: bold; + line-height: 44px; + text-wrap: nowrap; + } +`; + +export const GachaPoolItem: React.FC<{ + items: OfficialGachaPoolItem[]; +}> = React.memo((props) => { + return ( +
+ {props.items.map((i) => ( + + + +
{i.item_name}
+
+ ))} +
+ ); +}); +GachaPoolItem.displayName = 'GachaPoolItem'; diff --git a/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/GachaResult.tsx b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/GachaResult.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/GachaResult.tsx rename to client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/GachaResult.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/WishResultModal.tsx b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/WishResultModal.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/WishResultModal.tsx rename to client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/WishResultModal.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/WishResultText.tsx b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/WishResultText.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/WishResultText.tsx rename to client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/WishResultText.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/index.tsx b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/index.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/index.tsx rename to client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/index.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/useWish.tsx b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/useWish.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/useWish.tsx rename to client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/GachaPool/useWish.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/GenshinPanel/consts.ts b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/consts.ts similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/GenshinPanel/consts.ts rename to client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/consts.ts diff --git a/web/plugins/com.msgbyte.genshin/src/GenshinPanel/index.less b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/index.less similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/GenshinPanel/index.less rename to client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/index.less diff --git a/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/index.tsx b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/index.tsx new file mode 100644 index 00000000000..7259abfac3f --- /dev/null +++ b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/index.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { Translate } from '../translate'; +import { OfficialGachaIndex, OfficialGachaType, util } from 'genshin-gacha-kit'; +import { useAsync } from '@capital/common'; +import { PillTabs, LoadingSpinner } from '@capital/component'; +import { GachaPool } from './GachaPool'; +import _groupBy from 'lodash/groupBy'; +import './index.less'; + +const GenshinPanel: React.FC = React.memo(() => { + const { value: gachaList, loading } = useAsync(async () => { + const gacha = await util.getGachaIndex(); + const dict = _groupBy(gacha, 'gacha_type') as unknown as Record< + keyof OfficialGachaType, + OfficialGachaIndex[] + >; + + // 顺序: 角色 -> 武器 -> 常驻 -> 新手 + return [ + ...(dict['301'] ?? []), + ...(dict['302'] ?? []), + ...(dict['200'] ?? []), + ...(dict['100'] ?? []), + ]; + }, []); + + return ( +
+
+ {Translate.genshin} - {Translate.gacha} +
+ + {loading && } + + ({ + key: String(item.gacha_id), + label: `${item.gacha_name}(${item.begin_time} - ${item.end_time})`, + children: , + }))} + /> +
+ ); +}); +GenshinPanel.displayName = 'GenshinPanel'; + +export default GenshinPanel; diff --git a/web/plugins/com.msgbyte.genshin/src/GenshinPanel/utils.ts b/client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/utils.ts similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/GenshinPanel/utils.ts rename to client/web/plugins/com.msgbyte.genshin/src/GenshinPanel/utils.ts diff --git a/web/plugins/com.msgbyte.genshin/src/components/GenshinLoading.less b/client/web/plugins/com.msgbyte.genshin/src/components/GenshinLoading.less similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/components/GenshinLoading.less rename to client/web/plugins/com.msgbyte.genshin/src/components/GenshinLoading.less diff --git a/web/plugins/com.msgbyte.genshin/src/components/GenshinLoading.tsx b/client/web/plugins/com.msgbyte.genshin/src/components/GenshinLoading.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/components/GenshinLoading.tsx rename to client/web/plugins/com.msgbyte.genshin/src/components/GenshinLoading.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/components/GenshinRichtext.tsx b/client/web/plugins/com.msgbyte.genshin/src/components/GenshinRichtext.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/components/GenshinRichtext.tsx rename to client/web/plugins/com.msgbyte.genshin/src/components/GenshinRichtext.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/components/__tests__/GenshinRichtext.spec.tsx b/client/web/plugins/com.msgbyte.genshin/src/components/__tests__/GenshinRichtext.spec.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/components/__tests__/GenshinRichtext.spec.tsx rename to client/web/plugins/com.msgbyte.genshin/src/components/__tests__/GenshinRichtext.spec.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/components/__tests__/__snapshots__/GenshinRichtext.spec.tsx.snap b/client/web/plugins/com.msgbyte.genshin/src/components/__tests__/__snapshots__/GenshinRichtext.spec.tsx.snap similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/components/__tests__/__snapshots__/GenshinRichtext.spec.tsx.snap rename to client/web/plugins/com.msgbyte.genshin/src/components/__tests__/__snapshots__/GenshinRichtext.spec.tsx.snap diff --git a/web/plugins/com.msgbyte.genshin/src/index.ts b/client/web/plugins/com.msgbyte.genshin/src/index.tsx similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/index.ts rename to client/web/plugins/com.msgbyte.genshin/src/index.tsx diff --git a/web/plugins/com.msgbyte.genshin/src/translate.ts b/client/web/plugins/com.msgbyte.genshin/src/translate.ts similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/translate.ts rename to client/web/plugins/com.msgbyte.genshin/src/translate.ts diff --git a/web/plugins/com.msgbyte.genshin/src/utils/openFullScreenVideo.ts b/client/web/plugins/com.msgbyte.genshin/src/utils/openFullScreenVideo.ts similarity index 100% rename from web/plugins/com.msgbyte.genshin/src/utils/openFullScreenVideo.ts rename to client/web/plugins/com.msgbyte.genshin/src/utils/openFullScreenVideo.ts diff --git a/client/web/plugins/com.msgbyte.genshin/tsconfig.json b/client/web/plugins/com.msgbyte.genshin/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.genshin/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.integration/manifest.json b/client/web/plugins/com.msgbyte.integration/manifest.json new file mode 100644 index 00000000000..e16444c16cb --- /dev/null +++ b/client/web/plugins/com.msgbyte.integration/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "third party integration", + "label.zh-CN": "第三方集成", + "name": "com.msgbyte.integration", + "url": "/plugins/com.msgbyte.integration/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Used to integrate third-party applications in groups", + "description.zh-CN": "用于在群组中集成第三方应用", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.integration/package.json b/client/web/plugins/com.msgbyte.integration/package.json new file mode 100644 index 00000000000..e16e35d924d --- /dev/null +++ b/client/web/plugins/com.msgbyte.integration/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/com.msgbyte.integration", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "用于在群组中集成第三方应用", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.integration/src/IntegrationPanel.tsx b/client/web/plugins/com.msgbyte.integration/src/IntegrationPanel.tsx new file mode 100644 index 00000000000..15b81989751 --- /dev/null +++ b/client/web/plugins/com.msgbyte.integration/src/IntegrationPanel.tsx @@ -0,0 +1,135 @@ +import React, { useState } from 'react'; +import { Avatar, Button, Input, UserName } from '@capital/component'; +import styled from 'styled-components'; +import type { OpenAppInfo } from 'types'; +import { + useAsyncRequest, + postRequest, + showErrorToasts, + useGroupIdContext, + showSuccessToasts, +} from '@capital/common'; +import { Translate } from './translate'; + +const Tip = styled.div` + color: #999; + margin-bottom: 10px; +`; + +const Row = styled.div` + display: flex; +`; + +const AppInfoCard = styled.div({ + backgroundColor: 'rgba(0, 0, 0, 0.1)', + borderRadius: 3, + padding: 10, + marginTop: 10, + + '.app-info': { + flex: 1, + marginLeft: 10, + + '.title': { + fontSize: 18, + fontWeight: 'bold', + }, + + '.action': { + marginTop: 10, + }, + }, +}); + +const IntegrationPanel: React.FC = React.memo(() => { + const [appId, setAppId] = useState(''); + const [openAppInfo, setOpenAppInfo] = useState(null); + const groupId = useGroupIdContext(); + + const [{ loading }, handleQueryApp] = useAsyncRequest(async () => { + const { data } = await postRequest('/openapi/app/get', { + appId, + }); + + if (!data) { + showErrorToasts(Translate.notFoundApp); + return; + } + + setOpenAppInfo(data); + }, [appId]); + + const [{ loading: addBotLoading }, handleAddBotIntoGroup] = + useAsyncRequest(async () => { + await postRequest('/openapi/integration/addBotUser', { + appId, + groupId, + }); + showSuccessToasts(); + }, [appId]); + + return ( +
+ {Translate.onlyAllowManualAddition} + + + setAppId(e.target.value)} + /> + + + + {openAppInfo && ( +
+ + + + +
+
{openAppInfo.appName}
+
{openAppInfo.appDesc}
+ +
{Translate.developer}:
+ +
+ +
+ {openAppInfo.capability.includes('bot') ? ( + + ) : ( + + )} +
+
+
+
+
+ )} +
+ ); +}); +IntegrationPanel.displayName = 'IntegrationPanel'; + +export default IntegrationPanel; diff --git a/client/web/plugins/com.msgbyte.integration/src/index.tsx b/client/web/plugins/com.msgbyte.integration/src/index.tsx new file mode 100644 index 00000000000..d9a3416caaa --- /dev/null +++ b/client/web/plugins/com.msgbyte.integration/src/index.tsx @@ -0,0 +1,14 @@ +import { Loadable, regCustomPanel } from '@capital/common'; +import { Translate } from './translate'; + +const PLUGIN_NAME = '第三方集成'; + +console.log(`Plugin ${PLUGIN_NAME} is loaded`); + +regCustomPanel({ + position: 'groupdetail', + name: 'com.msgbyte.integration/groupdetail', + icon: '', + label: Translate.groupdetail, + render: Loadable(() => import('./IntegrationPanel')), +}); diff --git a/client/web/plugins/com.msgbyte.integration/src/translate.ts b/client/web/plugins/com.msgbyte.integration/src/translate.ts new file mode 100644 index 00000000000..da7b06c5d5b --- /dev/null +++ b/client/web/plugins/com.msgbyte.integration/src/translate.ts @@ -0,0 +1,36 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + groupdetail: localTrans({ + 'zh-CN': '集成', + 'en-US': 'Integration', + }), + notFoundApp: localTrans({ + 'zh-CN': '没找到该应用', + 'en-US': 'Not found application', + }), + onlyAllowManualAddition: localTrans({ + 'zh-CN': '目前仅支持通过应用ID手动添加', + 'en-US': 'Currently only supports manual addition via app ID', + }), + appId: localTrans({ + 'zh-CN': '应用ID', + 'en-US': 'Application ID', + }), + search: localTrans({ + 'zh-CN': '查询', + 'en-US': 'Search', + }), + developer: localTrans({ + 'zh-CN': '开发者', + 'en-US': 'Developer', + }), + addBot: localTrans({ + 'zh-CN': '添加应用机器人到群组', + 'en-US': 'Add app bot to group', + }), + cannotAddBot: localTrans({ + 'zh-CN': '该应用机器人没有开放聊天功能', + 'en-US': 'This application does not enable chat feature', + }), +}; diff --git a/client/web/plugins/com.msgbyte.integration/src/types.ts b/client/web/plugins/com.msgbyte.integration/src/types.ts new file mode 100644 index 00000000000..dd512c707f7 --- /dev/null +++ b/client/web/plugins/com.msgbyte.integration/src/types.ts @@ -0,0 +1,11 @@ +export type OpenAppCapability = 'bot' | 'webpage' | 'oauth'; + +export interface OpenAppInfo { + _id: string; + owner: string; + appId: string; + appName: string; + appDesc: string; + appIcon: string; + capability: OpenAppCapability[]; +} diff --git a/client/web/plugins/com.msgbyte.integration/tsconfig.json b/client/web/plugins/com.msgbyte.integration/tsconfig.json new file mode 100644 index 00000000000..efb75ed0339 --- /dev/null +++ b/client/web/plugins/com.msgbyte.integration/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.intro/manifest.json b/client/web/plugins/com.msgbyte.intro/manifest.json new file mode 100644 index 00000000000..6898c0784cc --- /dev/null +++ b/client/web/plugins/com.msgbyte.intro/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Intro plugin", + "label.zh-CN": "初始引导插件", + "name": "com.msgbyte.intro", + "url": "/plugins/com.msgbyte.intro/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "Turn on the ability to introduce the app for the first time for the app", + "description.zh-CN": "为应用首次打开介绍应用的能力", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.intro/package.json b/client/web/plugins/com.msgbyte.intro/package.json new file mode 100644 index 00000000000..7da8e377bec --- /dev/null +++ b/client/web/plugins/com.msgbyte.intro/package.json @@ -0,0 +1,9 @@ +{ + "name": "@plugins/com.msgbyte.intro", + "main": "src/index.ts", + "version": "0.0.0", + "private": true, + "dependencies": { + "shepherd.js": "^11.1.1" + } +} diff --git a/web/plugins/com.msgbyte.intro/src/index.ts b/client/web/plugins/com.msgbyte.intro/src/index.ts similarity index 100% rename from web/plugins/com.msgbyte.intro/src/index.ts rename to client/web/plugins/com.msgbyte.intro/src/index.ts diff --git a/client/web/plugins/com.msgbyte.intro/src/steps.ts b/client/web/plugins/com.msgbyte.intro/src/steps.ts new file mode 100644 index 00000000000..31e9385ed2e --- /dev/null +++ b/client/web/plugins/com.msgbyte.intro/src/steps.ts @@ -0,0 +1,87 @@ +import Shepherd from 'shepherd.js'; +import { Translate } from './translate'; + +function buildWatchDom(selector: string) { + return () => { + return new Promise((resolve) => { + const findDom = () => { + if (document.querySelector(selector)) { + resolve(); + } else { + setTimeout(() => { + findDom(); + }, 200); + } + }; + + findDom(); + }); + }; +} + +function buildStepOption(options: { + id: string; + text: string; + selector: string; + position?: Shepherd.Step.StepOptions['attachTo']['on']; + canClickTarget?: boolean; +}): Shepherd.Step.StepOptions { + return { + id: options.id, + text: options.text, + attachTo: { + element: options.selector, + on: options.position, + }, + canClickTarget: false, + beforeShowPromise: buildWatchDom(options.selector), + }; +} + +export const steps: Shepherd.Step.StepOptions[] = [ + { + id: 'start', + text: Translate.step1, + beforeShowPromise: buildWatchDom('[data-tc-role=navbar]'), // 仅当主界面出现后才显示欢迎 + }, + buildStepOption({ + id: 'navbar', + text: Translate.step2, + selector: '[data-tc-role=navbar]', + position: 'right', + }), + buildStepOption({ + id: 'personal', + text: Translate.step3, + selector: '[data-tc-role=navbar-personal]', + position: 'right', + }), + buildStepOption({ + id: 'groups', + text: Translate.step4, + selector: '[data-tc-role=navbar-groups]', + position: 'right', + }), + buildStepOption({ + id: 'settings', + text: Translate.step5, + selector: '[data-tc-role=navbar-settings]', + position: 'right', + }), + buildStepOption({ + id: 'sidebar', + text: Translate.step6, + selector: '[data-tc-role^=sidebar-]', + position: 'right', + }), + buildStepOption({ + id: 'content', + text: Translate.step7, + selector: '[data-tc-role^=content-]', + position: 'right', + }), + { + id: 'end', + text: Translate.step8, + }, +]; diff --git a/web/plugins/com.msgbyte.intro/src/style.less b/client/web/plugins/com.msgbyte.intro/src/style.less similarity index 100% rename from web/plugins/com.msgbyte.intro/src/style.less rename to client/web/plugins/com.msgbyte.intro/src/style.less diff --git a/web/plugins/com.msgbyte.intro/src/tour.ts b/client/web/plugins/com.msgbyte.intro/src/tour.ts similarity index 80% rename from web/plugins/com.msgbyte.intro/src/tour.ts rename to client/web/plugins/com.msgbyte.intro/src/tour.ts index 10c0c4e064d..9db02449b34 100644 --- a/web/plugins/com.msgbyte.intro/src/tour.ts +++ b/client/web/plugins/com.msgbyte.intro/src/tour.ts @@ -1,8 +1,9 @@ import Shepherd from 'shepherd.js'; +import { Translate } from './translate'; import { steps } from './steps'; import './style.less'; -const KEY = 'com.msgbyte.intro/hasRun'; +const KEY = 'plugin:com.msgbyte.intro/hasRun'; if (!window.localStorage.getItem(KEY)) { const tour = new Shepherd.Tour({ @@ -10,19 +11,19 @@ if (!window.localStorage.getItem(KEY)) { defaultStepOptions: { classes: 'shadow-md', scrollTo: true, - arrow: false, + arrow: true, modalOverlayOpeningRadius: 4, modalOverlayOpeningPadding: 4, buttons: [ { - text: '跳过引导', + text: Translate.skip, secondary: true, action() { this.complete(); }, }, { - text: '下一步', + text: Translate.next, action() { this.next(); }, diff --git a/client/web/plugins/com.msgbyte.intro/src/translate.ts b/client/web/plugins/com.msgbyte.intro/src/translate.ts new file mode 100644 index 00000000000..ec22888f959 --- /dev/null +++ b/client/web/plugins/com.msgbyte.intro/src/translate.ts @@ -0,0 +1,54 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + next: localTrans({ + 'zh-CN': '下一步', + 'en-US': 'Next', + }), + skip: localTrans({ + 'zh-CN': '跳过引导', + 'en-US': 'Skip Tour', + }), + step1: localTrans({ + 'zh-CN': '欢迎使用 Tailchat, 一个插件化的开源IM应用!', + 'en-US': 'Welcome to Tailchat, a pluginify open source IM application!', + }), + step2: localTrans({ + 'zh-CN': '这是导航栏, 在这里可以切换tailchat的各个主要页面。', + 'en-US': + 'This is the navigation bar, where you can switch between the main pages of tailchat.', + }), + step3: localTrans({ + 'zh-CN': '这是个人信息入口,在这里可以访问您的好友、插件、以及私信等功能。', + 'en-US': + 'This is the personal information entry, where you can access functions such as your friends, plug-ins, and private messages.', + }), + step4: localTrans({ + 'zh-CN': + '这是群组列表, 会显示所有已加入的群组,您可以通过点击切换切换群组,也可以点击 + 号按钮来创建群组', + 'en-US': + 'This is a list of groups, which will display all the groups you have joined. You can click to switch between groups, or you can click the + button to create a group', + }), + step5: localTrans({ + 'zh-CN': + '这是设置按钮,可以通过此按钮来进行个人信息的变更、系统设置的变更、软件信息等内容', + 'en-US': + 'This is the setting button, through which you can change personal information, system settings, software information, etc.', + }), + step6: localTrans({ + 'zh-CN': '这是侧边栏,用于切换内容。在未来会经常使用它来切换不同的面板。', + 'en-US': + 'This is the sidebar, used to toggle content. Will use it frequently in the future to switch between different panels.', + }), + step7: localTrans({ + 'zh-CN': '这是内容区,用于显示主要内容,也是Tailchat展示内容的地方。', + 'en-US': + 'This is the content area, which is used to display the main content, and it is also where Tailchat displays the content.', + }), + step8: localTrans({ + 'zh-CN': + '如果有更多疑问, 欢迎访问官方文档了解更多:
点击此处打开官方文档', + 'en-US': + 'If you have more questions, please visit the official document to learn more:
Click here to open the official documentation', + }), +}; diff --git a/client/web/plugins/com.msgbyte.intro/tsconfig.json b/client/web/plugins/com.msgbyte.intro/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.intro/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.mdpanel/manifest.json b/client/web/plugins/com.msgbyte.mdpanel/manifest.json new file mode 100644 index 00000000000..25b058b6b22 --- /dev/null +++ b/client/web/plugins/com.msgbyte.mdpanel/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Markdown Panel", + "label.zh-CN": "Markdown 面板", + "name": "com.msgbyte.mdpanel", + "url": "/plugins/com.msgbyte.mdpanel/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add markdown panel support", + "description.zh-CN": "增加 Markdown 面板支持", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.mdpanel/package.json b/client/web/plugins/com.msgbyte.mdpanel/package.json new file mode 100644 index 00000000000..d73418b5071 --- /dev/null +++ b/client/web/plugins/com.msgbyte.mdpanel/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/com.msgbyte.mdpanel", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Add markdown panel support", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.mdpanel/src/group/MarkdownPanel.tsx b/client/web/plugins/com.msgbyte.mdpanel/src/group/MarkdownPanel.tsx new file mode 100644 index 00000000000..6c1744fcacb --- /dev/null +++ b/client/web/plugins/com.msgbyte.mdpanel/src/group/MarkdownPanel.tsx @@ -0,0 +1,81 @@ +import React, { useEffect, useState } from 'react'; +import { + GroupExtraDataPanel, + Markdown, + MarkdownEditor, +} from '@capital/component'; +import styled from 'styled-components'; +import { Translate } from '../translate'; + +const MainContent = styled.div` + padding: 10px; +`; + +const EditModalContent = styled.div` + padding: 10px; + width: 80vw; + height: 80vh; + display: flex; + flex-direction: column; + overflow: hidden; + + .main { + flex: 1; + overflow: hidden; + + > div { + height: 100%; + + > .bytemd { + height: 100%; + } + } + } +`; + +const MarkdownEditorRender: React.FC<{ dataMap: Record }> = + React.memo((props) => { + const [text, setText] = useState(() => props.dataMap['markdown']); + + useEffect(() => { + props.dataMap['markdown'] = text; + }, [text]); + + return ( + setText(val)} + imageUsage="group" + /> + ); + }); +MarkdownEditorRender.displayName = 'MarkdownEditorRender'; + +const MarkdownPanel: React.FC = React.memo(() => { + return ( + ) => { + return ( + + + + ); + }} + renderEdit={(dataMap: Record) => { + return ( + +
{Translate.editTip}
+ +
+ +
+
+ ); + }} + /> + ); +}); +MarkdownPanel.displayName = 'MarkdownPanel'; + +export default MarkdownPanel; diff --git a/client/web/plugins/com.msgbyte.mdpanel/src/index.tsx b/client/web/plugins/com.msgbyte.mdpanel/src/index.tsx new file mode 100644 index 00000000000..e663a84cdb7 --- /dev/null +++ b/client/web/plugins/com.msgbyte.mdpanel/src/index.tsx @@ -0,0 +1,20 @@ +import { regGroupPanel } from '@capital/common'; +import { Loadable } from '@capital/component'; +import { Translate } from './translate'; + +const PLUGIN_ID = 'com.msgbyte.mdpanel'; +const PLUGIN_NAME = 'Markdown Panel'; + +console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`); + +/** + * @note 应该用 PLUGIN_ID 而不是 PLUGIN_NAME, 后续需要逐步迁移 + */ +regGroupPanel({ + name: `${PLUGIN_NAME}/customwebpanel`, + label: Translate.name, + provider: PLUGIN_NAME, + render: Loadable(() => import('./group/MarkdownPanel'), { + componentName: `${PLUGIN_ID}:MarkdownPanel`, + }), +}); diff --git a/client/web/plugins/com.msgbyte.mdpanel/src/translate.ts b/client/web/plugins/com.msgbyte.mdpanel/src/translate.ts new file mode 100644 index 00000000000..aa755ef6b57 --- /dev/null +++ b/client/web/plugins/com.msgbyte.mdpanel/src/translate.ts @@ -0,0 +1,13 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + name: localTrans({ + 'zh-CN': 'Markdown 面板', + 'en-US': 'Markdown Panel', + }), + editTip: localTrans({ + 'zh-CN': '使用markdown语法编辑, 关闭窗口自动保存', + 'en-US': + 'Edit with markdown syntax, close the window and save automatically', + }), +}; diff --git a/client/web/plugins/com.msgbyte.mdpanel/tsconfig.json b/client/web/plugins/com.msgbyte.mdpanel/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.mdpanel/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.mdpanel/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.mdpanel/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.mdpanel/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/web/plugins/com.msgbyte.miaolang/README.md b/client/web/plugins/com.msgbyte.miaolang/README.md similarity index 100% rename from web/plugins/com.msgbyte.miaolang/README.md rename to client/web/plugins/com.msgbyte.miaolang/README.md diff --git a/web/plugins/com.msgbyte.miaolang/docs/output.png b/client/web/plugins/com.msgbyte.miaolang/docs/output.png similarity index 100% rename from web/plugins/com.msgbyte.miaolang/docs/output.png rename to client/web/plugins/com.msgbyte.miaolang/docs/output.png diff --git a/web/plugins/com.msgbyte.miaolang/docs/send.png b/client/web/plugins/com.msgbyte.miaolang/docs/send.png similarity index 100% rename from web/plugins/com.msgbyte.miaolang/docs/send.png rename to client/web/plugins/com.msgbyte.miaolang/docs/send.png diff --git a/client/web/plugins/com.msgbyte.miaolang/manifest.json b/client/web/plugins/com.msgbyte.miaolang/manifest.json new file mode 100644 index 00000000000..d0ff69c1270 --- /dev/null +++ b/client/web/plugins/com.msgbyte.miaolang/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "Miaolang", + "label.zh-CN": "喵语言", + "name": "com.msgbyte.miaolang", + "url": "/plugins/com.msgbyte.miaolang/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "It is allowed to send meow, and the two parties encrypt the conversation after installing the plugin. People who have not installed the plugin will see 'meow'", + "description.zh-CN": "允许发送喵语,安装插件后的双方加密对话,未安装插件的人看到的是 '喵'", + "documentUrl": "/plugins/com.msgbyte.miaolang/README.md", + "requireRestart": false +} diff --git a/web/plugins/com.msgbyte.miaolang/package.json b/client/web/plugins/com.msgbyte.miaolang/package.json similarity index 100% rename from web/plugins/com.msgbyte.miaolang/package.json rename to client/web/plugins/com.msgbyte.miaolang/package.json diff --git a/web/plugins/com.msgbyte.miaolang/src/SendMiaoModal.tsx b/client/web/plugins/com.msgbyte.miaolang/src/SendMiaoModal.tsx similarity index 100% rename from web/plugins/com.msgbyte.miaolang/src/SendMiaoModal.tsx rename to client/web/plugins/com.msgbyte.miaolang/src/SendMiaoModal.tsx diff --git a/web/plugins/com.msgbyte.miaolang/src/index.ts b/client/web/plugins/com.msgbyte.miaolang/src/index.ts similarity index 100% rename from web/plugins/com.msgbyte.miaolang/src/index.ts rename to client/web/plugins/com.msgbyte.miaolang/src/index.ts diff --git a/web/plugins/com.msgbyte.miaolang/src/miaotrans.ts b/client/web/plugins/com.msgbyte.miaolang/src/miaotrans.ts similarity index 100% rename from web/plugins/com.msgbyte.miaolang/src/miaotrans.ts rename to client/web/plugins/com.msgbyte.miaolang/src/miaotrans.ts diff --git a/web/plugins/com.msgbyte.miaolang/src/reg.ts b/client/web/plugins/com.msgbyte.miaolang/src/reg.ts similarity index 100% rename from web/plugins/com.msgbyte.miaolang/src/reg.ts rename to client/web/plugins/com.msgbyte.miaolang/src/reg.ts diff --git a/web/plugins/com.msgbyte.miaolang/src/translate.ts b/client/web/plugins/com.msgbyte.miaolang/src/translate.ts similarity index 100% rename from web/plugins/com.msgbyte.miaolang/src/translate.ts rename to client/web/plugins/com.msgbyte.miaolang/src/translate.ts diff --git a/client/web/plugins/com.msgbyte.miaolang/tsconfig.json b/client/web/plugins/com.msgbyte.miaolang/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.miaolang/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.music/assets/icon.png b/client/web/plugins/com.msgbyte.music/assets/icon.png new file mode 100644 index 00000000000..554571752ac Binary files /dev/null and b/client/web/plugins/com.msgbyte.music/assets/icon.png differ diff --git a/client/web/plugins/com.msgbyte.music/manifest.json b/client/web/plugins/com.msgbyte.music/manifest.json new file mode 100644 index 00000000000..9d64f97e12c --- /dev/null +++ b/client/web/plugins/com.msgbyte.music/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "Listen Music Online", + "label.zh-CN": "在线听音乐", + "name": "com.msgbyte.music", + "url": "/plugins/com.msgbyte.music/index.js", + "icon": "/plugins/com.msgbyte.music/assets/icon.png", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Provide online music listening service, the content comes from the Internet", + "description.zh-CN": "提供在线听音乐服务,内容来自网络", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.music/package.json b/client/web/plugins/com.msgbyte.music/package.json new file mode 100644 index 00000000000..4a01744c64a --- /dev/null +++ b/client/web/plugins/com.msgbyte.music/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/com.msgbyte.music", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "提供在线听音乐服务,内容来自网络", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.music/src/index.tsx b/client/web/plugins/com.msgbyte.music/src/index.tsx new file mode 100644 index 00000000000..50cc8bcd26f --- /dev/null +++ b/client/web/plugins/com.msgbyte.music/src/index.tsx @@ -0,0 +1,20 @@ +import { regCustomPanel } from '@capital/common'; +import { Loadable } from '@capital/component'; +import { Translate } from './translate'; + +const PLUGIN_ID = 'com.msgbyte.music'; + +console.log(`Plugin ${PLUGIN_ID} is loaded`); + +regCustomPanel({ + position: 'navbar-more', + icon: 'mdi:disc-player', + name: `${PLUGIN_ID}/musicpanel`, + label: Translate.musicpanel, + render: Loadable( + () => import('./panels/MusicPanel').then((module) => module.MusicPanel), + { + componentName: `${PLUGIN_ID}:CustomMusicPanelRender`, + } + ), +}); diff --git a/client/web/plugins/com.msgbyte.music/src/panels/MusicPanel.tsx b/client/web/plugins/com.msgbyte.music/src/panels/MusicPanel.tsx new file mode 100644 index 00000000000..0c4eecd5b57 --- /dev/null +++ b/client/web/plugins/com.msgbyte.music/src/panels/MusicPanel.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { WebviewKeepAlive } from '@capital/component'; + +const url = 'https://music.moonrailgun.com/'; + +/** + * 音乐面板 + */ +export const MusicPanel: React.FC = React.memo(() => { + return ( + + ); +}); +MusicPanel.displayName = 'MusicPanel'; diff --git a/client/web/plugins/com.msgbyte.music/src/translate.ts b/client/web/plugins/com.msgbyte.music/src/translate.ts new file mode 100644 index 00000000000..f648055b7e2 --- /dev/null +++ b/client/web/plugins/com.msgbyte.music/src/translate.ts @@ -0,0 +1,8 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + musicpanel: localTrans({ + 'zh-CN': '在线听音乐', + 'en-US': 'YesPlayMusic', + }), +}; diff --git a/client/web/plugins/com.msgbyte.music/tsconfig.json b/client/web/plugins/com.msgbyte.music/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.music/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.music/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.music/types/tailchat.d.ts new file mode 100644 index 00000000000..ceefa1fef0e --- /dev/null +++ b/client/web/plugins/com.msgbyte.music/types/tailchat.d.ts @@ -0,0 +1,502 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/// + +/** + * 该文件由 Tailchat 自动生成 + * 用于插件的类型声明 + * 生成命令: pnpm run plugins:declaration:generate + */ + +/** + * Tailchat 通用 + */ +declare module '@capital/common' { + export const useGroupPanelParams: any; + + /** + * 打开模态框 + * @deprecated 请从 @capital/component 引入 + */ + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const closeModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const ModalWrapper: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const useModalContext: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const openConfirmModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const openReconfirmModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const Loadable: any; + + export const getGlobalState: any; + + export const useGlobalSocketEvent: ( + eventName: string, + callback: (data: T) => void + ) => void; + + export const getJWTUserInfo: () => Promise<{ + _id?: string; + nickname?: string; + email?: string; + avatar?: string; + }>; + + export const dataUrlToFile: any; + + export const urlSearchStringify: any; + + export const urlSearchParse: any; + + export const appendUrlSearch: any; + + export const getServiceWorkerRegistration: any; + + export const getServiceUrl: () => string; + + export const getCachedUserInfo: ( + userId: string, + refetch?: boolean + ) => Promise<{ + _id: string; + email: string; + nickname: string; + discriminator: string; + avatar: string | null; + temporary: boolean; + }>; + + export const getCachedConverseInfo: any; + + export const getCachedBaseGroupInfo: any; + + export const getCachedUserSettings: any; + + /** + * 本地翻译 + * @example + * localTrans({'zh-CN': '你好', 'en-US': 'Hello'}); + * + * @param trans 翻译对象 + */ + export const localTrans: (trans: Record<'zh-CN' | 'en-US', string>) => string; + + export const getLanguage: any; + + export const sharedEvent: any; + + export const useAsync: Promise>( + fn: T, + deps?: React.DependencyList + ) => { loading: boolean; value?: any; error?: Error }; + + export const useAsyncFn: Promise>( + fn: T, + deps?: React.DependencyList + ) => [{ loading: boolean; value?: any; error?: Error }, T]; + + export const useAsyncRefresh: Promise>( + fn: T, + deps?: React.DependencyList + ) => { loading: boolean; value?: any; error?: Error; refresh: () => void }; + + export const useAsyncRequest: Promise>( + fn: T, + deps?: React.DependencyList + ) => [{ loading: boolean; value?: any }, T]; + + export const uploadFile: any; + + export const showToasts: ( + message: string, + type?: 'info' | 'success' | 'error' | 'warning' + ) => void; + + export const showSuccessToasts: any; + + export const showErrorToasts: (error: any) => void; + + export const fetchAvailableServices: any; + + export const isValidStr: (str: any) => str is string; + + export const useGroupPanelInfo: any; + + export const sendMessage: any; + + export const showMessageTime: any; + + export const joinArray: any; + + export const navigate: any; + + export const useLocation: any; + + export const useNavigate: any; + + /** + * @deprecated please use createMetaFormSchema from @capital/component + */ + export const createFastFormSchema: any; + + /** + * @deprecated please use metaFormFieldSchema from @capital/component + */ + export const fieldSchema: any; + + export const useCurrentUserInfo: any; + + export const createPluginRequest: (pluginName: string) => { + get: (actionName: string, config?: any) => Promise; + post: (actionName: string, data?: any, config?: any) => Promise; + }; + + export const postRequest: any; + + export const pluginCustomPanel: any; + + export const regCustomPanel: any; + + export const pluginGroupPanel: any; + + export const regGroupPanel: any; + + export const messageInterpreter: { + name?: string; + explainMessage: (message: string) => React.ReactNode; + }[]; + + export const regMessageInterpreter: (interpreter: { + name?: string; + explainMessage: (message: string) => React.ReactNode; + }) => void; + + export const getMessageRender: (message: string) => React.ReactNode; + + export const regMessageRender: ( + render: (message: string) => React.ReactNode + ) => void; + + export const getMessageTextDecorators: any; + + export const regMessageTextDecorators: any; + + export const ChatInputActionContextProps: any; + + export const pluginChatInputActions: any; + + export const regChatInputAction: any; + + export const regSocketEventListener: (item: { + eventName: string; + eventFn: (...args: any[]) => void; + }) => void; + + export const pluginColorScheme: any; + + export const regPluginColorScheme: any; + + export const pluginInspectServices: any; + + export const regInspectService: any; + + export const pluginMessageExtraParsers: any; + + export const regMessageExtraParser: any; + + export const pluginRootRoute: any; + + export const regPluginRootRoute: any; + + export const pluginPanelActions: any; + + export const regPluginPanelAction: ( + action: + | { + name: string; + label: string; + icon: string; + position: 'group'; + onClick: (ctx: { groupId: string; panelId: string }) => void; + } + | { + name: string; + label: string; + icon: string; + position: 'dm'; + onClick: (ctx: { converseId: string }) => void; + } + ) => void; + + export const pluginPermission: any; + + export const regPluginPermission: (permission: { + /** + * 权限唯一key, 用于写入数据库 + * 如果为插件则权限点应当符合命名规范, 如: plugin.com.msgbyte.github.manage + */ + key: string; + /** + * 权限点显示名称 + */ + title: string; + /** + * 权限描述 + */ + desc: string; + /** + * 是否默认开启 + */ + default: boolean; + /** + * 是否依赖其他权限点 + */ + required?: string[]; + }) => void; + + export const pluginGroupPanelBadges: any; + + export const regGroupPanelBadge: any; + + export const pluginGroupTextPanelExtraMenus: any; + + export const regPluginGroupTextPanelExtraMenu: any; + + export const pluginUserExtraInfo: any; + + export const regUserExtraInfo: any; + + export const pluginSettings: any; + + export const regPluginSettings: any; + + export const useGroupIdContext: () => string; + + export const useGroupPanelContext: () => { + groupId: string; + panelId: string; + } | null; + + export const useSocketContext: any; +} + +/** + * Tailchat 组件 + */ +declare module '@capital/component' { + export const Button: any; + + export const Checkbox: any; + + export const Input: any; + + export const Divider: any; + + export const Space: any; + + export const Menu: any; + + export const Table: any; + + export const Switch: any; + + export const Tooltip: any; + + /** + * @link https://ant.design/components/notification-cn/ + */ + export const notification: any; + + export const Empty: React.FC< + React.PropsWithChildren<{ + prefixCls?: string; + className?: string; + style?: React.CSSProperties; + imageStyle?: React.CSSProperties; + image?: React.ReactNode; + description?: React.ReactNode; + }> + >; + + export const TextArea: any; + + export const Avatar: any; + + export const SensitiveText: React.FC<{ className?: string; text: string }>; + + export const Icon: React.FC<{ icon: string } & React.SVGProps>; + + export const CopyableText: React.FC<{ + className?: string; + style?: React.CSSProperties; + config?: + | boolean + | { + text?: string; + onCopy?: (event?: React.MouseEvent) => void; + icon?: React.ReactNode; + tooltips?: boolean | React.ReactNode; + format?: 'text/plain' | 'text/html'; + }; + }>; + + export const WebFastForm: any; + + export const WebMetaForm: any; + + export const createMetaFormSchema: any; + + export const metaFormFieldSchema: any; + + export const Link: any; + + export const MessageAckContainer: any; + + export const Image: any; + + export const IconBtn: React.FC<{ + icon: string; + className?: string; + iconClassName?: string; + size?: 'small' | 'middle' | 'large'; + shape?: 'circle' | 'square'; + title?: string; + danger?: boolean; + active?: boolean; + disabled?: boolean; + onClick?: React.MouseEventHandler; + }>; + + export const PillTabs: any; + + export const PillTabPane: any; + + export const LoadingSpinner: React.FC<{ tip?: string }>; + + export const FullModalField: any; + + export const DefaultFullModalInputEditorRender: any; + + export const DefaultFullModalTextAreaEditorRender: any; + + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loadable: any; + + export const Loading: React.FC<{ + spinning: boolean; + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + }>; + + export const LoadingOnFirst: React.FC<{ + spinning: boolean; + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + }>; + + export const SidebarView: any; + + export const GroupPanelSelector: any; + + export const Emoji: any; + + export const PortalAdd: any; + + export const PortalRemove: any; + + export const ErrorBoundary: any; + + export const UserAvatar: React.FC<{ + userId: string; + className?: string; + style?: React.CSSProperties; + size?: 'large' | 'small' | 'default' | number; + }>; + + export const UserName: React.FC<{ + userId: string; + className?: string; + style?: React.CSSProperties; + }>; + + export const Markdown: any; + + export const Webview: any; + + export const WebviewKeepAlive: any; +} diff --git a/client/web/plugins/com.msgbyte.notify/assets/sounds_bing.mp3 b/client/web/plugins/com.msgbyte.notify/assets/sounds_bing.mp3 new file mode 100644 index 00000000000..2827addd44b Binary files /dev/null and b/client/web/plugins/com.msgbyte.notify/assets/sounds_bing.mp3 differ diff --git a/client/web/plugins/com.msgbyte.notify/manifest.json b/client/web/plugins/com.msgbyte.notify/manifest.json new file mode 100644 index 00000000000..ccc52232666 --- /dev/null +++ b/client/web/plugins/com.msgbyte.notify/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Message notification plugin", + "label.zh-CN": "消息通知插件", + "name": "com.msgbyte.notify", + "url": "/plugins/com.msgbyte.notify/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "Ability to add notifications to apps", + "description.zh-CN": "为应用增加通知的能力", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.notify/package.json b/client/web/plugins/com.msgbyte.notify/package.json new file mode 100644 index 00000000000..27daacd6960 --- /dev/null +++ b/client/web/plugins/com.msgbyte.notify/package.json @@ -0,0 +1,13 @@ +{ + "name": "@plugins/com.msgbyte.notify", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": { + "lodash": "^4.17.21", + "tinycon": "^0.6.8" + }, + "devDependencies": { + "@types/tinycon": "^0.6.3" + } +} diff --git a/client/web/plugins/com.msgbyte.notify/src/bubble.ts b/client/web/plugins/com.msgbyte.notify/src/bubble.ts new file mode 100644 index 00000000000..ad0b0fd4543 --- /dev/null +++ b/client/web/plugins/com.msgbyte.notify/src/bubble.ts @@ -0,0 +1,45 @@ +import tinycon from 'tinycon'; + +/** + * 设置小红点 + * @param num 小红点数 + */ +let bubbleNum = 0; +export function setBubble(num: number) { + bubbleNum = num; + if (num < 0) { + num = 0; + } + tinycon.setBubble(num >= 100 ? 99 : num); +} + +/** + * 增加小红点数量 + */ +export function incBubble() { + setBubble(bubbleNum + 1); +} + +const hiddenProperty = + 'hidden' in document + ? 'hidden' + : 'webkitHidden' in document + ? 'webkitHidden' + : 'mozHidden' in document + ? 'mozHidden' + : null; +const visibilityChangeEvent = hiddenProperty?.replace( + /hidden/i, + 'visibilitychange' +); +const onVisibilityChange = function () { + if (!document[hiddenProperty ?? '']) { + // 显示标签页时清空 + tinycon.setBubble(0); + } else { + // 隐藏标签页 + } +}; +if (typeof visibilityChangeEvent === 'string') { + document.addEventListener(visibilityChangeEvent, onVisibilityChange); +} diff --git a/client/web/plugins/com.msgbyte.notify/src/const.ts b/client/web/plugins/com.msgbyte.notify/src/const.ts new file mode 100644 index 00000000000..b42bd357721 --- /dev/null +++ b/client/web/plugins/com.msgbyte.notify/src/const.ts @@ -0,0 +1,3 @@ +export const PLUGIN_NAME = 'com.msgbyte.notify'; + +export const PLUGIN_SYSTEM_SETTINGS_DISABLED_SOUND = `${PLUGIN_NAME}.disabledSound`; diff --git a/client/web/plugins/com.msgbyte.notify/src/index.tsx b/client/web/plugins/com.msgbyte.notify/src/index.tsx new file mode 100644 index 00000000000..e89943e1681 --- /dev/null +++ b/client/web/plugins/com.msgbyte.notify/src/index.tsx @@ -0,0 +1,21 @@ +import { regPluginSettings, showToasts } from '@capital/common'; +import { initNotify } from './notify'; +import { Translate } from './translate'; +import { PLUGIN_SYSTEM_SETTINGS_DISABLED_SOUND } from './const'; + +if ('Notification' in window) { + initNotify(); +} else { + if ((window as Window).innerWidth >= 768) { + // if not mobile + showToasts(Translate.nosupport, 'warning'); + } + console.warn(Translate.nosupport); +} + +regPluginSettings({ + name: PLUGIN_SYSTEM_SETTINGS_DISABLED_SOUND, + label: Translate.disabledSound, + position: 'system', + type: 'boolean', +}); diff --git a/client/web/plugins/com.msgbyte.notify/src/notify.ts b/client/web/plugins/com.msgbyte.notify/src/notify.ts new file mode 100644 index 00000000000..d7febabcbf8 --- /dev/null +++ b/client/web/plugins/com.msgbyte.notify/src/notify.ts @@ -0,0 +1,150 @@ +import { + getGlobalState, + getCachedUserInfo, + getCachedBaseGroupInfo, + getServiceWorkerRegistration, + navigate, + sharedEvent, + getCachedUserSettings, + getMessageTextDecorators, +} from '@capital/common'; +import { Translate } from './translate'; +import { incBubble, setBubble } from './bubble'; +import _get from 'lodash/get'; +import { PLUGIN_SYSTEM_SETTINGS_DISABLED_SOUND } from './const'; + +const TAG = 'tailchat-message'; + +export function initNotify() { + if (Notification.permission === 'default') { + Notification.requestPermission(); + } + + const registration: ServiceWorkerRegistration | null = + getServiceWorkerRegistration(); + if (registration) { + registration.addEventListener('notificationclick', (e: any) => { + const tag = e.notification.tag; + const data = e.notification.data; + + handleMessageNotifyClick(tag, data); + }); + } + + let isBlur = false; + window.addEventListener('focus', () => { + setBubble(0); // 点击时清空 + isBlur = false; + }); + window.addEventListener('blur', () => (isBlur = true)); + + sharedEvent.on('receiveUnmutedMessage', (message) => { + const currentUserId = getGlobalState()?.user.info._id; + + if (currentUserId === message.author) { + // 忽略本人消息 + return; + } + + const hidden = window.document.hidden ?? false; + if (hidden || isBlur) { + // 如果当前不是活跃窗口或处于隐藏状态,则创建通知 + + if (Notification.permission === 'granted') { + // TODO: 需要增加显示所在群组 + Promise.all([ + getCachedUserInfo(message.author), + message.groupId + ? getCachedBaseGroupInfo(message.groupId).then((d) => d.name) + : Promise.resolve(Translate.dm), + ]).then(([userInfo, scopeName]) => { + const nickname = userInfo?.nickname ?? ''; + const icon = userInfo?.avatar ?? undefined; + const content = getMessageTextDecorators().serialize(message.content); // 只显示无富文本形式的消息 + + const title = `${Translate.from} [${scopeName}] ${nickname}`; + const options: NotificationOptions = { + body: content, + icon, + tag: TAG, + renotify: true, + data: message, + silent: true, // 因为有提示音了,所以禁音默认音 + }; + + if (registration && registration.showNotification) { + registration.showNotification(title, options); + } else { + // fallback + const notification = new Notification(title, options); + notification.onclick = (e: any) => { + const tag = e.target.tag; + const data = e.target.data; + + handleMessageNotifyClick(tag, data); + }; + } + }); + } + + incBubble(); + } + + tryPlayNotificationSound(); // 不管当前是不是处于活跃状态,都发出提示音 + }); +} + +/** + * 点击通知栏事件 + */ +function handleMessageNotifyClick(tag, data) { + if (tag === 'tailchat-message') { + const message = data; + + window.focus(); + const { converseId, groupId } = message ?? {}; + if (!converseId) { + console.warn('[notify] Not found converseId'); + return; + } + if (groupId) { + // 群组消息 + navigate(`/main/group/${groupId}/${converseId}`); + } else { + // 私信会话 + navigate(`/main/personal/converse/${converseId}`); + } + } +} + +let userSettings = null; +sharedEvent.on('loginSuccess', () => { + getCachedUserSettings().then((settings) => { + if (userSettings === null) { + userSettings = settings; + } + }); +}); + +sharedEvent.on('userSettingsUpdate', (settings) => { + userSettings = settings; +}); + +/** + * 尝试播放通知声音 + */ +async function tryPlayNotificationSound() { + if (_get(userSettings, PLUGIN_SYSTEM_SETTINGS_DISABLED_SOUND) === true) { + // 消息提示音被禁用 + return; + } + + try { + const audio = new Audio( + '/plugins/com.msgbyte.notify/assets/sounds_bing.mp3' + ); + await audio.play(); + } catch (err) { + console.error(err); + } +} diff --git a/client/web/plugins/com.msgbyte.notify/src/translate.ts b/client/web/plugins/com.msgbyte.notify/src/translate.ts new file mode 100644 index 00000000000..3ed20be16b3 --- /dev/null +++ b/client/web/plugins/com.msgbyte.notify/src/translate.ts @@ -0,0 +1,21 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + nosupport: localTrans({ + 'zh-CN': '当前浏览器不支持 Notification', + 'en-US': 'This browser not support Notification', + }), + slient: localTrans({ 'zh-CN': '免打扰', 'en-US': 'Slient' }), + from: localTrans({ + 'zh-CN': '来自', + 'en-US': 'From', + }), + dm: localTrans({ + 'zh-CN': '私信', + 'en-US': 'DM', + }), + disabledSound: localTrans({ + 'zh-CN': '禁用消息通知提示音', + 'en-US': 'Disable message notification sound', + }), +}; diff --git a/client/web/plugins/com.msgbyte.notify/tsconfig.json b/client/web/plugins/com.msgbyte.notify/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.notify/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.offline-icons/manifest.json b/client/web/plugins/com.msgbyte.offline-icons/manifest.json new file mode 100644 index 00000000000..20f25bb3537 --- /dev/null +++ b/client/web/plugins/com.msgbyte.offline-icons/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Offline Icons", + "label.zh-CN": "离线图标", + "name": "com.msgbyte.offline-icons", + "url": "/plugins/com.msgbyte.offline-icons/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add prefetched icons which need run in intranet environment", + "description.zh-CN": "增加预获取的图标,适用于内网环境", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.offline-icons/package.json b/client/web/plugins/com.msgbyte.offline-icons/package.json new file mode 100644 index 00000000000..c24e23b30d8 --- /dev/null +++ b/client/web/plugins/com.msgbyte.offline-icons/package.json @@ -0,0 +1,23 @@ +{ + "name": "@plugins/com.msgbyte.offline-icons", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Add prefetched icons which need run in offline environment", + "private": true, + "scripts": { + "extract": "ts-node scripts/extract-icons.ts", + "sync:declaration": "tailchat declaration github" + }, + "devDependencies": { + "@babel/parser": "^7.20.5", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5", + "@types/babel__traverse": "^7.18.3", + "@types/styled-components": "^5.1.26", + "globby": "11.1.0", + "react": "18.2.0", + "styled-components": "^5.3.6", + "ts-node": "10.9.1", + "typescript": "4.9.4" + } +} diff --git a/client/web/plugins/com.msgbyte.offline-icons/scripts/extract-icons.ts b/client/web/plugins/com.msgbyte.offline-icons/scripts/extract-icons.ts new file mode 100644 index 00000000000..2d2003a028b --- /dev/null +++ b/client/web/plugins/com.msgbyte.offline-icons/scripts/extract-icons.ts @@ -0,0 +1,184 @@ +import { parse } from '@babel/parser'; +import traverse from '@babel/traverse'; +import { + isArrayExpression, + isConditionalExpression, + isIdentifier, + isJSXAttribute, + isJSXExpressionContainer, + isJSXIdentifier, + isObjectExpression, + isObjectProperty, + isStringLiteral, +} from '@babel/types'; +import globby from 'globby'; +import fs from 'fs-extra'; +import path from 'path'; +import _ from 'lodash'; +import axios from 'axios'; + +const PROJECT_ROOT = path.resolve(__dirname, '../../../../../'); + +/** + * Entry + */ +(async () => { + const start = Date.now(); + const paths = await globby(['**.tsx'], { + cwd: PROJECT_ROOT, + }); + + console.log(`extract icons from ${paths.length} files...`); + + const res = await Promise.all( + paths.map((p) => extractIcons(path.resolve(PROJECT_ROOT, p))) + ); + + const icons = _.uniq(_.flatten(res)).sort(); + + console.log(`extract ${icons.length} icons, usage: ${Date.now() - start}ms`); + + const group = _.mapValues( + _.groupBy(icons, (icon) => icon.split(':')[0]), + (value) => { + return value.map((item) => item.split(':')[1]); + } + ); + + console.log(`fetching remote svg....`); + + const svgs = await Promise.all( + _.map(group, (icons, prefix) => { + return fetchSvgs(prefix, icons); + }) + ); + + const target = path.resolve(__dirname, '../src/icons.json'); + await fs.writeJSON(target, svgs, { spaces: 2 }); + + console.log('DONE! Assets has been write into:', target); +})(); + +async function extractIcons(filepath: string): Promise { + const code = await fs.readFile(filepath, 'utf-8'); + + const ast = parse(code, { + sourceType: 'module', + plugins: ['jsx', 'typescript'], + }); + + const icons = []; + + traverse(ast, { + JSXOpeningElement(path) { + const name = path.node.name; + if ( + isJSXIdentifier(name) && + ['Icon', 'IconBtn', 'LogoLink', 'BaseChatInputButton'].includes( + name.name + ) + ) { + path.node.attributes.forEach((attribute) => { + if (isJSXAttribute(attribute) && attribute.name.name === 'icon') { + if (isStringLiteral(attribute.value) && attribute.value.value) { + icons.push(attribute.value.value); + } else if (isJSXExpressionContainer(attribute.value)) { + // is icon={...} + if (isStringLiteral(attribute.value.expression)) { + // is icon={''} + icons.push(attribute.value.expression.value); + } else if (isConditionalExpression(attribute.value.expression)) { + // is icon={boolean ? '' : ''} + + if (isStringLiteral(attribute.value.expression.consequent)) { + icons.push(attribute.value.expression.consequent.value); + } + if (isStringLiteral(attribute.value.expression.alternate)) { + icons.push(attribute.value.expression.alternate.value); + } + } + } + } + }); + } + }, + CallExpression(path) { + if (!isIdentifier(path.node.callee)) { + return; + } + + if ( + ['regCustomPanel', 'regPluginPanelAction'].includes( + path.node.callee.name + ) + ) { + path.node.arguments.forEach((argument) => { + if (isObjectExpression(argument)) { + argument.properties.forEach((property) => { + if ( + isObjectProperty(property) && + isIdentifier(property.key) && + property.key.name === 'icon' && + isStringLiteral(property.value) && + property.value.value // icon maybe empty string in some type + ) { + icons.push(property.value.value); + } + }); + } + }); + } + + if (path.node.callee.name === 'regGroupPanel') { + path.node.arguments.forEach((argument) => { + if (isObjectExpression(argument)) { + argument.properties.forEach((property) => { + if ( + isObjectProperty(property) && + isIdentifier(property.key) && + property.key.name === 'menus' && + isArrayExpression(property.value) + ) { + property.value.elements.forEach((element) => { + if (isObjectExpression(element)) { + element.properties.forEach((property) => { + if ( + isObjectProperty(property) && + isIdentifier(property.key) && + property.key.name === 'icon' && + isStringLiteral(property.value) && + property.value.value // icon maybe empty string in some type + ) { + icons.push(property.value.value); + } + }); + } + }); + } + }); + } + }); + } + }, + }); + + return icons; +} + +async function fetchSvgs( + prefix: string, + icons: string[] +): Promise<{ + aliases: any; + height: number; + width: number; + icons: Record; + lastModified: number; + prefix: string; +}> { + const { data } = await axios.get(`/${prefix}.json?icons=${icons.join(',')}`, { + baseURL: 'https://api.simplesvg.com/', // https://iconify.design/docs/api/#public-api + }); + + return data; +} diff --git a/client/web/plugins/com.msgbyte.offline-icons/src/icons.json b/client/web/plugins/com.msgbyte.offline-icons/src/icons.json new file mode 100644 index 00000000000..95f2fc97279 --- /dev/null +++ b/client/web/plugins/com.msgbyte.offline-icons/src/icons.json @@ -0,0 +1,329 @@ +[ + { + "prefix": "akar-icons", + "lastModified": 1711103968, + "aliases": {}, + "width": 24, + "height": 24, + "icons": { + "game-controller": { + "body": "" + } + } + }, + { + "prefix": "emojione", + "lastModified": 1702311885, + "aliases": {}, + "width": 64, + "height": 64, + "icons": { + "cross-mark-button": { + "body": "" + }, + "white-heavy-check-mark": { + "body": "" + } + } + }, + { + "prefix": "eos-icons", + "lastModified": 1715669522, + "aliases": {}, + "width": 24, + "height": 24, + "icons": { + "ai": { + "body": "" + } + } + }, + { + "prefix": "logos", + "lastModified": 1717652738, + "aliases": {}, + "width": 256, + "height": 256, + "icons": { + "docker-icon": { + "body": "", + "height": 185 + }, + "github-octocat": { + "body": "", + "height": 259.3 + }, + "opensource": { + "body": "", + "height": 248 + }, + "react": { + "body": "", + "height": 228 + }, + "redux": { + "body": "", + "height": 244 + }, + "typescript-icon": { + "body": "" + } + } + }, + { + "prefix": "mdi", + "lastModified": 1718880438, + "aliases": { + "edit": { + "parent": "pencil" + }, + "search": { + "parent": "magnify" + } + }, + "width": 24, + "height": 24, + "icons": { + "account-multiple": { + "body": "" + }, + "account-multiple-plus-outline": { + "body": "" + }, + "account-supervisor-outline": { + "body": "" + }, + "alert-circle-outline": { + "body": "" + }, + "arrow-left": { + "body": "" + }, + "arrow-right": { + "body": "" + }, + "bell-off-outline": { + "body": "" + }, + "camera-outline": { + "body": "" + }, + "check": { + "body": "" + }, + "checkbox-marked-outline": { + "body": "" + }, + "chevron-double-down": { + "body": "" + }, + "chevron-down": { + "body": "" + }, + "chevron-right": { + "body": "" + }, + "close": { + "body": "" + }, + "close-circle-outline": { + "body": "" + }, + "cloud-download-outline": { + "body": "" + }, + "cloud-upload": { + "body": "" + }, + "code-braces": { + "body": "" + }, + "cog": { + "body": "" + }, + "compass": { + "body": "" + }, + "content-copy": { + "body": "" + }, + "content-cut": { + "body": "" + }, + "delete-outline": { + "body": "" + }, + "disc-player": { + "body": "" + }, + "dock-window": { + "body": "" + }, + "dots-horizontal": { + "body": "" + }, + "dots-vertical": { + "body": "" + }, + "download": { + "body": "" + }, + "pencil": { + "body": "" + }, + "email-edit-outline": { + "body": "" + }, + "emoticon-happy-outline": { + "body": "" + }, + "eye-off-outline": { + "body": "" + }, + "eye-outline": { + "body": "" + }, + "file-question-outline": { + "body": "" + }, + "fullscreen": { + "body": "" + }, + "inbox-arrow-down": { + "body": "" + }, + "loading": { + "body": "" + }, + "logout-variant": { + "body": "" + }, + "magnify": { + "body": "" + }, + "menu": { + "body": "" + }, + "menu-open": { + "body": "" + }, + "message-badge-outline": { + "body": "" + }, + "message-processing-outline": { + "body": "" + }, + "message-reply-text-outline": { + "body": "" + }, + "message-text-outline": { + "body": "" + }, + "microphone": { + "body": "" + }, + "microphone-off": { + "body": "" + }, + "open-in-new": { + "body": "" + }, + "paperclip": { + "body": "" + }, + "pencil-off": { + "body": "" + }, + "pencil-outline": { + "body": "" + }, + "phone-in-talk": { + "body": "" + }, + "phone-remove-outline": { + "body": "" + }, + "pin": { + "body": "" + }, + "pin-off": { + "body": "" + }, + "plus": { + "body": "" + }, + "plus-circle-outline": { + "body": "" + }, + "pound": { + "body": "" + }, + "projector-screen-off-outline": { + "body": "" + }, + "projector-screen-outline": { + "body": "" + }, + "puzzle": { + "body": "" + }, + "radio-tower": { + "body": "" + }, + "reply": { + "body": "" + }, + "restore": { + "body": "" + }, + "send-circle-outline": { + "body": "" + }, + "square-edit-outline": { + "body": "" + }, + "text-search": { + "body": "" + }, + "trash-can-outline": { + "body": "" + }, + "video": { + "body": "" + }, + "video-box": { + "body": "" + }, + "video-off": { + "body": "" + }, + "web": { + "body": "" + } + } + }, + { + "prefix": "mingcute", + "lastModified": 1718880460, + "aliases": {}, + "width": 24, + "height": 24, + "icons": { + "voice-line": { + "body": "" + } + } + }, + { + "prefix": "openmoji", + "lastModified": 1718880543, + "aliases": {}, + "width": 72, + "height": 72, + "icons": { + "frog": { + "body": "" + } + } + } +] diff --git a/client/web/plugins/com.msgbyte.offline-icons/src/index.tsx b/client/web/plugins/com.msgbyte.offline-icons/src/index.tsx new file mode 100644 index 00000000000..5ae045e166b --- /dev/null +++ b/client/web/plugins/com.msgbyte.offline-icons/src/index.tsx @@ -0,0 +1,20 @@ +import { Icon } from '@capital/component'; +import icons from './icons.json'; + +const PLUGIN_ID = 'com.msgbyte.offline-icons'; +const PLUGIN_NAME = 'Offline Icons'; + +console.log(`Plugin ${PLUGIN_NAME}(${PLUGIN_ID}) is loaded`); + +// Icon.addIcon + +icons.forEach((collection) => { + if (!Icon.addCollection) { + console.warn( + 'Cannot call addCollection because of Icon.addCollection has not exposed!' + ); + return; + } + + Icon.addCollection(collection); +}); diff --git a/client/web/plugins/com.msgbyte.offline-icons/src/translate.ts b/client/web/plugins/com.msgbyte.offline-icons/src/translate.ts new file mode 100644 index 00000000000..e68307083d8 --- /dev/null +++ b/client/web/plugins/com.msgbyte.offline-icons/src/translate.ts @@ -0,0 +1,8 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + name: localTrans({ + 'zh-CN': 'Offline Icons', + 'en-US': 'Offline Icons', + }), +}; diff --git a/client/web/plugins/com.msgbyte.offline-icons/tsconfig.json b/client/web/plugins/com.msgbyte.offline-icons/tsconfig.json new file mode 100644 index 00000000000..89ae244bc87 --- /dev/null +++ b/client/web/plugins/com.msgbyte.offline-icons/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "resolveJsonModule": true, + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.offline-icons/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.offline-icons/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.offline-icons/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/client/web/plugins/com.msgbyte.openapi/manifest.json b/client/web/plugins/com.msgbyte.openapi/manifest.json new file mode 100644 index 00000000000..54f7fc786c4 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Openapi Platform Plugin", + "label.zh-CN": "开放平台插件", + "name": "com.msgbyte.openapi", + "url": "/plugins/com.msgbyte.openapi/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "Provide the operating capability of the open platform for the application", + "description.zh-CN": "为应用提供开放平台的操作能力", + "requireRestart": true +} diff --git a/web/plugins/com.msgbyte.openapi/package.json b/client/web/plugins/com.msgbyte.openapi/package.json similarity index 100% rename from web/plugins/com.msgbyte.openapi/package.json rename to client/web/plugins/com.msgbyte.openapi/package.json diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Bot.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Bot.tsx new file mode 100644 index 00000000000..b13a0d055a1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Bot.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { + DefaultFullModalInputEditorRender, + FullModalField, + Switch, +} from '@capital/component'; +import { useOpenAppInfo } from '../context'; +import { Translate } from '../../translate'; +import { useOpenAppAction } from './useOpenAppAction'; + +const Bot: React.FC = React.memo(() => { + const { capability, bot } = useOpenAppInfo(); + const { loading, handleChangeAppCapability, handleUpdateBotInfo } = + useOpenAppAction(); + + return ( +
+ handleChangeAppCapability('bot', checked)} + /> + } + /> + + {capability.includes('bot') && ( + + handleUpdateBotInfo('callbackUrl', String(str)) + } + /> + )} +
+ ); +}); +Bot.displayName = 'Bot'; + +export default Bot; diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/OAuth.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/OAuth.tsx new file mode 100644 index 00000000000..f1ffd19d5f8 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/OAuth.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { + FullModalField, + DefaultFullModalTextAreaEditorRender, + Switch, +} from '@capital/component'; +import { useOpenAppInfo } from '../context'; +import { useOpenAppAction } from './useOpenAppAction'; +import { Translate } from '../../translate'; + +const OAuth: React.FC = React.memo(() => { + const { capability, oauth } = useOpenAppInfo(); + const { loading, handleChangeAppCapability, handleUpdateOAuthInfo } = + useOpenAppAction(); + + return ( +
+ handleChangeAppCapability('oauth', checked)} + /> + } + /> + + {capability.includes('oauth') && ( + + {(oauth?.redirectUrls ?? []).map((url, i) => ( +

{url}

+ ))} + + } + value={(oauth?.redirectUrls ?? []).join('\n')} + editable={true} + renderEditor={DefaultFullModalTextAreaEditorRender} + onSave={(str: string) => + handleUpdateOAuthInfo( + 'redirectUrls', + String(str) + .split('\n') + .map((t) => t.trim()) + ) + } + /> + )} +
+ ); +}); +OAuth.displayName = 'OAuth'; + +export default OAuth; diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Profile.less b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Profile.less new file mode 100644 index 00000000000..bee1a56fe67 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Profile.less @@ -0,0 +1,5 @@ +.plugin-openapi-app-info_profile { + h2 { + margin-bottom: 10px; + } +} diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Profile.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Profile.tsx new file mode 100644 index 00000000000..c556a31cb5a --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Profile.tsx @@ -0,0 +1,89 @@ +import { useOpenAppInfo } from '../context'; +import React from 'react'; +import { + FullModalField, + Divider, + SensitiveText, + Button, + Avatar, + AvatarUploader, + DefaultFullModalInputEditorRender, +} from '@capital/component'; +import { Translate } from '../../translate'; +import { useOpenAppAction } from './useOpenAppAction'; +import styled from 'styled-components'; +import './Profile.less'; + +const TwoColumnContainer = styled.div` + display: flex; + + > div { + flex: 1; + } +`; + +/** + * 基础信息 + */ +const Profile: React.FC = React.memo(() => { + const { appId, appSecret, appName, appDesc, appIcon } = useOpenAppInfo(); + + const { handleSetAppInfo, handleDeleteApp } = useOpenAppAction(); + + return ( +
+

{Translate.app.basicInfo}

+ + +
+ handleSetAppInfo('appName', val)} + /> + + handleSetAppInfo('appDesc', val)} + /> +
+ +
+ { + handleSetAppInfo('appIcon', fileInfo.url); + }} + > + + +
+
+ + + +

{Translate.app.appcret}

+ +
+ + } + /> +
+ + + + +
+ ); +}); +Profile.displayName = 'Profile'; + +export default Profile; diff --git a/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Summary.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Summary.tsx similarity index 100% rename from web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Summary.tsx rename to client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Summary.tsx diff --git a/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Webpage.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Webpage.tsx similarity index 100% rename from web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Webpage.tsx rename to client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/Webpage.tsx diff --git a/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/index.less b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/index.less similarity index 100% rename from web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/index.less rename to client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/index.less diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/index.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/index.tsx new file mode 100644 index 00000000000..ef6794e54e2 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/index.tsx @@ -0,0 +1,83 @@ +import React, { useMemo } from 'react'; +import { Icon, SidebarView } from '@capital/component'; +import { Loadable, useEvent } from '@capital/common'; +import { useOpenAppInfo } from '../context'; +import { Translate } from '../../translate'; +import styled from 'styled-components'; +import './index.less'; + +const MenuTitle = styled.div` + display: flex; + + .iconify { + margin-right: 4px; + font-size: 16px; + cursor: pointer; + } +`; + +// const Summary = Loadable(() => import('./Summary')); +const Profile = Loadable(() => import('./Profile')); +const Bot = Loadable(() => import('./Bot')); +const Webpage = Loadable(() => import('./Webpage')); +const OAuth = Loadable(() => import('./OAuth')); + +const AppInfo: React.FC = React.memo(() => { + const { appName, onSelectApp } = useOpenAppInfo(); + + const handleBack = useEvent(() => { + onSelectApp(null); + }); + + const menu = useMemo( + () => [ + { + type: 'group', + title: ( + + {appName} + + ), + children: [ + // { + // type: 'item', + // title: '总览', + // content: , + // isDev: true, + // }, + { + type: 'item', + title: Translate.app.basicInfo, + content: , + }, + { + type: 'item', + title: Translate.app.bot, + content: , + }, + { + type: 'item', + title: Translate.app.webpage, + content: , + isDev: true, + }, + { + type: 'item', + title: Translate.app.oauth, + content: , + }, + ], + }, + ], + [] + ); + + return ( +
+ +
+ ); +}); +AppInfo.displayName = 'AppInfo'; + +export default AppInfo; diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/useOpenAppAction.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/useOpenAppAction.tsx new file mode 100644 index 00000000000..96612e589e2 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/AppInfo/useOpenAppAction.tsx @@ -0,0 +1,102 @@ +import { + openReconfirmModal, + postRequest, + showErrorToasts, + useAsyncFn, + useAsyncRequest, + useEvent, +} from '@capital/common'; +import { useOpenAppInfo } from '../context'; +import type { OpenAppBot, OpenAppCapability, OpenAppOAuth } from '../types'; + +/** + * 开放应用操作 + */ +export function useOpenAppAction() { + const { refresh, appId, capability, onSelectApp } = useOpenAppInfo(); + + const [{ loading }, handleChangeAppCapability] = useAsyncRequest( + async (targetCapability: OpenAppCapability, checked: boolean) => { + const newCapability: OpenAppCapability[] = [...capability]; + const findIndex = newCapability.findIndex((c) => c === targetCapability); + + if (checked) { + if (findIndex === -1) { + newCapability.push(targetCapability); + } + } else { + if (findIndex !== -1) { + newCapability.splice(findIndex, 1); + } + } + + await postRequest('/openapi/app/setAppCapability', { + appId, + capability: newCapability, + }); + await refresh(); + }, + [appId, capability, refresh] + ); + + const [, handleSetAppInfo] = useAsyncRequest( + async (fieldName: string, fieldValue: string) => { + await postRequest('/openapi/app/setAppInfo', { + appId, + fieldName, + fieldValue, + }); + await refresh(); + }, + [appId, refresh] + ); + + const [, handleUpdateOAuthInfo] = useAsyncRequest( + async (name: T, value: OpenAppOAuth[T]) => { + await postRequest('/openapi/app/setAppOAuthInfo', { + appId, + fieldName: name, + fieldValue: value, + }); + await refresh(); + }, + [] + ); + + const [, handleUpdateBotInfo] = useAsyncRequest( + async (name: T, value: OpenAppBot[T]) => { + await postRequest('/openapi/app/setAppBotInfo', { + appId, + fieldName: name, + fieldValue: value, + }); + await refresh(); + }, + [appId, refresh] + ); + + const handleDeleteApp = useEvent(() => { + openReconfirmModal({ + onConfirm: async () => { + try { + await postRequest('/openapi/app/delete', { + appId, + }); + onSelectApp(null); + await refresh(); + } catch (err) { + showErrorToasts(err); + } + }, + }); + }); + + return { + loading, + handleSetAppInfo, + handleDeleteApp, + handleChangeAppCapability, + handleUpdateOAuthInfo, + handleUpdateBotInfo, + }; +} diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/context.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/context.tsx new file mode 100644 index 00000000000..eb7578cb8b3 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/context.tsx @@ -0,0 +1,34 @@ +import React, { useContext } from 'react'; +import { OpenApp } from './types'; + +interface OpenAppInfoContextProps extends OpenApp { + refresh: () => Promise; + onSelectApp: (appId: string | null) => void; +} + +const OpenAppInfoContext = React.createContext(null); +OpenAppInfoContext.displayName = 'OpenAppInfoContext'; + +export const OpenAppInfoProvider: React.FC< + React.PropsWithChildren<{ + appInfo: OpenApp; + refresh: OpenAppInfoContextProps['refresh']; + onSelectApp: OpenAppInfoContextProps['onSelectApp']; + }> +> = (props) => { + return ( + + {props.children} + + ); +}; + +export function useOpenAppInfo() { + return useContext(OpenAppInfoContext); +} diff --git a/web/plugins/com.msgbyte.openapi/src/MainPanel/index.less b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/index.less similarity index 100% rename from web/plugins/com.msgbyte.openapi/src/MainPanel/index.less rename to client/web/plugins/com.msgbyte.openapi/src/MainPanel/index.less diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/index.tsx b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/index.tsx new file mode 100644 index 00000000000..ac1211d35ca --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/index.tsx @@ -0,0 +1,86 @@ +import React, { useMemo } from 'react'; +import { openModal, closeModal } from '@capital/common'; +import { Space, Table, Button, Loading } from '@capital/component'; +import { OpenApp } from './types'; +import AppInfo from './AppInfo'; +import { OpenAppInfoProvider } from './context'; +import { CreateOpenApp } from '../modals/CreateOpenApp'; +import { ServiceChecker } from '../components/ServiceChecker'; +import { useOpenAppList } from './useOpenAppList'; +import { Translate } from '../translate'; +import './index.less'; + +const OpenApiMainPanel: React.FC = React.memo(() => { + const { loading, allApps, refresh, appInfo, handleSetSelectedApp } = + useOpenAppList(); + + const columns = useMemo( + () => [ + { + title: Translate.name, + dataIndex: 'appName', + }, + { + title: Translate.operation, + key: 'action', + render: (_, record: OpenApp) => ( + + + + ), + }, + ], + [] + ); + + const handleCreateOpenApp = () => { + const key = openModal( + { + refresh(); + closeModal(key); + }} + /> + ); + }; + + return ( + +
+ {appInfo ? ( + + + + ) : ( + <> + + + + )} + + + ); +}); +OpenApiMainPanel.displayName = 'OpenApiMainPanel'; + +const OpenApiMainPanelWrapper = () => { + return ( + + + + ); +}; + +export default OpenApiMainPanelWrapper; diff --git a/client/web/plugins/com.msgbyte.openapi/src/MainPanel/types.ts b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/types.ts new file mode 100644 index 00000000000..f91bca74077 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/types.ts @@ -0,0 +1,29 @@ +const openAppCapability = [ + 'bot', // 机器人 + 'webpage', // 网页 + 'oauth', // 第三方登录 +] as const; + +export type OpenAppCapability = typeof openAppCapability[number]; + +export interface OpenAppOAuth { + redirectUrls: string[]; +} + +export interface OpenAppBot { + callbackUrl: string; +} + +export interface OpenApp { + _id: string; + appId: string; + appSecret: string; + appName: string; + appDesc: string; + appIcon: string; + capability: OpenAppCapability[]; + oauth?: OpenAppOAuth; + bot?: OpenAppBot; + + owner: string; +} diff --git a/web/plugins/com.msgbyte.openapi/src/MainPanel/useOpenAppList.ts b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/useOpenAppList.ts similarity index 82% rename from web/plugins/com.msgbyte.openapi/src/MainPanel/useOpenAppList.ts rename to client/web/plugins/com.msgbyte.openapi/src/MainPanel/useOpenAppList.ts index b7d834159e6..f51c8b88316 100644 --- a/web/plugins/com.msgbyte.openapi/src/MainPanel/useOpenAppList.ts +++ b/client/web/plugins/com.msgbyte.openapi/src/MainPanel/useOpenAppList.ts @@ -2,9 +2,10 @@ import { postRequest, appendUrlSearch, useAsyncRefresh, - useHistory, + useLocation, urlSearchParse, isValidStr, + useNavigate, } from '@capital/common'; import { useEffect, useState } from 'react'; import { OpenApp } from './types'; @@ -23,12 +24,13 @@ export function useOpenAppList() { return data ?? []; }, []); + const navigate = useNavigate(); - const history = useHistory(); + const location = useLocation(); useEffect(() => { // 仅初始化的时候才处理 - const { appId } = urlSearchParse(history.location.search, { + const { appId } = urlSearchParse(location.search, { ignoreQueryPrefix: true, }); @@ -45,9 +47,8 @@ export function useOpenAppList() { /** * 设置当前选中的开放app */ - handleSetSelectedApp(appId: string) { - history.push({ - ...history.location, + handleSetSelectedApp(appId: string | null) { + navigate({ search: appendUrlSearch({ appId, }), diff --git a/client/web/plugins/com.msgbyte.openapi/src/components/ServiceChecker.tsx b/client/web/plugins/com.msgbyte.openapi/src/components/ServiceChecker.tsx new file mode 100644 index 00000000000..2085785cf19 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/components/ServiceChecker.tsx @@ -0,0 +1,27 @@ +import { LoadingSpinner } from '@capital/component'; +import { fetchAvailableServices, useAsync } from '@capital/common'; +import React from 'react'; +import { Translate } from '../translate'; + +/** + * 服务监测 + */ +export const ServiceChecker: React.FC = React.memo( + (props) => { + const { loading, value: enabled } = useAsync(async () => { + const services = await fetchAvailableServices(); + return services.includes('openapi.app'); + }, []); + + if (loading) { + return ; + } + + if (!enabled) { + return
{Translate.noservice}
; + } + + return <>{props.children}; + } +); +ServiceChecker.displayName = 'ServiceChecker'; diff --git a/web/plugins/com.msgbyte.openapi/src/index.ts b/client/web/plugins/com.msgbyte.openapi/src/index.ts similarity index 100% rename from web/plugins/com.msgbyte.openapi/src/index.ts rename to client/web/plugins/com.msgbyte.openapi/src/index.ts diff --git a/client/web/plugins/com.msgbyte.openapi/src/modals/CreateOpenApp.tsx b/client/web/plugins/com.msgbyte.openapi/src/modals/CreateOpenApp.tsx new file mode 100644 index 00000000000..1a3ca16b3f4 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/modals/CreateOpenApp.tsx @@ -0,0 +1,56 @@ +import { + createFastFormSchema, + fieldSchema, + ModalWrapper, + postRequest, + showToasts, + showErrorToasts, +} from '@capital/common'; +import { WebFastForm } from '@capital/component'; +import React from 'react'; +import { Translate } from '../translate'; + +const schema = createFastFormSchema({ + appName: fieldSchema + .string() + .required(Translate.appNameCannotBeEmpty) + .max(20, Translate.appNameTooLong), + appDesc: fieldSchema.string(), +}); + +const fields = [ + { type: 'text', name: 'appName', label: Translate.app.appName }, + { + type: 'textarea', + name: 'appDesc', + label: Translate.app.appDesc, + }, +]; + +interface CreateOpenAppProps { + onSuccess?: () => void; +} +export const CreateOpenApp: React.FC = React.memo( + (props) => { + const handleSubmit = async (values: any) => { + try { + await postRequest('/openapi/app/create', { + ...values, + appIcon: '', + }); + + showToasts(Translate.createApplicationSuccess, 'success'); + props.onSuccess?.(); + } catch (e) { + showErrorToasts(e); + } + }; + + return ( + + + + ); + } +); +CreateOpenApp.displayName = 'CreateOpenApp'; diff --git a/client/web/plugins/com.msgbyte.openapi/src/translate.ts b/client/web/plugins/com.msgbyte.openapi/src/translate.ts new file mode 100644 index 00000000000..9958ad1d180 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/src/translate.ts @@ -0,0 +1,101 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + openapi: localTrans({ 'zh-CN': '开放平台', 'en-US': 'Open Api' }), + noservice: localTrans({ + 'zh-CN': '管理员没有开放 Openapi 服务', + 'en-US': 'The administrator did not open the Openapi service', + }), + enableBotCapability: localTrans({ + 'zh-CN': '开启机器人能力', + 'en-US': 'Enable Bot Capability', + }), + name: localTrans({ + 'zh-CN': '名称', + 'en-US': 'Name', + }), + operation: localTrans({ + 'zh-CN': '操作', + 'en-US': 'Operation', + }), + delete: localTrans({ + 'zh-CN': '删除', + 'en-US': 'Delete', + }), + enter: localTrans({ + 'zh-CN': '进入', + 'en-US': 'Enter', + }), + createApplication: localTrans({ + 'zh-CN': '创建应用', + 'en-US': 'Create Application', + }), + createApplicationSuccess: localTrans({ + 'zh-CN': '创建应用成功', + 'en-US': 'Create Application Success', + }), + appNameCannotBeEmpty: localTrans({ + 'zh-CN': '应用名不能为空', + 'en-US': 'App Name Cannot be Empty', + }), + appNameTooLong: localTrans({ + 'zh-CN': '应用名过长', + 'en-US': 'App Name too Long', + }), + app: { + basicInfo: localTrans({ + 'zh-CN': '基础信息', + 'en-US': 'Basic Info', + }), + appName: localTrans({ + 'zh-CN': '应用名称', + 'en-US': 'App Name', + }), + appDesc: localTrans({ + 'zh-CN': '应用描述', + 'en-US': 'App Description', + }), + bot: localTrans({ + 'zh-CN': '机器人', + 'en-US': 'Bot', + }), + webpage: localTrans({ + 'zh-CN': '网页', + 'en-US': 'Web Page', + }), + oauth: localTrans({ + 'zh-CN': '第三方登录', + 'en-US': 'OAuth', + }), + appcret: localTrans({ + 'zh-CN': '应用凭证', + 'en-US': 'Application Credentials', + }), + }, + bot: { + callback: localTrans({ + 'zh-CN': '消息回调地址', + 'en-US': 'Callback Url', + }), + callbackTip: localTrans({ + 'zh-CN': + '机器人被 @ 的时候会向该地址发送请求(收件箱接受到新内容时会发送回调)', + 'en-US': + 'The bot will send a request to this address when it is mentioned (callback will be sent when the inbox receives new content)', + }), + }, + oauth: { + open: localTrans({ + 'zh-CN': '开启 OAuth', + 'en-US': 'Open OAuth', + }), + allowedCallbackUrls: localTrans({ + 'zh-CN': '允许的回调地址', + 'en-US': 'Allowed Callback Urls', + }), + allowedCallbackUrlsTip: localTrans({ + 'zh-CN': '多个回调地址单独一行', + 'en-US': 'Multiple callback addresses on a single line', + }), + }, +}; diff --git a/client/web/plugins/com.msgbyte.openapi/tsconfig.json b/client/web/plugins/com.msgbyte.openapi/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.openapi/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.posthog/assets/icon.png b/client/web/plugins/com.msgbyte.posthog/assets/icon.png new file mode 100644 index 00000000000..c61e43a6ff3 Binary files /dev/null and b/client/web/plugins/com.msgbyte.posthog/assets/icon.png differ diff --git a/client/web/plugins/com.msgbyte.posthog/manifest.json b/client/web/plugins/com.msgbyte.posthog/manifest.json new file mode 100644 index 00000000000..d670902b7a1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.posthog/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Posthog", + "name": "com.msgbyte.posthog", + "url": "/plugins/com.msgbyte.posthog/index.js", + "icon": "/plugins/com.msgbyte.posthog/assets/icon.png", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Posthog Statistics", + "description.zh-CN": "Posthog 数据统计", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.posthog/package.json b/client/web/plugins/com.msgbyte.posthog/package.json new file mode 100644 index 00000000000..b9e2c37b763 --- /dev/null +++ b/client/web/plugins/com.msgbyte.posthog/package.json @@ -0,0 +1,18 @@ +{ + "name": "@plugins/com.msgbyte.posthog", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Posthog 数据统计", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": { + "posthog-js": "^1.35.0" + }, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.posthog/src/index.tsx b/client/web/plugins/com.msgbyte.posthog/src/index.tsx new file mode 100644 index 00000000000..d84372548b3 --- /dev/null +++ b/client/web/plugins/com.msgbyte.posthog/src/index.tsx @@ -0,0 +1,62 @@ +import posthog from 'posthog-js'; +import { sharedEvent } from '@capital/common'; + +try { + posthog.init('phc_xRCv3qbbOBMQkz31kbYMngXxn7Ey5JMu0BZIFktO6km', { + api_host: 'https://app.posthog.com/', + autocapture: false, // 关闭autocapture以节约事件用量 + disable_session_recording: true, // 关闭自动录屏(不需要且一直报错) + }); + + const PLUGIN_NAME = 'posthog'; + + console.log(`Plugin ${PLUGIN_NAME} is loaded`); + + setTimeout(() => { + console.log('Report plugin install status'); + + try { + const d = window.localStorage['$TailchatInstalledPlugins']; + if (!d) { + posthog.capture('Report Plugin', { + plugins: [], + pluginNum: 0, + pluginRaw: '', + }); + return; + } + const storage = JSON.parse(d); + const list = storage.rawData; + if (!list || !Array.isArray(list)) { + // 格式不匹配 + return; + } + + posthog.capture('Report Plugin', { + plugins: list.map((item) => item.name), // 主要收集名称列表 + pluginNum: list.length, + pluginRaw: JSON.stringify(list), // 原始信息 + }); + } catch (err) { + // Ignore error + } + }, 2000); + + sharedEvent.on('loginSuccess', (userInfo) => { + posthog.identify(userInfo._id, { + email: userInfo.email, + username: `${userInfo.nickname}#${userInfo.discriminator}`, + avatar: userInfo.avatar, + temporary: userInfo.temporary, + }); + }); + + sharedEvent.on('appLoaded', () => { + // 上报加载耗时 + posthog.capture('App Loaded', { + usage: performance.now(), + }); + }); +} catch (err) { + console.error(err); +} diff --git a/client/web/plugins/com.msgbyte.posthog/tsconfig.json b/client/web/plugins/com.msgbyte.posthog/tsconfig.json new file mode 100644 index 00000000000..79e593c1e54 --- /dev/null +++ b/client/web/plugins/com.msgbyte.posthog/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.posthog/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.posthog/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.posthog/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/client/web/plugins/com.msgbyte.sentry/assets/icon.png b/client/web/plugins/com.msgbyte.sentry/assets/icon.png new file mode 100644 index 00000000000..784210549a2 Binary files /dev/null and b/client/web/plugins/com.msgbyte.sentry/assets/icon.png differ diff --git a/client/web/plugins/com.msgbyte.sentry/manifest.json b/client/web/plugins/com.msgbyte.sentry/manifest.json new file mode 100644 index 00000000000..105522c25e0 --- /dev/null +++ b/client/web/plugins/com.msgbyte.sentry/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Sentry", + "name": "com.msgbyte.sentry", + "url": "/plugins/com.msgbyte.sentry/index.js", + "icon": "/plugins/com.msgbyte.sentry/assets/icon.png", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Sentry error handling", + "description.zh-CN": "Sentry 错误处理", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.sentry/package.json b/client/web/plugins/com.msgbyte.sentry/package.json new file mode 100644 index 00000000000..9bf6218e98d --- /dev/null +++ b/client/web/plugins/com.msgbyte.sentry/package.json @@ -0,0 +1,19 @@ +{ + "name": "@plugins/com.msgbyte.sentry", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Sentry 错误处理", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": { + "@sentry/react": "^7.38.0", + "@sentry/tracing": "^7.38.0" + }, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.sentry/src/index.tsx b/client/web/plugins/com.msgbyte.sentry/src/index.tsx new file mode 100644 index 00000000000..5e0c9f6af8f --- /dev/null +++ b/client/web/plugins/com.msgbyte.sentry/src/index.tsx @@ -0,0 +1 @@ +import('./lazy'); diff --git a/client/web/plugins/com.msgbyte.sentry/src/lazy.tsx b/client/web/plugins/com.msgbyte.sentry/src/lazy.tsx new file mode 100644 index 00000000000..f9e003fc78f --- /dev/null +++ b/client/web/plugins/com.msgbyte.sentry/src/lazy.tsx @@ -0,0 +1,31 @@ +import * as Sentry from '@sentry/react'; +import { BrowserTracing } from '@sentry/tracing'; +import { sharedEvent } from '@capital/common'; + +try { + Sentry.init({ + dsn: 'https://177fd98a1e9e4deba84146a769633c32@o4504196236836864.ingest.sentry.io/4504196241293312', + replaysSessionSampleRate: 0, + replaysOnErrorSampleRate: 1.0, + integrations: [new BrowserTracing(), new Sentry.Replay()], + + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: 0.1, // reduce sentry quota usage + + ignoreErrors: ['File Too Large'], + }); + + sharedEvent.on('loginSuccess', (userInfo) => { + Sentry.setUser({ + id: userInfo._id, + email: userInfo.email, + username: `${userInfo.nickname}#${userInfo.discriminator}`, + avatar: userInfo.avatar, + temporary: userInfo.temporary, + }); + }); +} catch (err) { + console.error(err); +} diff --git a/client/web/plugins/com.msgbyte.sentry/tsconfig.json b/client/web/plugins/com.msgbyte.sentry/tsconfig.json new file mode 100644 index 00000000000..79e593c1e54 --- /dev/null +++ b/client/web/plugins/com.msgbyte.sentry/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.sentry/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.sentry/types/tailchat.d.ts new file mode 100644 index 00000000000..1ab8bc10cd8 --- /dev/null +++ b/client/web/plugins/com.msgbyte.sentry/types/tailchat.d.ts @@ -0,0 +1,419 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/// + +/** + * 该文件由 Tailchat 自动生成 + * 用于插件的类型声明 + * 生成命令: pnpm run plugins:declaration:generate + */ + +/** + * Tailchat 通用 + */ +declare module '@capital/common' { + export const useGroupPanelParams: any; + + /** + * 打开模态框 + * @deprecated 请从 @capital/component 引入 + */ + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const closeModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const ModalWrapper: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const useModalContext: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const openConfirmModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const openReconfirmModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const Loadable: any; + + export const getGlobalState: any; + + export const useGlobalSocketEvent: ( + eventName: string, + callback: (data: T) => void + ) => void; + + export const getJWTUserInfo: () => Promise<{ + _id?: string; + nickname?: string; + email?: string; + avatar?: string; + }>; + + export const dataUrlToFile: any; + + export const urlSearchStringify: any; + + export const urlSearchParse: any; + + export const appendUrlSearch: any; + + export const getServiceWorkerRegistration: any; + + export const getServiceUrl: () => string; + + export const getCachedUserInfo: ( + userId: string, + refetch?: boolean + ) => Promise<{ + _id: string; + email: string; + nickname: string; + discriminator: string; + avatar: string | null; + temporary: boolean; + }>; + + export const getCachedConverseInfo: any; + + /** + * 本地翻译 + * @example + * localTrans({'zh-CN': '你好', 'en-US': 'Hello'}); + * + * @param trans 翻译对象 + */ + export const localTrans: (trans: Record<'zh-CN' | 'en-US', string>) => string; + + export const getLanguage: any; + + export const sharedEvent: any; + + export const useAsync: any; + + export const useAsyncFn: any; + + export const useAsyncRefresh: Promise>( + fn: T, + deps?: React.DependencyList + ) => [{ loading: boolean; value?: any; error?: Error }, T]; + + export const useAsyncRequest: Promise>( + fn: T, + deps?: React.DependencyList + ) => [{ loading: boolean; value?: any }, T]; + + export const uploadFile: any; + + export const showToasts: ( + message: string, + type?: 'info' | 'success' | 'error' | 'warning' + ) => void; + + export const showSuccessToasts: any; + + export const showErrorToasts: (error: any) => void; + + export const fetchAvailableServices: any; + + export const isValidStr: (str: any) => str is string; + + export const useGroupPanelInfo: any; + + export const sendMessage: any; + + export const showMessageTime: any; + + export const useLocation: any; + + export const useNavigate: any; + + export const createFastFormSchema: any; + + export const fieldSchema: any; + + export const useCurrentUserInfo: any; + + export const createPluginRequest: (pluginName: string) => { + get: (actionName: string, config?: any) => Promise; + post: (actionName: string, data?: any, config?: any) => Promise; + }; + + export const postRequest: any; + + export const pluginCustomPanel: any; + + export const regCustomPanel: any; + + export const pluginGroupPanel: any; + + export const regGroupPanel: any; + + export const messageInterpreter: any; + + export const regMessageInterpreter: any; + + export const getMessageRender: any; + + export const regMessageRender: any; + + export const getMessageTextDecorators: any; + + export const regMessageTextDecorators: any; + + export const ChatInputActionContextProps: any; + + export const pluginChatInputActions: any; + + export const regChatInputAction: any; + + export const regSocketEventListener: (item: { + eventName: string; + eventFn: (...args: any[]) => void; + }) => void; + + export const pluginColorScheme: any; + + export const regPluginColorScheme: any; + + export const pluginInspectServices: any; + + export const regInspectService: any; + + export const pluginMessageExtraParsers: any; + + export const regMessageExtraParser: any; + + export const pluginRootRoute: any; + + export const regPluginRootRoute: any; + + export const pluginPanelActions: any; + + export const regPluginPanelAction: any; + + export const pluginPermission: any; + + export const regPluginPermission: (permission: { + /** + * 权限唯一key, 用于写入数据库 + * 如果为插件则权限点应当符合命名规范, 如: plugin.com.msgbyte.github.manage + */ + key: string; + /** + * 权限点显示名称 + */ + title: string; + /** + * 权限描述 + */ + desc: string; + /** + * 是否默认开启 + */ + default: boolean; + /** + * 是否依赖其他权限点 + */ + required?: string[]; + }) => void; + + export const pluginGroupPanelBadges: any; + + export const regGroupPanelBadge: any; + + export const pluginGroupTextPanelExtraMenus: any; + + export const regPluginGroupTextPanelExtraMenu: any; + + export const useGroupIdContext: () => string; + + export const useGroupPanelContext: () => { + groupId: string; + panelId: string; + } | null; + + export const useSocketContext: any; +} + +/** + * Tailchat 组件 + */ +declare module '@capital/component' { + export const Button: any; + + export const Checkbox: any; + + export const Input: any; + + export const Divider: any; + + export const Space: any; + + export const Menu: any; + + export const Table: any; + + export const Switch: any; + + export const Tooltip: any; + + /** + * @link https://ant.design/components/notification-cn/ + */ + export const notification: any; + + export const Empty: React.FC< + React.PropsWithChildren<{ + prefixCls?: string; + className?: string; + style?: React.CSSProperties; + imageStyle?: React.CSSProperties; + image?: React.ReactNode; + description?: React.ReactNode; + }> + >; + + export const Avatar: any; + + export const SensitiveText: React.FC<{ className?: string; text: string }>; + + export const TextArea: any; + + export const Image: any; + + export const Icon: React.FC<{ icon: string } & React.SVGProps>; + + export const IconBtn: React.FC<{ + icon: string; + className?: string; + iconClassName?: string; + size?: 'small' | 'middle' | 'large'; + shape?: 'circle' | 'square'; + title?: string; + onClick?: React.MouseEventHandler; + }>; + + export const PillTabs: any; + + export const PillTabPane: any; + + export const LoadingSpinner: React.FC<{ tip?: string }>; + + export const WebFastForm: any; + + export const WebMetaForm: any; + + export const createMetaFormSchema: any; + + export const metaFormFieldSchema: any; + + export const FullModalField: any; + + export const DefaultFullModalInputEditorRender: any; + + export const DefaultFullModalTextAreaEditorRender: any; + + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loadable: any; + + export const Loading: React.FC<{ + spinning: boolean; + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + }>; + + export const LoadingOnFirst: React.FC<{ + spinning: boolean; + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + }>; + + export const SidebarView: any; + + export const GroupPanelSelector: any; + + export const Emoji: any; + + export const PortalAdd: any; + + export const PortalRemove: any; + + export const ErrorBoundary: any; + + export const UserAvatar: any; + + export const UserName: React.FC<{ + userId: string; + className?: string; + }>; + + export const Markdown: any; +} diff --git a/client/web/plugins/com.msgbyte.snapdrop/README.md b/client/web/plugins/com.msgbyte.snapdrop/README.md new file mode 100644 index 00000000000..7d7b5ef46d0 --- /dev/null +++ b/client/web/plugins/com.msgbyte.snapdrop/README.md @@ -0,0 +1,9 @@ +## com.msgbyte.snapdrop + +为 `Tailchat` 增加 局域网文件互传的功能 + +Powered by [snapdrop](https://github.com/RobinLinus/snapdrop.git) + +### 使用方式 + +仅需要在同一网络下两个设备均打开 [我 -> 隔空投送] 面板,单击或长按即可发送 diff --git a/client/web/plugins/com.msgbyte.snapdrop/assets/icon.png b/client/web/plugins/com.msgbyte.snapdrop/assets/icon.png new file mode 100644 index 00000000000..39225e7f752 Binary files /dev/null and b/client/web/plugins/com.msgbyte.snapdrop/assets/icon.png differ diff --git a/client/web/plugins/com.msgbyte.snapdrop/manifest.json b/client/web/plugins/com.msgbyte.snapdrop/manifest.json new file mode 100644 index 00000000000..4b8060279cf --- /dev/null +++ b/client/web/plugins/com.msgbyte.snapdrop/manifest.json @@ -0,0 +1,13 @@ +{ + "label": "Snapdrop", + "label.zh-CN": "隔空投送", + "name": "com.msgbyte.snapdrop", + "url": "/plugins/com.msgbyte.snapdrop/index.js", + "icon": "/plugins/com.msgbyte.snapdrop/assets/icon.png", + "documentUrl": "/plugins/com.msgbyte.snapdrop/README.md", + "version": "0.0.0", + "author": "msgbyte", + "description": "Snapdrop —— Send files and messages on the same network", + "description.zh-CN": "隔空投送 —— 在同一网络发送文件与消息", + "requireRestart": false +} diff --git a/client/web/plugins/com.msgbyte.snapdrop/package.json b/client/web/plugins/com.msgbyte.snapdrop/package.json new file mode 100644 index 00000000000..cdf75f5b0d4 --- /dev/null +++ b/client/web/plugins/com.msgbyte.snapdrop/package.json @@ -0,0 +1,8 @@ +{ + "name": "@plugins/com.msgbyte.snapdrop", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": { + } +} diff --git a/client/web/plugins/com.msgbyte.snapdrop/src/index.tsx b/client/web/plugins/com.msgbyte.snapdrop/src/index.tsx new file mode 100644 index 00000000000..29d4c62f1ad --- /dev/null +++ b/client/web/plugins/com.msgbyte.snapdrop/src/index.tsx @@ -0,0 +1,19 @@ +import { regCustomPanel } from '@capital/common'; +import { WebviewKeepAlive } from '@capital/component'; +import React from 'react'; +import { Translate } from './translate'; + +const PLUGIN_NAME = 'com.msgbyte.snapdrop'; + +regCustomPanel({ + name: `${PLUGIN_NAME}/personPanel`, + position: 'personal', + label: Translate.panelName, + icon: 'mdi:radio-tower', + render: () => ( + + ), +}); diff --git a/client/web/plugins/com.msgbyte.snapdrop/src/translate.ts b/client/web/plugins/com.msgbyte.snapdrop/src/translate.ts new file mode 100644 index 00000000000..7e8ec689afd --- /dev/null +++ b/client/web/plugins/com.msgbyte.snapdrop/src/translate.ts @@ -0,0 +1,5 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + panelName: localTrans({ 'zh-CN': '隔空投送', 'en-US': 'Snapdrop' }), +}; diff --git a/client/web/plugins/com.msgbyte.snapdrop/tsconfig.json b/client/web/plugins/com.msgbyte.snapdrop/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.snapdrop/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.theme.genshin/README.md b/client/web/plugins/com.msgbyte.theme.genshin/README.md new file mode 100644 index 00000000000..c2c09991654 --- /dev/null +++ b/client/web/plugins/com.msgbyte.theme.genshin/README.md @@ -0,0 +1,8 @@ +## 原神主题 + +包含主题如下: +- 原神-胡桃 +- 原神-琴 +- 原神-安柏 +- 原神-莫娜 +- 原神-罗莎莉亚 diff --git a/client/web/plugins/com.msgbyte.theme.genshin/assets/icon.jpg b/client/web/plugins/com.msgbyte.theme.genshin/assets/icon.jpg new file mode 100644 index 00000000000..293fef31cf6 Binary files /dev/null and b/client/web/plugins/com.msgbyte.theme.genshin/assets/icon.jpg differ diff --git a/client/web/plugins/com.msgbyte.theme.genshin/manifest.json b/client/web/plugins/com.msgbyte.theme.genshin/manifest.json new file mode 100644 index 00000000000..f01dc0a2f49 --- /dev/null +++ b/client/web/plugins/com.msgbyte.theme.genshin/manifest.json @@ -0,0 +1,13 @@ +{ + "label": "Genshin Theme", + "label.zh-CN": "原神主题", + "name": "com.msgbyte.theme.genshin", + "url": "/plugins/com.msgbyte.theme.genshin/index.js", + "icon": "/plugins/com.msgbyte.theme.genshin/assets/icon.jpg", + "version": "0.0.0", + "author": "msgbyte", + "description": "Genshin Theme", + "description.zh-CN": "原神主题", + "documentUrl": "/plugins/com.msgbyte.theme.genshin/README.md", + "requireRestart": false +} diff --git a/web/plugins/com.msgbyte.theme.genshin/package.json b/client/web/plugins/com.msgbyte.theme.genshin/package.json similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/package.json rename to client/web/plugins/com.msgbyte.theme.genshin/package.json diff --git a/web/plugins/com.msgbyte.theme.genshin/src/amber/avatar.png b/client/web/plugins/com.msgbyte.theme.genshin/src/amber/avatar.png similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/amber/avatar.png rename to client/web/plugins/com.msgbyte.theme.genshin/src/amber/avatar.png diff --git a/web/plugins/com.msgbyte.theme.genshin/src/amber/bg.jpeg b/client/web/plugins/com.msgbyte.theme.genshin/src/amber/bg.jpeg similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/amber/bg.jpeg rename to client/web/plugins/com.msgbyte.theme.genshin/src/amber/bg.jpeg diff --git a/web/plugins/com.msgbyte.theme.genshin/src/amber/theme.less b/client/web/plugins/com.msgbyte.theme.genshin/src/amber/theme.less similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/amber/theme.less rename to client/web/plugins/com.msgbyte.theme.genshin/src/amber/theme.less diff --git a/web/plugins/com.msgbyte.theme.genshin/src/hutao/avatar.png b/client/web/plugins/com.msgbyte.theme.genshin/src/hutao/avatar.png similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/hutao/avatar.png rename to client/web/plugins/com.msgbyte.theme.genshin/src/hutao/avatar.png diff --git a/web/plugins/com.msgbyte.theme.genshin/src/hutao/bg.jpg b/client/web/plugins/com.msgbyte.theme.genshin/src/hutao/bg.jpg similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/hutao/bg.jpg rename to client/web/plugins/com.msgbyte.theme.genshin/src/hutao/bg.jpg diff --git a/web/plugins/com.msgbyte.theme.genshin/src/hutao/theme.less b/client/web/plugins/com.msgbyte.theme.genshin/src/hutao/theme.less similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/hutao/theme.less rename to client/web/plugins/com.msgbyte.theme.genshin/src/hutao/theme.less diff --git a/web/plugins/com.msgbyte.theme.genshin/src/index.ts b/client/web/plugins/com.msgbyte.theme.genshin/src/index.ts similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/index.ts rename to client/web/plugins/com.msgbyte.theme.genshin/src/index.ts diff --git a/web/plugins/com.msgbyte.theme.genshin/src/jean/avatar.png b/client/web/plugins/com.msgbyte.theme.genshin/src/jean/avatar.png similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/jean/avatar.png rename to client/web/plugins/com.msgbyte.theme.genshin/src/jean/avatar.png diff --git a/web/plugins/com.msgbyte.theme.genshin/src/jean/bg.jpeg b/client/web/plugins/com.msgbyte.theme.genshin/src/jean/bg.jpeg similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/jean/bg.jpeg rename to client/web/plugins/com.msgbyte.theme.genshin/src/jean/bg.jpeg diff --git a/web/plugins/com.msgbyte.theme.genshin/src/jean/theme.less b/client/web/plugins/com.msgbyte.theme.genshin/src/jean/theme.less similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/jean/theme.less rename to client/web/plugins/com.msgbyte.theme.genshin/src/jean/theme.less diff --git a/web/plugins/com.msgbyte.theme.genshin/src/mona/avatar.png b/client/web/plugins/com.msgbyte.theme.genshin/src/mona/avatar.png similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/mona/avatar.png rename to client/web/plugins/com.msgbyte.theme.genshin/src/mona/avatar.png diff --git a/web/plugins/com.msgbyte.theme.genshin/src/mona/bg.jpeg b/client/web/plugins/com.msgbyte.theme.genshin/src/mona/bg.jpeg similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/mona/bg.jpeg rename to client/web/plugins/com.msgbyte.theme.genshin/src/mona/bg.jpeg diff --git a/web/plugins/com.msgbyte.theme.genshin/src/mona/theme.less b/client/web/plugins/com.msgbyte.theme.genshin/src/mona/theme.less similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/mona/theme.less rename to client/web/plugins/com.msgbyte.theme.genshin/src/mona/theme.less diff --git a/web/plugins/com.msgbyte.theme.genshin/src/rosaria/avatar.png b/client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/avatar.png similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/rosaria/avatar.png rename to client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/avatar.png diff --git a/web/plugins/com.msgbyte.theme.genshin/src/rosaria/bg.jpeg b/client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/bg.jpeg similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/rosaria/bg.jpeg rename to client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/bg.jpeg diff --git a/web/plugins/com.msgbyte.theme.genshin/src/rosaria/theme.less b/client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/theme.less similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/src/rosaria/theme.less rename to client/web/plugins/com.msgbyte.theme.genshin/src/rosaria/theme.less diff --git a/client/web/plugins/com.msgbyte.theme.genshin/tsconfig.json b/client/web/plugins/com.msgbyte.theme.genshin/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.theme.genshin/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/web/plugins/com.msgbyte.theme.genshin/types/index.d.ts b/client/web/plugins/com.msgbyte.theme.genshin/types/index.d.ts similarity index 100% rename from web/plugins/com.msgbyte.theme.genshin/types/index.d.ts rename to client/web/plugins/com.msgbyte.theme.genshin/types/index.d.ts diff --git a/client/web/plugins/com.msgbyte.theme.miku/manifest.json b/client/web/plugins/com.msgbyte.theme.miku/manifest.json new file mode 100644 index 00000000000..72e01a928b6 --- /dev/null +++ b/client/web/plugins/com.msgbyte.theme.miku/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Hatsune Miku Theme", + "label.zh-CN": "Miku初音未来主题", + "name": "com.msgbyte.theme.miku", + "url": "/plugins/com.msgbyte.theme.miku/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "Hatsune Miku theme, supports light and dark colors", + "description.zh-CN": "初音未来主题,支持亮色与暗色", + "requireRestart": false +} diff --git a/web/plugins/com.msgbyte.theme.miku/package.json b/client/web/plugins/com.msgbyte.theme.miku/package.json similarity index 100% rename from web/plugins/com.msgbyte.theme.miku/package.json rename to client/web/plugins/com.msgbyte.theme.miku/package.json diff --git a/web/plugins/com.msgbyte.theme.miku/src/bg.jpg b/client/web/plugins/com.msgbyte.theme.miku/src/bg.jpg similarity index 100% rename from web/plugins/com.msgbyte.theme.miku/src/bg.jpg rename to client/web/plugins/com.msgbyte.theme.miku/src/bg.jpg diff --git a/web/plugins/com.msgbyte.theme.miku/src/index.ts b/client/web/plugins/com.msgbyte.theme.miku/src/index.ts similarity index 100% rename from web/plugins/com.msgbyte.theme.miku/src/index.ts rename to client/web/plugins/com.msgbyte.theme.miku/src/index.ts diff --git a/web/plugins/com.msgbyte.theme.miku/src/theme.less b/client/web/plugins/com.msgbyte.theme.miku/src/theme.less similarity index 100% rename from web/plugins/com.msgbyte.theme.miku/src/theme.less rename to client/web/plugins/com.msgbyte.theme.miku/src/theme.less diff --git a/client/web/plugins/com.msgbyte.theme.miku/tsconfig.json b/client/web/plugins/com.msgbyte.theme.miku/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.theme.miku/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/web/plugins/com.msgbyte.theme.miku/types/index.d.ts b/client/web/plugins/com.msgbyte.theme.miku/types/index.d.ts similarity index 100% rename from web/plugins/com.msgbyte.theme.miku/types/index.d.ts rename to client/web/plugins/com.msgbyte.theme.miku/types/index.d.ts diff --git a/client/web/plugins/com.msgbyte.toolwa/assets/icon.png b/client/web/plugins/com.msgbyte.toolwa/assets/icon.png new file mode 100644 index 00000000000..40bf05b0233 Binary files /dev/null and b/client/web/plugins/com.msgbyte.toolwa/assets/icon.png differ diff --git a/client/web/plugins/com.msgbyte.toolwa/manifest.json b/client/web/plugins/com.msgbyte.toolwa/manifest.json new file mode 100644 index 00000000000..5e18a1f70b3 --- /dev/null +++ b/client/web/plugins/com.msgbyte.toolwa/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "Tool frog!", + "label.zh-CN": "工具哇!", + "name": "com.msgbyte.toolwa", + "url": "/plugins/com.msgbyte.toolwa/index.js", + "icon": "/plugins/com.msgbyte.toolwa/assets/icon.png", + "version": "0.0.0", + "author": "msgbyte", + "description": "Tool frog —— online tools", + "description.zh-CN": "工具哇 —— 在线小工具", + "requireRestart": false +} diff --git a/client/web/plugins/com.msgbyte.toolwa/package.json b/client/web/plugins/com.msgbyte.toolwa/package.json new file mode 100644 index 00000000000..24203a8c401 --- /dev/null +++ b/client/web/plugins/com.msgbyte.toolwa/package.json @@ -0,0 +1,8 @@ +{ + "name": "@plugins/com.msgbyte.toolwa", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": { + } +} diff --git a/client/web/plugins/com.msgbyte.toolwa/src/index.tsx b/client/web/plugins/com.msgbyte.toolwa/src/index.tsx new file mode 100644 index 00000000000..05b3ce509dc --- /dev/null +++ b/client/web/plugins/com.msgbyte.toolwa/src/index.tsx @@ -0,0 +1,16 @@ +import { regCustomPanel } from '@capital/common'; +import { Webview } from '@capital/component'; +import React from 'react'; +import { Translate } from './translate'; + +const PLUGIN_NAME = 'com.msgbyte.toolwa'; + +regCustomPanel({ + name: `${PLUGIN_NAME}/personPanel`, + position: 'personal', + label: Translate.panelName, + icon: 'openmoji:frog', + render: () => ( + + ), +}); diff --git a/client/web/plugins/com.msgbyte.toolwa/src/translate.ts b/client/web/plugins/com.msgbyte.toolwa/src/translate.ts new file mode 100644 index 00000000000..2e7f19b80b0 --- /dev/null +++ b/client/web/plugins/com.msgbyte.toolwa/src/translate.ts @@ -0,0 +1,5 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + panelName: localTrans({ 'zh-CN': '工具哇!', 'en-US': 'Toolwa!' }), +}; diff --git a/client/web/plugins/com.msgbyte.toolwa/tsconfig.json b/client/web/plugins/com.msgbyte.toolwa/tsconfig.json new file mode 100644 index 00000000000..4fb56fb6ed5 --- /dev/null +++ b/client/web/plugins/com.msgbyte.toolwa/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "paths": { + "@capital/*": ["../../src/plugin/*"], + } + } +} diff --git a/client/web/plugins/com.msgbyte.user.location/manifest.json b/client/web/plugins/com.msgbyte.user.location/manifest.json new file mode 100644 index 00000000000..9b99194a5aa --- /dev/null +++ b/client/web/plugins/com.msgbyte.user.location/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "User Location", + "label.zh-CN": "用户地理位置", + "name": "com.msgbyte.user.location", + "url": "/plugins/com.msgbyte.user.location/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add geographic location records for user information", + "description.zh-CN": "为用户信息增加地理位置记录", + "requireRestart": true +} diff --git a/client/web/plugins/com.msgbyte.user.location/package.json b/client/web/plugins/com.msgbyte.user.location/package.json new file mode 100644 index 00000000000..b93547bc42f --- /dev/null +++ b/client/web/plugins/com.msgbyte.user.location/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/com.msgbyte.user.location", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "为用户信息增加地理位置记录", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/client/web/plugins/com.msgbyte.user.location/src/index.tsx b/client/web/plugins/com.msgbyte.user.location/src/index.tsx new file mode 100644 index 00000000000..d70b714267e --- /dev/null +++ b/client/web/plugins/com.msgbyte.user.location/src/index.tsx @@ -0,0 +1,6 @@ +import { regUserExtraInfo, localTrans } from '@capital/common'; + +regUserExtraInfo({ + name: 'location', + label: localTrans({ 'zh-CN': '所在城市', 'en-US': 'City' }), +}); diff --git a/client/web/plugins/com.msgbyte.user.location/tsconfig.json b/client/web/plugins/com.msgbyte.user.location/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/client/web/plugins/com.msgbyte.user.location/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/client/web/plugins/com.msgbyte.user.location/types/tailchat.d.ts b/client/web/plugins/com.msgbyte.user.location/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/client/web/plugins/com.msgbyte.user.location/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/web/plugins/com.msgbyte.webview/README.md b/client/web/plugins/com.msgbyte.webview/README.md similarity index 100% rename from web/plugins/com.msgbyte.webview/README.md rename to client/web/plugins/com.msgbyte.webview/README.md diff --git a/client/web/plugins/com.msgbyte.webview/manifest.json b/client/web/plugins/com.msgbyte.webview/manifest.json new file mode 100644 index 00000000000..da50e8ebc26 --- /dev/null +++ b/client/web/plugins/com.msgbyte.webview/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "Web Panel Plugin", + "label.zh-CN": "网页面板插件", + "name": "com.msgbyte.webview", + "url": "/plugins/com.msgbyte.webview/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "Provides groups with the ability to create web panels", + "description.zh-CN": "为群组提供创建网页面板的功能", + "documentUrl": "/plugins/com.msgbyte.webview/README.md", + "requireRestart": false +} diff --git a/client/web/plugins/com.msgbyte.webview/package.json b/client/web/plugins/com.msgbyte.webview/package.json new file mode 100644 index 00000000000..fce439f018c --- /dev/null +++ b/client/web/plugins/com.msgbyte.webview/package.json @@ -0,0 +1,10 @@ +{ + "name": "@plugins/com.msgbyte.webview", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": { + "url-regex": "^5.0.0", + "xss": "^1.0.14" + } +} diff --git a/client/web/plugins/com.msgbyte.webview/src/group/GroupCustomWebPanelRender.tsx b/client/web/plugins/com.msgbyte.webview/src/group/GroupCustomWebPanelRender.tsx new file mode 100644 index 00000000000..131a536cd31 --- /dev/null +++ b/client/web/plugins/com.msgbyte.webview/src/group/GroupCustomWebPanelRender.tsx @@ -0,0 +1,118 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { Translate } from '../translate'; +import { FilterXSS, getDefaultWhiteList } from 'xss'; +import { useWatch } from '@capital/common'; +import { GroupExtraDataPanel, NoData, TextArea } from '@capital/component'; +import styled from 'styled-components'; + +const EditModalContent = styled.div` + padding: 10px; + width: 80vw; + height: 80vh; + display: flex; + flex-direction: column; + overflow: hidden; + + .main { + flex: 1; + overflow: hidden; + + > textarea { + height: 100%; + resize: none; + } + } +`; + +const xss = new FilterXSS({ + css: false, + whiteList: { ...getDefaultWhiteList(), iframe: ['src', 'style', 'class'] }, + onIgnoreTag: function (tag, html, options) { + if (['html', 'body', 'head', 'meta', 'style', 'div'].includes(tag)) { + // 不对其属性列表进行过滤 + return html; + } + }, +}); + +function getInjectedStyle() { + try { + // 当前面板文本颜色 + const currentTextColor = document.defaultView.getComputedStyle( + document.querySelector('.tc-content-background') + ).color; + + return ``; + } catch (e) { + return ''; + } +} + +const GroupCustomWebPanelRender: React.FC<{ html: string }> = (props) => { + const ref = useRef(null); + const html = props.html; + + useEffect(() => { + if (!ref.current || !html) { + return; + } + + const doc = ref.current.contentWindow.document; + doc.open(); + doc.writeln(getInjectedStyle(), xss.process(html)); + doc.close(); + }, [html]); + + if (!html) { + return ; + } + + return [/md] + // + return ( + transformUrl(src)} + transformLinkUri={(href) => transformUrl(href)} + remarkPlugins={[remarkGfm]} + rehypePlugins={[rehypeRaw, rehypeSanitize]} + linkTarget="_blank" + skipHtml={true} + components={components} + > + {raw} + + ); +}); +Markdown.displayName = 'Markdown'; diff --git a/web/src/components/Modal.less b/client/web/src/components/Modal.less similarity index 100% rename from web/src/components/Modal.less rename to client/web/src/components/Modal.less diff --git a/web/src/components/Modal.tsx b/client/web/src/components/Modal.tsx similarity index 86% rename from web/src/components/Modal.tsx rename to client/web/src/components/Modal.tsx index cf1b704d8bd..0dec3511648 100644 --- a/web/src/components/Modal.tsx +++ b/client/web/src/components/Modal.tsx @@ -1,4 +1,9 @@ -import React, { useCallback, useContext, useState } from 'react'; +import React, { + PropsWithChildren, + useCallback, + useContext, + useState, +} from 'react'; import _isFunction from 'lodash/isFunction'; import _isNil from 'lodash/isNil'; import _last from 'lodash/last'; @@ -7,7 +12,7 @@ import _isString from 'lodash/isString'; import _noop from 'lodash/noop'; import { PortalAdd, PortalRemove } from './Portal'; import { Button, Typography } from 'antd'; -import { Icon } from '@/components/Icon'; +import { Icon } from 'tailchat-design'; import { CSSTransition } from 'react-transition-group'; import clsx from 'clsx'; import { useIsMobile } from '@/hooks/useIsMobile'; @@ -30,7 +35,7 @@ const ModalContext = React.createContext<{ closeModal: _noop, }); -interface ModalProps { +interface ModalProps extends PropsWithChildren { visible?: boolean; onChangeVisible?: (visible: boolean) => void; @@ -136,17 +141,20 @@ export function closeModal(key?: number): void { export function openModal( content: React.ReactNode, props?: Pick & { - onCloseModal?: () => void; + onCloseModal?: () => void | Promise; } ): number { const key = PortalAdd( { + onChangeVisible={async (visible) => { if (visible === false) { + if (typeof props?.onCloseModal === 'function') { + await props.onCloseModal(); + } + closeModal(key); - props?.onCloseModal?.(); } }} > @@ -197,7 +205,7 @@ export function openConfirmModal(props: OpenConfirmModalProps) { type OpenReconfirmModalProps = Pick< OpenConfirmModalProps, - 'onConfirm' | 'onCancel' + 'title' | 'content' | 'onConfirm' | 'onCancel' >; /** * 打开再次确认操作modal @@ -206,8 +214,8 @@ export function openReconfirmModal(props: OpenReconfirmModalProps) { openConfirmModal({ onConfirm: props.onConfirm, onCancel: props.onCancel, - title: t('确认要进行该操作么?'), - content: t('该操作无法被撤回'), + title: props.title ?? t('确认要进行该操作么?'), + content: props.content ?? t('该操作无法被撤回'), }); } /** @@ -218,7 +226,7 @@ export function openReconfirmModal(props: OpenReconfirmModalProps) { * } */ export function openReconfirmModalP( - props?: Omit + props?: Omit ): Promise { return new Promise((resolve) => { openReconfirmModal({ @@ -241,11 +249,13 @@ export function useModalContext() { /** * 标准模态框包装器 */ -export const ModalWrapper: React.FC<{ - title?: string; - className?: string; - style?: React.CSSProperties; -}> = React.memo((props) => { +export const ModalWrapper: React.FC< + PropsWithChildren<{ + title?: string; + className?: string; + style?: React.CSSProperties; + }> +> = React.memo((props) => { const isMobile = useIsMobile(); const title = _isString(props.title) ? ( @@ -256,7 +266,7 @@ export const ModalWrapper: React.FC<{ return (
{title} diff --git a/client/web/src/components/NoData.tsx b/client/web/src/components/NoData.tsx new file mode 100644 index 00000000000..3d9f590a82e --- /dev/null +++ b/client/web/src/components/NoData.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { Empty } from 'antd'; +import { t } from 'tailchat-shared'; + +interface NoDataProps { + message?: string; +} + +/** + * 没有数据或没找到数据 + */ +export const NoData: React.FC = React.memo((props) => { + return ; +}); +NoData.displayName = 'NoData'; diff --git a/client/web/src/components/NotFound.tsx b/client/web/src/components/NotFound.tsx new file mode 100644 index 00000000000..9a195880f62 --- /dev/null +++ b/client/web/src/components/NotFound.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { Empty } from 'antd'; +import { t } from 'tailchat-shared'; + +interface NotFoundProps { + message?: string; +} + +/** + * 没有数据或没找到数据 + */ +export const NotFound: React.FC = React.memo((props) => { + return ; +}); +NotFound.displayName = 'NotFound'; diff --git a/web/src/components/OpenedPanelTip.tsx b/client/web/src/components/OpenedPanelTip.tsx similarity index 100% rename from web/src/components/OpenedPanelTip.tsx rename to client/web/src/components/OpenedPanelTip.tsx diff --git a/web/src/components/Panel/common/Header.tsx b/client/web/src/components/Panel/common/Header.tsx similarity index 87% rename from web/src/components/Panel/common/Header.tsx rename to client/web/src/components/Panel/common/Header.tsx index 533091dcf3a..690d2f8ec42 100644 --- a/web/src/components/Panel/common/Header.tsx +++ b/client/web/src/components/Panel/common/Header.tsx @@ -1,8 +1,8 @@ import { SectionHeader } from '@/components/SectionHeader'; import { Space } from 'antd'; -import React from 'react'; +import React, { PropsWithChildren } from 'react'; -interface PanelCommonHeaderProps { +interface PanelCommonHeaderProps extends PropsWithChildren { prefix?: React.ReactNode; suffix?: React.ReactNode; actions?: React.ReactNode[]; diff --git a/client/web/src/components/Panel/common/MessageSearch.tsx b/client/web/src/components/Panel/common/MessageSearch.tsx new file mode 100644 index 00000000000..b4ce176ca52 --- /dev/null +++ b/client/web/src/components/Panel/common/MessageSearch.tsx @@ -0,0 +1,62 @@ +import { NormalMessage } from '@/components/ChatBox/ChatMessageList/Item'; +import { Empty, Input } from 'antd'; +import React from 'react'; +import { + ChatMessage, + model, + showToasts, + t, + useAsyncRequest, +} from 'tailchat-shared'; + +export const MessageSearchPanel: React.FC<{ + groupId?: string; + converseId: string; +}> = React.memo((props) => { + const { groupId, converseId } = props; + const [{ loading, value = [] }, handleSearch] = useAsyncRequest( + async (searchText: string) => { + if (searchText.length < 3) { + showToasts(t('搜索内容太短无法搜索')); + return; + } + const messages = await model.message.searchMessage( + searchText, + converseId, + groupId + ); + + return messages ?? []; + } + ); + + const searchedMessages = value as ChatMessage[]; + + return ( +
+ + + {/* Result List */} +
+ {searchedMessages.length === 0 && ( + + )} + + {searchedMessages.map((message) => ( + + ))} +
+
+ ); +}); +MessageSearchPanel.displayName = 'MessageSearchPanel'; diff --git a/client/web/src/components/Panel/common/Wrapper.tsx b/client/web/src/components/Panel/common/Wrapper.tsx new file mode 100644 index 00000000000..f1db0f600a0 --- /dev/null +++ b/client/web/src/components/Panel/common/Wrapper.tsx @@ -0,0 +1,74 @@ +import React, { PropsWithChildren, useState } from 'react'; +import { PanelCommonHeader } from '../common/Header'; +import clsx from 'clsx'; +import { useIsMobile } from '@/hooks/useIsMobile'; +import { IconBtn } from '@/components/IconBtn'; + +interface RightPanelType { + name: string; + panel: React.ReactNode; +} + +/** + * 面板通用包装器 + */ +export interface CommonPanelWrapperProps extends PropsWithChildren { + header: React.ReactNode; + actions?: (ctx: { + setRightPanel: (info: RightPanelType) => void; + }) => React.ReactElement[]; +} +export const CommonPanelWrapper: React.FC = React.memo( + (props) => { + const [rightPanel, setRightPanel] = useState(); + const isMobile = useIsMobile(); + + return ( +
+ {/* 主面板 */} +
+ + {props.header} + +
{props.children}
+
+ + {/* 右侧面板 */} +
+ setRightPanel(undefined)} + />, + ]} + > + {rightPanel?.name} + + +
{rightPanel?.panel}
+
+
+ ); + } +); +CommonPanelWrapper.displayName = 'CommonPanelWrapper'; diff --git a/client/web/src/components/Panel/group/GroupExtraDataPanel.tsx b/client/web/src/components/Panel/group/GroupExtraDataPanel.tsx new file mode 100644 index 00000000000..e9cba7223ad --- /dev/null +++ b/client/web/src/components/Panel/group/GroupExtraDataPanel.tsx @@ -0,0 +1,149 @@ +import { useGroupPanelContext } from '@/context/GroupPanelContext'; +import React, { useReducer, useRef } from 'react'; +import { + model, + PERMISSION, + showSuccessToasts, + showToasts, + t, + useAsync, + useHasGroupPermission, + useMemoizedFn, +} from 'tailchat-shared'; +import { Problem } from '@/components/Problem'; +import { ErrorView } from '@/components/ErrorView'; +import { Loading } from '@/components/Loading'; +import { GroupPanelContainer } from './shared/GroupPanelContainer'; +import { IconBtn } from '@/components/IconBtn'; +import { openModal } from '@/components/Modal'; +import _isEqual from 'lodash/isEqual'; + +type GroupExtraDataPanelRenderInfo = Record; // + +interface GroupExtraDataPanelInnerProps extends GroupExtraDataPanelProps { + groupId: string; + panelId: string; +} + +/** + * A Component which can edit panel and display with group extra data + */ +const GroupExtraDataPanelInner: React.FC = + React.memo((props) => { + const { groupId, panelId, names } = props; + const [updateIndex, updateInfo] = useReducer((state) => state + 1, 0); + const { + value: info = {}, + loading, + error, + } = useAsync(async () => { + const list = await Promise.all( + names.map((name) => + model.group + .getGroupPanelExtraData(props.groupId, props.panelId, name) + .then((data) => ({ + name, + data, + })) + ) + ); + + return list.reduce((prev, curr) => { + return { + ...prev, + [curr.name]: curr.data, + }; + }, {}); + }, [groupId, panelId, names, updateIndex]); + + const [hasPermission] = useHasGroupPermission(groupId, [ + PERMISSION.core.managePanel, + ]); + + const savingRef = useRef(false); + const handleEdit = useMemoizedFn(() => { + const dataMap = { ...info }; + if (!props.renderEdit) { + console.warn('[GroupExtraDataPanel] Please set renderEdit'); + return; + } + + const handleSave = async () => { + if (savingRef.current === true) { + showToasts(t('正在保存, 请稍后')); + return; + } + + if (!_isEqual(dataMap, info)) { + savingRef.current = true; + await Promise.all( + Object.entries(dataMap).map(([name, data]) => + model.group.saveGroupPanelExtraData(groupId, panelId, name, data) + ) + ); + + savingRef.current = false; + updateInfo(); + + showSuccessToasts(); + } + }; + + openModal(props.renderEdit(dataMap), { + onCloseModal: handleSave, + }); + }); + + if (error) { + return ; + } + + return ( + + hasPermission + ? [ + , + ] + : [] + } + > + +
{props.render(info)}
+
+
+ ); + }); +GroupExtraDataPanelInner.displayName = 'GroupExtraDataPanelInner'; + +interface GroupExtraDataPanelProps { + names: string[]; + renderEdit: (dataMap: Record) => React.ReactNode; + render: (info: GroupExtraDataPanelRenderInfo) => React.ReactNode; +} +export const GroupExtraDataPanel: React.FC = + React.memo((props) => { + const context = useGroupPanelContext(); + + if (context === null) { + return ; + } + + return ( + + ); + }); +GroupExtraDataPanel.displayName = 'GroupExtraDataPanel'; diff --git a/client/web/src/components/Panel/group/MembersPanel.tsx b/client/web/src/components/Panel/group/MembersPanel.tsx new file mode 100644 index 00000000000..7547a6b2940 --- /dev/null +++ b/client/web/src/components/Panel/group/MembersPanel.tsx @@ -0,0 +1,156 @@ +import { Icon } from 'tailchat-design'; +import { UserListItem } from '@/components/UserListItem'; +import { Dropdown, Input, Skeleton } from 'antd'; +import React, { useMemo } from 'react'; +import { + getGroupConfigWithInfo, + t, + useCachedOnlineStatus, + useGroupInfo, + UserBaseInfo, +} from 'tailchat-shared'; +import { Problem } from '@/components/Problem'; +import { useGroupMemberAction } from '@/hooks/useGroupMemberAction'; +import { UserPopover } from '@/components/popover/UserPopover'; +import { GroupedVirtuoso } from 'react-virtuoso'; +import _take from 'lodash/take'; +import _sum from 'lodash/sum'; +import _get from 'lodash/get'; + +interface MembersPanelProps { + groupId: string; +} + +/** + * 用户面板 + */ +export const MembersPanel: React.FC = React.memo((props) => { + const groupId = props.groupId; + const groupInfo = useGroupInfo(groupId); + const members = groupInfo?.members ?? []; + const membersOnlineStatus = useCachedOnlineStatus( + members.map((m) => m.userId) + ); + const { hideGroupMemberDiscriminator } = getGroupConfigWithInfo(groupInfo); + + const { + userInfos, + searchText, + setSearchText, + isSearching, + searchResult: filteredGroupMembers, + generateActionMenu, + } = useGroupMemberAction(groupId); + + const sortedMembers = useMemo(() => { + const online: UserBaseInfo[] = []; + const offline: UserBaseInfo[] = []; + + userInfos.forEach((m, i) => { + if (membersOnlineStatus[i] === true) { + online.push(m); + } else { + offline.push(m); + } + }); + + return { + [t('在线')]: online, + [t('离线')]: offline, + }; + }, [userInfos, membersOnlineStatus]); + + const { groupCounts, groupNames, getGroupedMemberInfo } = useMemo(() => { + const groupMemberInfo = isSearching + ? { '': filteredGroupMembers } + : sortedMembers; + + const groupCounts = Object.values(groupMemberInfo).map( + (item) => item.length + ); + const groupNames = Object.keys(groupMemberInfo); + + const getGroupedMemberInfo = ( + index: number, + groupIndex: number + ): UserBaseInfo | null => { + const groupName = groupNames[groupIndex]; + const prevIndexCount = _sum(_take(groupCounts, groupIndex)); + const currentGroupIndex = index - prevIndexCount; + + return _get(groupMemberInfo, [groupName, currentGroupIndex], null); + }; + + return { groupCounts, groupNames, getGroupedMemberInfo }; + }, [isSearching, filteredGroupMembers, sortedMembers]); + + if (!groupInfo) { + return ; + } + + if (userInfos.length === 0) { + return ; + } + + const renderUser = (member: UserBaseInfo | null) => { + if (!member) { + return
; + } + + const menu = generateActionMenu(member); + if ((menu.items ?? []).length > 0) { + return ( + +
+ } + hideDiscriminator={hideGroupMemberDiscriminator} + /> +
+
+ ); + } else { + return ( + } + hideDiscriminator={hideGroupMemberDiscriminator} + /> + ); + } + }; + + return ( +
+
+ } + value={searchText} + onChange={(e) => setSearchText(e.target.value)} + /> +
+ +
+ { + return ( +
+ {groupNames[index]} - {groupCounts[index]} +
+ ); + }} + itemContent={(i, groupIndex) => + renderUser(getGroupedMemberInfo(i, groupIndex)) + } + /> +
+
+ ); +}); +MembersPanel.displayName = 'MembersPanel'; diff --git a/web/src/components/Panel/group/PluginPanel.tsx b/client/web/src/components/Panel/group/PluginPanel.tsx similarity index 86% rename from web/src/components/Panel/group/PluginPanel.tsx rename to client/web/src/components/Panel/group/PluginPanel.tsx index 94727f95fa2..60945946f32 100644 --- a/web/src/components/Panel/group/PluginPanel.tsx +++ b/client/web/src/components/Panel/group/PluginPanel.tsx @@ -1,8 +1,8 @@ +import { Problem } from '@/components/Problem'; import { findPluginPanelInfoByName } from '@/utils/plugin-helper'; import { Alert } from 'antd'; import React, { useMemo } from 'react'; import { isValidStr, t, useGroupPanelInfo } from 'tailchat-shared'; -import { GroupPanelWrapper } from './Wrapper'; interface GroupPluginPanelProps { groupId: string; @@ -65,18 +65,10 @@ export const GroupPluginPanel: React.FC = React.memo( if (!Component) { // 没有找到插件组件 // TODO: Fallback - return null; + return ; } - return ( - - - - ); + return ; } ); GroupPluginPanel.displayName = 'GroupPluginPanel'; diff --git a/client/web/src/components/Panel/group/TextPanel.tsx b/client/web/src/components/Panel/group/TextPanel.tsx new file mode 100644 index 00000000000..33aa3c4761e --- /dev/null +++ b/client/web/src/components/Panel/group/TextPanel.tsx @@ -0,0 +1,179 @@ +import { ChatBox } from '@/components/ChatBox'; +import { ChatInputMentionsContextProvider } from '@/components/ChatBox/ChatInputBox/context'; +import { IconBtn } from '@/components/IconBtn'; +import { + GroupPluginPanelActionProps, + pluginPanelActions, +} from '@/plugin/common'; +import React, { useCallback, useLayoutEffect, useState } from 'react'; +import { + useGroupPanelInfo, + useGroupMemberInfos, + useGroupMemberMute, + useUserId, + t, + humanizeMsDuration, + useInterval, + PERMISSION, + useGroupInfo, + GroupPanelType, + useHasGroupPanelPermission, +} from 'tailchat-shared'; +import { useFriendNicknameMap } from 'tailchat-shared'; +import { MembersPanel } from './MembersPanel'; +import { GroupPanelContainer } from './shared/GroupPanelContainer'; +import { MessageSearchPanel } from '../common/MessageSearch'; + +/** + * 聊天输入框显示状态管理 + */ +function useChatInputInfo(groupId: string, panelId: string) { + const userId = useUserId(); + const muteUntil = useGroupMemberMute(groupId, userId ?? ''); + const [hasPermission] = useHasGroupPanelPermission(groupId, panelId, [ + PERMISSION.core.message, + ]); + + const [placeholder, setPlaceholder] = useState(undefined); + const updatePlaceholder = useCallback(() => { + if (muteUntil) { + setPlaceholder( + muteUntil + ? (t('禁言中, 还剩 {{remain}}', { + remain: humanizeMsDuration( + new Date().valueOf() - new Date(muteUntil).valueOf() + ), + }) as string) + : undefined + ); + } else { + setPlaceholder(undefined); + } + }, [muteUntil]); + useInterval( + updatePlaceholder, + 10000 // 10s 检查一次,因为 humanizeMsDuration 不会精确到秒 + ); + useLayoutEffect(() => { + // 当到期时间发生变化后立即更新 + updatePlaceholder(); + }, [muteUntil]); + + if (!hasPermission) { + return { + disabled: true, + placeholder: t('没有发送消息的权限, 请联系群组所有者'), + }; + } + + return { + disabled: Boolean(muteUntil), + placeholder, + }; +} + +interface TextPanelProps { + groupId: string; + panelId: string; +} +export const TextPanel: React.FC = React.memo( + ({ groupId, panelId }) => { + const group = useGroupInfo(groupId); + const groupMembers = useGroupMemberInfos(groupId); + const panelInfo = useGroupPanelInfo(groupId, panelId); + const { disabled, placeholder } = useChatInputInfo(groupId, panelId); + const friendNicknameMap = useFriendNicknameMap(); + + if (!group) { + return null; + } + + if (!panelInfo) { + return null; + } + + return ( + [ + ...pluginPanelActions + .filter( + (action): action is GroupPluginPanelActionProps => + action.position === 'group' + ) + .map((action) => ( + + action.onClick({ + groupId, + panelId, + }) + } + /> + )), + ]} + suffixActions={({ setRightPanel }) => [ + + setRightPanel({ + name: t('聊天记录'), + panel: ( + + ), + }) + } + />, + + setRightPanel({ + name: t('成员') + ` (${groupMembers.length})`, + panel: , + }) + } + />, + ]} + > + ({ + id: m._id, + display: friendNicknameMap[m._id] + ? friendNicknameMap[m._id] + : m.nickname, + }))} + panels={group.panels + .filter((p) => p.type !== GroupPanelType.GROUP) + .map((p) => ({ + id: `/main/group/${groupId}/${p.id}`, + display: p.name, + }))} + disabled={disabled} + placeholder={placeholder} + > + + + + ); + } +); +TextPanel.displayName = 'TextPanel'; diff --git a/client/web/src/components/Panel/group/shared/GroupPanelContainer.tsx b/client/web/src/components/Panel/group/shared/GroupPanelContainer.tsx new file mode 100644 index 00000000000..03dfbe3e2d3 --- /dev/null +++ b/client/web/src/components/Panel/group/shared/GroupPanelContainer.tsx @@ -0,0 +1,55 @@ +import { IconBtn } from '@/components/IconBtn'; +import React, { PropsWithChildren } from 'react'; +import { t, useGroupPanelInfo } from 'tailchat-shared'; +import { + CommonPanelWrapper, + CommonPanelWrapperProps, +} from '../../common/Wrapper'; +import _isNil from 'lodash/isNil'; +import { usePanelWindow } from '@/hooks/usePanelWindow'; +import { OpenedPanelTip } from '@/components/OpenedPanelTip'; + +interface GroupPanelWithHeader extends PropsWithChildren { + groupId: string; + panelId: string; + + prefixActions?: CommonPanelWrapperProps['actions']; + suffixActions?: CommonPanelWrapperProps['actions']; +} +export const GroupPanelContainer: React.FC = React.memo( + (props) => { + const { groupId, panelId } = props; + const panelInfo = useGroupPanelInfo(groupId, panelId); + const { hasOpenedPanel, openPanelWindow, closePanelWindow } = + usePanelWindow(`/panel/group/${groupId}/${panelId}`); + + if (_isNil(panelInfo)) { + return null; + } + + if (hasOpenedPanel) { + return ; + } + + return ( + [ + ...(props.prefixActions?.(ctx) ?? []), + , + ...(props.suffixActions?.(ctx) ?? []), + ]} + > + {props.children} + + ); + } +); +GroupPanelContainer.displayName = 'GroupPanelWithHeader'; diff --git a/web/src/components/Panel/personal/ConversePanel.tsx b/client/web/src/components/Panel/personal/ConversePanel.tsx similarity index 76% rename from web/src/components/Panel/personal/ConversePanel.tsx rename to client/web/src/components/Panel/personal/ConversePanel.tsx index 3ef94ea6add..ca8b67282f1 100644 --- a/web/src/components/Panel/personal/ConversePanel.tsx +++ b/client/web/src/components/Panel/personal/ConversePanel.tsx @@ -6,6 +6,8 @@ import { t, useAppSelector, useDMConverseName, + useUserId, + useUserInfoList, } from 'tailchat-shared'; import { CommonPanelWrapper } from '../common/Wrapper'; import _compact from 'lodash/compact'; @@ -16,6 +18,8 @@ import { OpenedPanelTip } from '@/components/OpenedPanelTip'; import { IconBtn } from '@/components/IconBtn'; import { DMPluginPanelActionProps, pluginPanelActions } from '@/plugin/common'; import { CreateDMConverse } from '@/components/modals/CreateDMConverse'; +import { MessageSearchPanel } from '../common/MessageSearch'; +import { ChatInputMentionsContextProvider } from '@/components/ChatBox/ChatInputBox/context'; const ConversePanelTitle: React.FC<{ converse: ChatConverseState }> = React.memo(({ converse }) => { @@ -46,6 +50,10 @@ export const ConversePanel: React.FC = React.memo( const converse = useAppSelector( (state) => state.chat.converses[converseId] ); + const userId = useUserId(); + const userInfos = useUserInfoList( + (converse?.members ?? []).filter((m) => m !== userId) + ); const { hasOpenedPanel, openPanelWindow, closePanelWindow } = usePanelWindow(`/panel/personal/converse/${converseId}`); @@ -53,10 +61,14 @@ export const ConversePanel: React.FC = React.memo( return ; } + const converseHeader = converse && ( + + ); + return ( } - actions={(setRightPanel) => { + header={converseHeader} + actions={({ setRightPanel }) => { if (!converse) { return []; } @@ -115,6 +127,19 @@ export const ConversePanel: React.FC = React.memo( } /> ), + + setRightPanel({ + name: t('聊天记录'), + panel: , + }) + } + />, // 当成员数大于2时,显示成员列表按钮 converse.members.length > 2 && ( = React.memo( iconClassName="text-2xl" onClick={() => setRightPanel({ - name: t('成员'), + name: t('成员') + ` (${converse.members.length})`, panel: , }) } @@ -134,7 +159,18 @@ export const ConversePanel: React.FC = React.memo( ]); }} > - + ({ + id: m._id, + display: m.nickname, + }))} + > + + ); } diff --git a/client/web/src/components/PermissionList.tsx b/client/web/src/components/PermissionList.tsx new file mode 100644 index 00000000000..9d90b180d7c --- /dev/null +++ b/client/web/src/components/PermissionList.tsx @@ -0,0 +1,144 @@ +import { Col, Divider, Row, Switch } from 'antd'; +import React from 'react'; +import { + getPermissionList, + GroupPanelType, + PermissionItemType, + t, + useEvent, +} from 'tailchat-shared'; +import _uniq from 'lodash/uniq'; +import _without from 'lodash/without'; +import { pluginPermission } from '@/plugin/common'; + +interface PermissionListProps { + /** + * 面板类型,如果没传说明是群组,则展示所有的 + */ + panelType?: string | GroupPanelType.TEXT | GroupPanelType.GROUP; + value: string[]; + onChange: (value: string[]) => void; +} +export const PermissionList: React.FC = React.memo( + (props) => { + const handleSwitchPermission = useEvent( + (permissionKey: string, enabled: boolean) => { + if (enabled) { + props.onChange(_uniq([...props.value, permissionKey])); + } else { + props.onChange(_without(props.value, permissionKey)); + } + } + ); + + const panelPermissionFilterFn = useEvent( + (permissionInfo: PermissionItemType) => { + if (typeof props.panelType === 'undefined') { + // 如果不传则无限制 + return true; + } + + if (!permissionInfo.panel) { + // 没有定义面板信息,则该权限不适用于面板策略 + return false; + } + + if (permissionInfo.panel === true) { + return true; + } + + if (Array.isArray(permissionInfo.panel)) { + return permissionInfo.panel.includes(props.panelType); + } + } + ); + + const builtinPermissionList = getPermissionList().filter( + panelPermissionFilterFn + ); + const pluginPermissionList = pluginPermission.filter( + panelPermissionFilterFn + ); + + if ( + builtinPermissionList.length === 0 && + pluginPermissionList.length === 0 + ) { + return
{t('暂无可用的权限项')}
; + } + + return ( +
+ {/* 权限详情 */} + {builtinPermissionList.map((p) => ( + props.value.includes(r)) + : undefined + } + checked={props.value.includes(p.key)} + onChange={(checked) => handleSwitchPermission(p.key, checked)} + /> + ))} + + {pluginPermissionList.length > 0 && ( + <> + {t('以下为插件权限')} + + {/* 权限详情 */} + {pluginPermission.map((p) => ( + props.value.includes(r)) + : undefined + } + checked={props.value.includes(p.key)} + onChange={(checked) => handleSwitchPermission(p.key, checked)} + /> + ))} + + )} +
+ ); + } +); +PermissionList.displayName = 'PermissionList'; + +interface PermissionItemProps { + title: string; + desc?: string; + disabled?: boolean; + checked: boolean; + onChange: (checked: boolean) => void; +} + +const PermissionItem: React.FC = React.memo((props) => { + return ( +
+ +
+ {props.title} + + + + + + + +
{props.desc}
+ + ); +}); +PermissionItem.displayName = 'PermissionItem'; diff --git a/client/web/src/components/PillTabs.less b/client/web/src/components/PillTabs.less new file mode 100644 index 00000000000..a5b51c30461 --- /dev/null +++ b/client/web/src/components/PillTabs.less @@ -0,0 +1,55 @@ +.pill-tabs.ant-tabs.ant-tabs-card { + @apply text-gray-700 dark:text-gray-100 max-h-full; + + .ant-tabs-nav { + @apply px-2 py-3 m-0 text-base; + + &::before { + @apply border-0; + } + + .ant-tabs-tab { + border: 0; + margin: 2px; + padding: 2px 8px; + @apply text-gray-800 dark:text-gray-200 bg-black bg-opacity-0 dark:bg-white dark:bg-opacity-0; + + &:not(.ant-tabs-tab-disabled) { + &.ant-tabs-tab-active, + &:hover, + &:active { + @apply rounded bg-opacity-20; + + .ant-tabs-tab-btn { + @apply text-black dark:text-white; + } + } + } + + &.ant-tabs-tab-disabled { + @apply text-opacity-50; + + &.ant-tabs-tab-active { + @apply text-red-500 rounded bg-opacity-20 bg-red-500; + } + } + + .ant-tabs-tab-btn { + color: inherit; + } + } + } + + .ant-tabs-content-holder { + overflow-x: hidden; + overflow-y: auto; + + .ant-tabs-content { + height: 100%; + + .ant-tabs-tabpane { + height: 100%; + } + } + } +} diff --git a/client/web/src/components/PillTabs.tsx b/client/web/src/components/PillTabs.tsx new file mode 100644 index 00000000000..1db03f506c5 --- /dev/null +++ b/client/web/src/components/PillTabs.tsx @@ -0,0 +1,28 @@ +import { Tabs, TabsProps } from 'antd'; +import React from 'react'; + +import './PillTabs.less'; +import clsx from 'clsx'; + +/** + * @example + * + */ +export const PillTabs: React.FC = React.memo((props) => { + return ( + + {props.children} + + ); +}); +PillTabs.displayName = 'PillTabs'; + +/** + * @deprecated + */ +export const PillTabPane = Tabs.TabPane; diff --git a/web/src/components/Portal.tsx b/client/web/src/components/Portal.tsx similarity index 100% rename from web/src/components/Portal.tsx rename to client/web/src/components/Portal.tsx diff --git a/client/web/src/components/Problem.tsx b/client/web/src/components/Problem.tsx new file mode 100644 index 00000000000..8230e295fd3 --- /dev/null +++ b/client/web/src/components/Problem.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import problemSvg from '@assets/images/problem.svg'; +import { t } from 'tailchat-shared'; +import clsx from 'clsx'; + +interface ProblemProps { + className?: string; + style?: React.CSSProperties; + text?: React.ReactNode; +} + +/** + * 问题页面占位 + */ +export const Problem: React.FC = React.memo((props) => { + return ( +
+ + +
{props.text ?? t('出现了一些问题')}
+
+ ); +}); +Problem.displayName = 'Problem'; diff --git a/client/web/src/components/QuickSwitcher/index.tsx b/client/web/src/components/QuickSwitcher/index.tsx new file mode 100644 index 00000000000..e5a9826e5d0 --- /dev/null +++ b/client/web/src/components/QuickSwitcher/index.tsx @@ -0,0 +1,124 @@ +import { stopPropagation } from '@/utils/dom-helper'; +import { Input } from 'antd'; +import React, { useCallback, useState } from 'react'; +import { t } from 'tailchat-shared'; +import { PortalAdd, PortalRemove } from '../Portal'; +import clsx from 'clsx'; +import { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown'; +import { + isArrowDown, + isArrowUp, + isEnterHotkey, + isEscHotkey, +} from '@/utils/hot-key'; +import { useQuickSwitcherActionContext } from './useQuickSwitcherActionContext'; +import { useQuickSwitcherFilteredActions } from './useQuickSwitcherFilteredActions'; + +let currentQuickSwitcherKey: number | null = null; + +const QuickSwitcher: React.FC = React.memo(() => { + const [keyword, setKeyword] = useState(''); + const [selectedIndex, setSelectedIndex] = useState(0); + const actionContext = useQuickSwitcherActionContext(); + + const handleClose = useCallback(() => { + if (!currentQuickSwitcherKey) { + return; + } + + PortalRemove(currentQuickSwitcherKey); + currentQuickSwitcherKey = null; + }, []); + + const filteredActions = useQuickSwitcherFilteredActions(keyword); + + useGlobalKeyDown((e) => { + if (isArrowUp(e)) { + const newIndex = selectedIndex - 1; + setSelectedIndex( + newIndex >= 0 ? newIndex : filteredActions.length + newIndex + ); + } else if (isArrowDown(e)) { + setSelectedIndex((selectedIndex + 1) % filteredActions.length); + } + + if (isEnterHotkey(e)) { + const selectedAction = filteredActions[selectedIndex]; + typeof selectedAction.action === 'function' && + selectedAction.action(actionContext); + handleClose(); + } else if (isEscHotkey(e)) { + handleClose(); + } + }); + + return ( +
+
+ setKeyword(e.target.value)} + /> + + {filteredActions.map((action, i) => ( +
{ + action.action(actionContext); + handleClose(); + }} + > +
{action.label}
+
+ {action.source} +
+
+ ))} +
+
+ ); +}); +QuickSwitcher.displayName = 'QuickSwitcher'; + +/** + * 打开快速开关 + */ +export function openQuickSwitcher() { + if (typeof currentQuickSwitcherKey === 'number') { + return; + } + + currentQuickSwitcherKey = PortalAdd(); +} diff --git a/client/web/src/components/QuickSwitcher/useQuickSwitcherActionContext.tsx b/client/web/src/components/QuickSwitcher/useQuickSwitcherActionContext.tsx new file mode 100644 index 00000000000..40c50c2c36d --- /dev/null +++ b/client/web/src/components/QuickSwitcher/useQuickSwitcherActionContext.tsx @@ -0,0 +1,16 @@ +import { NavigateOptions, To, useNavigate } from 'react-router'; + +export interface QuickActionContext { + navigate: (to: To, options?: NavigateOptions) => void; +} + +/** + * 快速切换操作上下文信息 + */ +export function useQuickSwitcherActionContext(): QuickActionContext { + const navigate = useNavigate(); + + return { + navigate, + }; +} diff --git a/client/web/src/components/QuickSwitcher/useQuickSwitcherAllAction.ts b/client/web/src/components/QuickSwitcher/useQuickSwitcherAllAction.ts new file mode 100644 index 00000000000..8398e31c214 --- /dev/null +++ b/client/web/src/components/QuickSwitcher/useQuickSwitcherAllAction.ts @@ -0,0 +1,123 @@ +import { + isValidStr, + t, + useAppSelector, + useAsync, + useUserId, + getDMConverseName, + model, +} from 'tailchat-shared'; +import { useDebugValue, useMemo } from 'react'; +import type { QuickActionContext } from './useQuickSwitcherActionContext'; + +const ChatConverseType = model.converse.ChatConverseType; + +export interface QuickAction { + key: string; + source: string; + label: string; + action: (context: QuickActionContext) => void; +} + +/** + * 内置操作 + */ +const builtinActions: QuickAction[] = [ + { + key: 'personal', + source: 'core', + label: t('个人主页'), + action({ navigate }) { + navigate('/main/personal/friends'); + }, + }, + { + key: 'plugins', + source: 'core', + label: t('插件中心'), + action({ navigate }) { + navigate('/main/personal/plugins'); + }, + }, +]; + +/** + * 私信快速会话 + */ +function useDMConverseActions(): QuickAction[] { + const userId = useUserId(); + const dmConverses = useAppSelector((state) => + Object.values(state.chat.converses).filter( + (converse) => converse.type === ChatConverseType.DM + ) + ); + const { value: personalConverseActions = [] } = useAsync(async () => { + if (!isValidStr(userId)) { + return []; + } + + return Promise.all( + dmConverses.map((converse) => + getDMConverseName(userId, converse).then( + (converseName): QuickAction => ({ + key: `qs#converse#${converse._id}`, + label: `${t('私信')} ${converseName}`, + source: 'core', + action: ({ navigate }) => { + navigate(`/main/personal/converse/${converse._id}`); + }, + }) + ) + ) + ); + }, [userId, dmConverses.map((converse) => converse._id).join(',')]); + + useDebugValue(personalConverseActions); + + return personalConverseActions; +} + +/** + * 群组操作 + */ +function useGroupPanelActions(): QuickAction[] { + const groups = useAppSelector((state) => state.group.groups); + + const groupPanelActions = useMemo(() => { + const list: QuickAction[] = []; + + Object.values(groups).forEach((group) => { + group.panels + .filter((p) => p.type !== model.group.GroupPanelType.GROUP) + .forEach((panel) => { + list.push({ + key: `qs#grouppanel#${panel.id}`, + label: `[${group.name}] ${panel.name}`, + source: 'core', + action: ({ navigate }) => { + navigate(`/main/group/${group._id}/${panel.id}`); + }, + }); + }); + }); + + return list; + }, [groups]); + + useDebugValue(groupPanelActions); + + return groupPanelActions; +} + +/** + * @returns 返回所有的快速操作 + */ +export function useQuickSwitcherAllActions() { + const allActions = [ + ...builtinActions, + ...useDMConverseActions(), + ...useGroupPanelActions(), + ]; + + return allActions; +} diff --git a/web/src/components/QuickSwitcher/useQuickSwitcherFilteredActions.tsx b/client/web/src/components/QuickSwitcher/useQuickSwitcherFilteredActions.tsx similarity index 100% rename from web/src/components/QuickSwitcher/useQuickSwitcherFilteredActions.tsx rename to client/web/src/components/QuickSwitcher/useQuickSwitcherFilteredActions.tsx diff --git a/client/web/src/components/SectionHeader.tsx b/client/web/src/components/SectionHeader.tsx new file mode 100644 index 00000000000..d43e3b0fb56 --- /dev/null +++ b/client/web/src/components/SectionHeader.tsx @@ -0,0 +1,52 @@ +import React, { PropsWithChildren, useState } from 'react'; +import { Dropdown, MenuProps } from 'antd'; +import { Icon } from 'tailchat-design'; +import clsx from 'clsx'; + +interface SectionHeaderProps extends PropsWithChildren { + menu?: MenuProps; + 'data-testid'?: string; +} + +export const SectionHeader: React.FC = React.memo( + (props) => { + const [visible, setVisible] = useState(false); + + return ( +
+ {props.menu ? ( + +
+
{props.children}
+ +  + +
+
+ ) : ( +
+ {props.children} +
+ )} +
+ ); + } +); +SectionHeader.displayName = 'SectionHeader'; diff --git a/web/src/components/SidebarView.tsx b/client/web/src/components/SidebarView.tsx similarity index 90% rename from web/src/components/SidebarView.tsx rename to client/web/src/components/SidebarView.tsx index 263774ad347..1a389adc7be 100644 --- a/web/src/components/SidebarView.tsx +++ b/client/web/src/components/SidebarView.tsx @@ -1,6 +1,6 @@ -import React, { useState, useContext } from 'react'; +import React, { useState, useContext, PropsWithChildren } from 'react'; import _get from 'lodash/get'; -import { DevContainer } from './DevContainer'; +import { DevContainer } from 'tailchat-shared'; import clsx from 'clsx'; export interface SidebarViewMenuItemType { @@ -26,11 +26,13 @@ interface SidebarViewLinkType { isDanger?: boolean; } -const SidebarViewMenuItemTitle: React.FC<{ - active?: boolean; - isDanger?: boolean; - onClick: () => void; -}> = (props) => ( +const SidebarViewMenuItemTitle: React.FC< + PropsWithChildren<{ + active?: boolean; + isDanger?: boolean; + onClick: () => void; + }> +> = (props) => (
= React.memo((props) => {
{menu.map((item, i) => ( @@ -155,7 +157,7 @@ export const SidebarView: React.FC = React.memo((props) => {
{content} diff --git a/web/src/components/Slides.less b/client/web/src/components/Slides.less similarity index 100% rename from web/src/components/Slides.less rename to client/web/src/components/Slides.less diff --git a/web/src/components/Slides.tsx b/client/web/src/components/Slides.tsx similarity index 100% rename from web/src/components/Slides.tsx rename to client/web/src/components/Slides.tsx diff --git a/web/src/components/Spinner.tsx b/client/web/src/components/Spinner.tsx similarity index 82% rename from web/src/components/Spinner.tsx rename to client/web/src/components/Spinner.tsx index c1d2f5e1cc3..42f7583d921 100644 --- a/web/src/components/Spinner.tsx +++ b/client/web/src/components/Spinner.tsx @@ -1,4 +1,4 @@ -import { Icon } from '@/components/Icon'; +import { Icon } from 'tailchat-design'; import React from 'react'; export const Spinner: React.FC = React.memo(() => { diff --git a/web/src/components/SplitPanel.less b/client/web/src/components/SplitPanel.less similarity index 100% rename from web/src/components/SplitPanel.less rename to client/web/src/components/SplitPanel.less diff --git a/web/src/components/SplitPanel.tsx b/client/web/src/components/SplitPanel.tsx similarity index 86% rename from web/src/components/SplitPanel.tsx rename to client/web/src/components/SplitPanel.tsx index 298921e5a16..68caa588f6c 100644 --- a/web/src/components/SplitPanel.tsx +++ b/client/web/src/components/SplitPanel.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx'; -import React from 'react'; +import React, { PropsWithChildren } from 'react'; import Split from 'react-split'; import { useStorage } from 'tailchat-shared'; import './SplitPanel.less'; @@ -8,7 +8,7 @@ import './SplitPanel.less'; * Reference: https://split.js.org/#/ */ -interface SplitPanelProps { +interface SplitPanelProps extends PropsWithChildren { className?: string; } export const SplitPanel: React.FC = React.memo((props) => { diff --git a/client/web/src/components/SubmitButton.tsx b/client/web/src/components/SubmitButton.tsx new file mode 100644 index 00000000000..4c9bd5e4fc9 --- /dev/null +++ b/client/web/src/components/SubmitButton.tsx @@ -0,0 +1,28 @@ +import { Button, ButtonProps } from 'antd'; +import React, { useState } from 'react'; + +interface SubmitButtonProps extends ButtonProps { + onClick: (event: React.MouseEvent) => void | Promise; +} + +/** + * Submit Button, use for submit somthing to server + * auto add loading state in onClick + */ +export const SubmitButton: React.FC = React.memo((props) => { + const [loading, setLoading] = useState(false); + return ( +
+ + diff --git a/patches/moleculer@0.14.23.patch b/patches/moleculer@0.14.23.patch new file mode 100644 index 00000000000..28ac617a2e6 --- /dev/null +++ b/patches/moleculer@0.14.23.patch @@ -0,0 +1,317 @@ +diff --git a/src/runner-esm.mjs b/src/runner-esm.mjs +index 97b78b59c8931ed2c71e719c12d23bd5172da977..b14e9e0c61be8b0460e60f448781103c49f563e5 100644 +--- a/src/runner-esm.mjs ++++ b/src/runner-esm.mjs +@@ -332,83 +332,87 @@ export default class MoleculerRunner { + this.watchFolders.length = 0; + const fileMask = this.flags.mask || "**/*.service.js"; + +- const serviceDir = process.env.SERVICEDIR || ""; +- const svcDir = path.isAbsolute(serviceDir) +- ? serviceDir +- : path.resolve(process.cwd(), serviceDir); ++ const serviceDirList = (process.env.SERVICEDIR || "").split(','); + +- let patterns = this.servicePaths; ++ for (const serviceDir of serviceDirList) { ++ const serviceDir = process.env.SERVICEDIR || ""; ++ const svcDir = path.isAbsolute(serviceDir) ++ ? serviceDir ++ : path.resolve(process.cwd(), serviceDir); + +- if (process.env.SERVICES || process.env.SERVICEDIR) { +- if (this.isDirectory(svcDir) && !process.env.SERVICES) { +- // Load all services from directory (from subfolders too) +- this.broker.loadServices(svcDir, fileMask); ++ let patterns = this.servicePaths; + +- if (this.config.hotReload) { +- this.watchFolders.push(svcDir); ++ if (process.env.SERVICES || process.env.SERVICEDIR) { ++ if (this.isDirectory(svcDir) && !process.env.SERVICES) { ++ // Load all services from directory (from subfolders too) ++ this.broker.loadServices(svcDir, fileMask); ++ ++ if (this.config.hotReload) { ++ this.watchFolders.push(svcDir); ++ } ++ } else if (process.env.SERVICES) { ++ // Load services from env list ++ patterns = Array.isArray(process.env.SERVICES) ++ ? process.env.SERVICES ++ : process.env.SERVICES.split(","); + } +- } else if (process.env.SERVICES) { +- // Load services from env list +- patterns = Array.isArray(process.env.SERVICES) +- ? process.env.SERVICES +- : process.env.SERVICES.split(","); + } +- } + +- if (patterns.length > 0) { +- let serviceFiles = []; +- +- patterns +- .map(s => s.trim()) +- .forEach(p => { +- const skipping = p[0] == "!"; +- if (skipping) p = p.slice(1); +- +- let files; +- const svcPath = path.isAbsolute(p) ? p : path.resolve(svcDir, p); +- // Check is it a directory? +- if (this.isDirectory(svcPath)) { +- if (this.config.hotReload) { +- this.watchFolders.push(svcPath); ++ if (patterns.length > 0) { ++ let serviceFiles = []; ++ ++ patterns ++ .map(s => s.trim()) ++ .forEach(p => { ++ const skipping = p[0] == "!"; ++ if (skipping) p = p.slice(1); ++ ++ let files; ++ const svcPath = path.isAbsolute(p) ? p : path.resolve(svcDir, p); ++ // Check is it a directory? ++ if (this.isDirectory(svcPath)) { ++ if (this.config.hotReload) { ++ this.watchFolders.push(svcPath); ++ } ++ files = glob.sync(svcPath + "/" + fileMask, { absolute: true }); ++ if (files.length == 0) ++ return this.broker.logger.warn( ++ kleur ++ .yellow() ++ .bold( ++ `There is no service files in directory: '${svcPath}'` ++ ) ++ ); ++ } else if (this.isServiceFile(svcPath)) { ++ files = [svcPath.replace(/\\/g, "/")]; ++ } else if (this.isServiceFile(svcPath + ".service.js")) { ++ files = [svcPath.replace(/\\/g, "/") + ".service.js"]; ++ } else { ++ // Load with glob ++ files = glob.sync(p, { cwd: svcDir, absolute: true }); ++ if (files.length == 0) ++ this.broker.logger.warn( ++ kleur ++ .yellow() ++ .bold(`There is no matched file for pattern: '${p}'`) ++ ); + } +- files = glob.sync(svcPath + "/" + fileMask, { absolute: true }); +- if (files.length == 0) +- return this.broker.logger.warn( +- kleur +- .yellow() +- .bold( +- `There is no service files in directory: '${svcPath}'` +- ) +- ); +- } else if (this.isServiceFile(svcPath)) { +- files = [svcPath.replace(/\\/g, "/")]; +- } else if (this.isServiceFile(svcPath + ".service.js")) { +- files = [svcPath.replace(/\\/g, "/") + ".service.js"]; +- } else { +- // Load with glob +- files = glob.sync(p, { cwd: svcDir, absolute: true }); +- if (files.length == 0) +- this.broker.logger.warn( +- kleur +- .yellow() +- .bold(`There is no matched file for pattern: '${p}'`) +- ); +- } + +- if (files && files.length > 0) { +- if (skipping) +- serviceFiles = serviceFiles.filter(f => files.indexOf(f) === -1); +- else serviceFiles.push(...files); +- } +- }); ++ if (files && files.length > 0) { ++ if (skipping) ++ serviceFiles = serviceFiles.filter(f => files.indexOf(f) === -1); ++ else serviceFiles.push(...files); ++ } ++ }); + +- await Promise.all(_.uniq(serviceFiles).map(async f => { +- const mod = await import(f.startsWith("/") ? f : "/" + f); +- const content = mod.default; ++ await Promise.all(_.uniq(serviceFiles).map(async f => { ++ const mod = await import(f.startsWith("/") ? f : "/" + f); ++ const content = mod.default; + +- const svc = this.broker.createService(content); +- svc.__filename = f; +- })); ++ const svc = this.broker.createService(content); ++ svc.__filename = f; ++ })); ++ } + } + } + +diff --git a/src/runner.js b/src/runner.js +index 695e5affcb21b456ce5b0f69f2c02e776ad4216a..34cc885fd80279b1b91f8013263c522ff6f1d42b 100644 +--- a/src/runner.js ++++ b/src/runner.js +@@ -335,83 +335,87 @@ class MoleculerRunner { + this.watchFolders.length = 0; + const fileMask = this.flags.mask || "**/*.service.js"; + +- const serviceDir = process.env.SERVICEDIR || ""; +- const svcDir = path.isAbsolute(serviceDir) +- ? serviceDir +- : path.resolve(process.cwd(), serviceDir); ++ const serviceDirList = (process.env.SERVICEDIR || "").split(','); + +- let patterns = this.servicePaths; ++ for (const serviceDir of serviceDirList) { ++ const svcDir = path.isAbsolute(serviceDir) ++ ? serviceDir ++ : path.resolve(process.cwd(), serviceDir); + +- if (process.env.SERVICES || process.env.SERVICEDIR) { +- if (this.isDirectory(svcDir) && !process.env.SERVICES) { +- // Load all services from directory (from subfolders too) +- this.broker.loadServices(svcDir, fileMask); ++ let patterns = this.servicePaths; + +- if (this.config.hotReload) { +- this.watchFolders.push(svcDir); ++ if (process.env.SERVICES || process.env.SERVICEDIR) { ++ if (this.isDirectory(svcDir) && !process.env.SERVICES) { ++ // Load all services from directory (from subfolders too) ++ this.broker.loadServices(svcDir, fileMask); ++ ++ if (this.config.hotReload) { ++ this.watchFolders.push(svcDir); ++ } ++ } else if (process.env.SERVICES) { ++ // Load services from env list ++ patterns = Array.isArray(process.env.SERVICES) ++ ? process.env.SERVICES ++ : process.env.SERVICES.split(","); + } +- } else if (process.env.SERVICES) { +- // Load services from env list +- patterns = Array.isArray(process.env.SERVICES) +- ? process.env.SERVICES +- : process.env.SERVICES.split(","); + } +- } + +- if (patterns.length > 0) { +- let serviceFiles = []; +- +- patterns +- .map(s => s.trim()) +- .forEach(p => { +- const skipping = p[0] == "!"; +- if (skipping) p = p.slice(1); +- +- if (p.startsWith("npm:")) { +- // Load NPM module +- this.loadNpmModule(p.slice(4)); +- } else { +- let files; +- const svcPath = path.isAbsolute(p) ? p : path.resolve(svcDir, p); +- // Check is it a directory? +- if (this.isDirectory(svcPath)) { +- if (this.config.hotReload) { +- this.watchFolders.push(svcPath); +- } +- files = glob(svcPath + "/" + fileMask, { absolute: true }); +- if (files.length == 0) +- return this.broker.logger.warn( +- kleur +- .yellow() +- .bold( +- `There is no service files in directory: '${svcPath}'` +- ) +- ); +- } else if (this.isServiceFile(svcPath)) { +- files = [svcPath.replace(/\\/g, "/")]; +- } else if (this.isServiceFile(svcPath + ".service.js")) { +- files = [svcPath.replace(/\\/g, "/") + ".service.js"]; ++ if (patterns.length > 0) { ++ let serviceFiles = []; ++ ++ patterns ++ .map(s => s.trim()) ++ .forEach(p => { ++ const skipping = p[0] == "!"; ++ if (skipping) p = p.slice(1); ++ ++ if (p.startsWith("npm:")) { ++ // Load NPM module ++ this.loadNpmModule(p.slice(4)); + } else { +- // Load with glob +- files = glob(p, { cwd: svcDir, absolute: true }); +- if (files.length == 0) +- this.broker.logger.warn( +- kleur +- .yellow() +- .bold(`There is no matched file for pattern: '${p}'`) +- ); +- } ++ let files; ++ const svcPath = path.isAbsolute(p) ? p : path.resolve(svcDir, p); ++ // Check is it a directory? ++ if (this.isDirectory(svcPath)) { ++ if (this.config.hotReload) { ++ this.watchFolders.push(svcPath); ++ } ++ files = glob(svcPath + "/" + fileMask, { absolute: true }); ++ if (files.length == 0) ++ return this.broker.logger.warn( ++ kleur ++ .yellow() ++ .bold( ++ `There is no service files in directory: '${svcPath}'` ++ ) ++ ); ++ } else if (this.isServiceFile(svcPath)) { ++ files = [svcPath.replace(/\\/g, "/")]; ++ } else if (this.isServiceFile(svcPath + ".service.js")) { ++ files = [svcPath.replace(/\\/g, "/") + ".service.js"]; ++ } else { ++ // Load with glob ++ files = glob(p, { cwd: svcDir, absolute: true }); ++ if (files.length == 0) ++ this.broker.logger.warn( ++ kleur ++ .yellow() ++ .bold(`There is no matched file for pattern: '${p}'`) ++ ); ++ } + +- if (files && files.length > 0) { +- if (skipping) +- serviceFiles = serviceFiles.filter(f => files.indexOf(f) === -1); +- else serviceFiles.push(...files); ++ if (files && files.length > 0) { ++ if (skipping) ++ serviceFiles = serviceFiles.filter(f => files.indexOf(f) === -1); ++ else serviceFiles.push(...files); ++ } + } +- } +- }); ++ }); + +- _.uniq(serviceFiles).forEach(f => this.broker.loadService(f)); ++ _.uniq(serviceFiles).forEach(f => this.broker.loadService(f)); ++ } + } ++ + } + + /** \ No newline at end of file diff --git a/patches/vite-express@0.8.0.patch b/patches/vite-express@0.8.0.patch new file mode 100644 index 00000000000..70ab77ec8c7 --- /dev/null +++ b/patches/vite-express@0.8.0.patch @@ -0,0 +1,15 @@ +diff --git a/dist/main.js b/dist/main.js +index c3abbbad4dc48238cdf09f8fd009e7d89a7ea542..cdaeb9773154b1083877a22db4cb06f7d7e97a7e 100644 +--- a/dist/main.js ++++ b/dist/main.js +@@ -57,7 +57,9 @@ function serveStatic() { + const stubMiddleware = (req, res, next) => next(); + function injectStaticMiddleware(app, middleware) { + return __awaiter(this, void 0, void 0, function* () { +- app.use(middleware); ++ const config = yield Vite.resolveConfig({}, "build"); ++ const base = config.base || '/'; ++ app.use(base, middleware); + const stubMiddlewareLayer = app._router.stack.find((layer) => layer.handle === stubMiddleware); + if (stubMiddlewareLayer !== undefined) { + const serveStaticLayer = app._router.stack.pop(); \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50397b00932..07d651d448c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,2863 +1,9686 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + redux: 4.2.1 + '@babel/runtime': 7.21.0 + '@types/react': 18.0.20 + '@types/node': 18.11.9 + ts-node: 10.9.1 + webpack: 5.75.0 + react-router@^6.0.0: 6.11.0 + react-router-dom@^6.0.0: 6.11.0 + '@typegoose/typegoose': 9.3.1 + '@tanstack/query-async-storage-persister': 4.32.6 + '@tanstack/react-query': 4.33.0 + '@tanstack/react-query-persist-client': 4.33.0 + '@tanstack/react-query-devtools': 4.33.0 + typescript: 4.9.4 + got: 11.8.3 + zustand: 4.3.6 + immer: 9.0.21 + mongodb: 4.2.1 + mongoose@~6.0.14: 6.1.1 + mongoose@^6.0.0: 6.1.1 + mongoose-findorcreate: 3.0.0 + +patchedDependencies: + moleculer@0.14.23: + hash: ahhlgpfy57fntn2aftq6beaeja + path: patches/moleculer@0.14.23.patch + vite-express@0.8.0: + hash: u6touqej4dt3zxnslnszarl7vq + path: patches/vite-express@0.8.0.patch importers: .: - specifiers: - '@commitlint/cli': ^12.1.4 - '@commitlint/config-conventional': ^12.1.4 - '@types/fs-extra': ^9.0.13 - '@types/jest': ^27.0.3 - '@types/node': ^15.12.5 - '@typescript-eslint/eslint-plugin': ^4.28.1 - '@typescript-eslint/parser': ^4.28.1 - commitlint: ^12.1.4 - crc: ^3.8.0 - dayjs: ^1.10.6 - esbuild: ^0.12.25 - eslint: ^7.30.0 - eslint-config-prettier: ^8.3.0 - eslint-plugin-prettier: ^3.4.0 - eslint-plugin-react: ^7.24.0 - fs-extra: ^10.0.0 - gulp-sort: ^2.0.0 - husky: ^7.0.0 - i18next-scanner: ^3.0.0 - identity-obj-proxy: ^3.0.0 - lint-staged: ^11.0.0 - lodash: ^4.17.21 - prettier: ^2.3.2 - typescript: ^4.5.2 - vinyl-fs: ^3.0.3 dependencies: - crc: 3.8.0 - lodash: 4.17.21 + crc: + specifier: ^3.8.0 + version: 3.8.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 devDependencies: - '@commitlint/cli': 12.1.4 - '@commitlint/config-conventional': 12.1.4 - '@types/fs-extra': 9.0.13 - '@types/jest': 27.5.1 - '@types/node': 15.14.9 - '@typescript-eslint/eslint-plugin': 4.33.0_lzzr7k3tjtqil7aczuhmzzwame - '@typescript-eslint/parser': 4.33.0_e4zyhrvfnqudwdx5bevnvkluy4 - commitlint: 12.1.4 - dayjs: 1.10.7 - esbuild: 0.12.29 - eslint: 7.32.0 - eslint-config-prettier: 8.5.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_evcial7aw3q6fcauxv2c7fxuoe - eslint-plugin-react: 7.29.4_eslint@7.32.0 - fs-extra: 10.1.0 - gulp-sort: 2.0.0 - husky: 7.0.4 - i18next-scanner: 3.1.0 - identity-obj-proxy: 3.0.0 - lint-staged: 11.2.6 - prettier: 2.6.2 - typescript: 4.6.4 - vinyl-fs: 3.0.3 + '@commitlint/cli': + specifier: ^17.4.4 + version: 17.4.4 + '@commitlint/config-conventional': + specifier: ^17.4.4 + version: 17.4.4 + '@release-it/conventional-changelog': + specifier: ^5.1.1 + version: 5.1.1(release-it@15.6.0) + '@typescript-eslint/eslint-plugin': + specifier: ^5.53.0 + version: 5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.34.0)(typescript@4.9.4) + '@typescript-eslint/parser': + specifier: ^5.53.0 + version: 5.53.0(eslint@8.34.0)(typescript@4.9.4) + concurrently: + specifier: ^7.6.0 + version: 7.6.0 + dayjs: + specifier: ^1.11.7 + version: 1.11.7 + esbuild: + specifier: ^0.15.18 + version: 0.15.18 + eslint: + specifier: ^8.34.0 + version: 8.34.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.6.0(eslint@8.34.0) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.34.0)(prettier@2.8.4) + eslint-plugin-react: + specifier: ^7.32.2 + version: 7.32.2(eslint@8.34.0) + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + gulp-sort: + specifier: ^2.0.0 + version: 2.0.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + i18next-scanner: + specifier: ^3.3.0 + version: 3.3.0 + lint-staged: + specifier: ^13.1.2 + version: 13.1.2 + prettier: + specifier: ^2.8.4 + version: 2.8.4 + release-it: + specifier: ^15.6.0 + version: 15.6.0 + typescript: + specifier: 4.9.4 + version: 4.9.4 + vinyl-fs: + specifier: ^3.0.3 + version: 3.0.3 + + apps/cli: + dependencies: + '@types/dockerode': + specifier: ^3.3.10 + version: 3.3.10 + '@types/pidusage': + specifier: ^2.0.2 + version: 2.0.2 + as-table: + specifier: ^1.0.55 + version: 1.0.55 + chalk: + specifier: 4.1.2 + version: 4.1.2 + crypto-random-string: + specifier: 3.3.1 + version: 3.3.1 + dockerode: + specifier: ^3.3.4 + version: 3.3.4 + dotenv: + specifier: ^16.0.0 + version: 16.0.2 + filesize: + specifier: ^8.0.7 + version: 8.0.7 + find-process: + specifier: ^1.4.7 + version: 1.4.7 + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + glob: + specifier: ^8.1.0 + version: 8.1.0 + got: + specifier: 11.8.3 + version: 11.8.3 + ink: + specifier: ^3.2.0 + version: 3.2.0(@types/react@18.0.20)(react@18.2.0) + ink-tab: + specifier: ^4.2.0 + version: 4.2.0(ink@3.2.0)(react@18.2.0) + ink-text-input: + specifier: ^4.0.3 + version: 4.0.3(ink@3.2.0)(react@18.2.0) + inquirer: + specifier: ^8.2.2 + version: 8.2.4 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + node-plop: + specifier: ^0.26.3 + version: 0.26.3 + nodemailer: + specifier: ^6.7.2 + version: 6.7.8 + ora: + specifier: 5.4.1 + version: 5.4.1 + p-all: + specifier: 2.1.0 + version: 2.1.0 + p-map: + specifier: ^4.0.0 + version: 4.0.0 + p-series: + specifier: 2.1.0 + version: 2.1.0 + pidusage: + specifier: ^3.0.2 + version: 3.0.2 + plop: + specifier: ^3.0.5 + version: 3.1.1 + pretty-ms: + specifier: 7.0.1 + version: 7.0.1 + react: + specifier: 18.2.0 + version: 18.2.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + socket.io-client: + specifier: ^4.6.2 + version: 4.6.2 + socket.io-msgpack-parser: + specifier: ^3.0.2 + version: 3.0.2 + spinnies: + specifier: ^0.5.1 + version: 0.5.1 + tailchat-server-sdk: + specifier: ^0.0.12 + version: 0.0.12 + update-notifier: + specifier: 5.1.0 + version: 5.1.0 + yargs: + specifier: ^17.4.0 + version: 17.5.1 + devDependencies: + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/glob': + specifier: ^8.0.0 + version: 8.0.0 + '@types/inquirer': + specifier: ^8.2.1 + version: 8.2.3 + '@types/lodash': + specifier: ^4.14.170 + version: 4.14.184 + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + '@types/nodemailer': + specifier: ^6.4.4 + version: 6.4.5 + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + '@types/spinnies': + specifier: ^0.5.0 + version: 0.5.0 + '@types/update-notifier': + specifier: ^6.0.1 + version: 6.0.1 + '@types/yargs': + specifier: ^17.0.10 + version: 17.0.12 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + tailchat-shared: + specifier: workspace:* + version: link:../../client/shared + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: + specifier: 4.9.4 + version: 4.9.4 + + apps/github-app: + dependencies: + axios: + specifier: ^0.21.1 + version: 0.21.4 + body-parser: + specifier: ^1.20.1 + version: 1.20.1 + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + express: + specifier: ^4.18.2 + version: 4.18.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + probot: + specifier: ^12.3.0 + version: 12.3.0 + probot-metadata: + specifier: ^2.1.0 + version: 2.1.0(probot@12.3.0) + devDependencies: + '@types/body-parser': + specifier: ^1.19.2 + version: 1.19.2 + '@types/jest': + specifier: 27.5.2 + version: 27.5.2 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + jest: + specifier: 27.5.1 + version: 27.5.1(ts-node@10.9.1) + nock: + specifier: ^13.0.5 + version: 13.2.9 + nodemon: + specifier: ^2.0.18 + version: 2.0.20 + smee-client: + specifier: ^1.2.2 + version: 1.2.3 + ts-jest: + specifier: 27.1.4 + version: 27.1.4(@babel/core@7.21.0)(@types/jest@27.5.2)(esbuild@0.15.18)(jest@27.5.1)(typescript@4.9.4) + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: + specifier: 4.9.4 + version: 4.9.4 + + apps/oauth-demo: + dependencies: + express: + specifier: ^4.18.2 + version: 4.18.2 + fs-extra: + specifier: ^11.1.0 + version: 11.1.0 + tailchat-server-sdk: + specifier: workspace:^ + version: link:../../server/packages/sdk + devDependencies: + '@types/express': + specifier: ^4.17.15 + version: 4.17.15 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: + specifier: 4.9.4 + version: 4.9.4 - packages/design: - specifiers: - '@babel/core': ^7.17.9 - '@iconify/react': ^3.2.1 - '@storybook/addon-actions': ^6.4.22 - '@storybook/addon-essentials': ^6.4.22 - '@storybook/addon-interactions': ^6.4.22 - '@storybook/addon-links': ^6.4.22 - '@storybook/react': ^6.4.22 - '@storybook/testing-library': ^0.0.11 - '@types/lodash': ^4.14.170 - antd: ^4.19.5 - babel-loader: ^8.2.5 - lodash: ^4.17.21 - meta-form: ^1.0.0 - react: 17.0.2 - react-dom: 17.0.2 - str2int: ^1.1.0 - typescript: ^4.5.2 - webpack: ^5.72.0 - dependencies: - '@iconify/react': 3.2.1 - antd: 4.20.4_sfoxds7t5ydpegc3knd667wn6m - lodash: 4.17.21 - meta-form: link:../meta-form - str2int: 1.1.0 + apps/widget: devDependencies: - '@babel/core': 7.17.10 - '@storybook/addon-actions': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/addon-essentials': 6.4.22_ubrf73fv3gag46ubi26vwtl5ya - '@storybook/addon-interactions': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/addon-links': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/react': 6.4.22_utlndcjoixapem4pxrt4hkdn44 - '@storybook/testing-library': 0.0.11_sfoxds7t5ydpegc3knd667wn6m - '@types/lodash': 4.14.178 - babel-loader: 8.2.5_we4j6ycntotymd3gptdmlkk2fi - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - typescript: 4.6.4 - webpack: 5.72.1 - - packages/meta-form: - specifiers: - '@types/lodash': ^4.14.170 - '@types/react': ^17.0.39 - formik: ^2.2.9 - lodash: ^4.17.21 - react: 17.0.2 - typescript: ^4.5.2 - yup: ^0.32.9 - dependencies: - formik: 2.2.9_react@17.0.2 - lodash: 4.17.21 - yup: 0.32.11 + typescript: + specifier: 4.9.4 + version: 4.9.4 + + client/packages/design: + dependencies: + '@iconify/react': + specifier: ^3.2.1 + version: 3.2.2(react@18.2.0) + '@remirror/pm': + specifier: ^2.0.0 + version: 2.0.0 + '@remirror/react': + specifier: ^2.0.9 + version: 2.0.9(@babel/core@7.18.13)(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(remirror@2.0.9) + ahooks: + specifier: ^3.7.4 + version: 3.7.4(react@18.2.0) + antd: + specifier: ^4.24.13 + version: 4.24.13(react-dom@18.2.0)(react@18.2.0) + clsx: + specifier: ^1.1.1 + version: 1.2.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + react-fastify-form: + specifier: 1.0.13 + version: 1.0.13(react@18.2.0) + remirror: + specifier: ^2.0.9 + version: 2.0.9(@remirror/pm@2.0.0)(@types/node@18.11.9)(prettier@2.8.4)(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2) + str2int: + specifier: ^1.1.0 + version: 1.1.0 devDependencies: - '@types/lodash': 4.14.178 - '@types/react': 17.0.44 - react: 17.0.2 - typescript: 4.6.4 - - packages/plugin-declaration-generator: - specifiers: - '@babel/generator': ^7.17.7 - '@babel/parser': ^7.17.7 - '@babel/template': ^7.16.7 - '@babel/traverse': ^7.17.3 - '@babel/types': ^7.17.10 - '@types/babel__generator': ^7.6.4 - '@types/babel__template': ^7.4.1 - '@types/babel__traverse': ^7.17.1 - '@types/fs-extra': ^9.0.13 - '@types/lodash': ^4.14.170 - '@types/mkdirp': ^1.0.2 - '@types/node': ^15.12.5 - fs-extra: ^10.0.0 - glob: ^7.2.0 - lodash: ^4.17.21 - mkdirp: ^1.0.4 - ts-node: ^10.0.0 - typescript: ^4.5.2 - dependencies: - '@babel/generator': 7.17.10 - '@babel/parser': 7.17.10 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - fs-extra: 10.1.0 - glob: 7.2.0 - lodash: 4.17.21 - mkdirp: 1.0.4 - typescript: 4.6.4 + '@babel/core': + specifier: ^7.17.9 + version: 7.18.13 + '@storybook/addon-actions': + specifier: ^6.4.22 + version: 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-essentials': + specifier: ^6.4.22 + version: 6.5.10(@babel/core@7.18.13)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0) + '@storybook/addon-interactions': + specifier: ^6.4.22 + version: 6.5.10(@types/react@18.0.20)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/addon-links': + specifier: ^6.4.22 + version: 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/react': + specifier: ^6.4.22 + version: 6.5.10(@babel/core@7.18.13)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(require-from-string@2.0.2)(typescript@4.9.4) + '@storybook/testing-library': + specifier: ^0.0.11 + version: 0.0.11(react-dom@18.2.0)(react@18.2.0) + '@types/lodash': + specifier: ^4.14.170 + version: 4.14.184 + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + '@types/react-dom': + specifier: 18.0.6 + version: 18.0.6 + babel-loader: + specifier: ^8.2.5 + version: 8.2.5(@babel/core@7.18.13)(webpack@5.75.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + typescript: + specifier: 4.9.4 + version: 4.9.4 + webpack: + specifier: 5.75.0 + version: 5.75.0(esbuild@0.15.18) + + client/packages/plugin-declaration-generator: + dependencies: + '@babel/generator': + specifier: ^7.20.5 + version: 7.20.5 + '@babel/parser': + specifier: ^7.20.5 + version: 7.20.5 + '@babel/template': + specifier: ^7.18.10 + version: 7.18.10 + '@babel/traverse': + specifier: ^7.20.5 + version: 7.20.5 + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + glob: + specifier: ^7.2.3 + version: 7.2.3 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + mkdirp: + specifier: ^1.0.4 + version: 1.0.4 + ts-morph: + specifier: ^16.0.0 + version: 16.0.0 + typescript: + specifier: 4.9.4 + version: 4.9.4 devDependencies: - '@babel/types': 7.17.10 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.17.1 - '@types/fs-extra': 9.0.13 - '@types/lodash': 4.14.178 - '@types/mkdirp': 1.0.2 - '@types/node': 15.14.9 - ts-node: 10.7.0_ixcth6kbstn6no7hiktnzckliq - - packages/rollup-plugin-source-ref: - specifiers: - '@babel/generator': ^7.17.7 - '@babel/parser': ^7.17.7 - '@babel/traverse': ^7.17.3 - '@babel/types': ^7.17.10 - '@types/babel__generator': ^7.6.4 - '@types/babel__traverse': ^7.17.1 - '@types/node': ^15.12.5 - '@types/webpack': ^5.28.0 - rollup: ^2.75.0 - ts-node: ^10.0.0 - typescript: ^4.5.2 - webpack: ^5.72.0 - webpack-test-utils: ^1.1.0 - dependencies: - '@babel/generator': 7.17.10 - '@babel/parser': 7.17.10 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 + '@babel/types': + specifier: ^7.20.5 + version: 7.20.5 + '@types/babel__generator': + specifier: ^7.6.4 + version: 7.6.4 + '@types/babel__template': + specifier: ^7.4.1 + version: 7.4.1 + '@types/babel__traverse': + specifier: ^7.18.3 + version: 7.18.3 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/mkdirp': + specifier: ^1.0.2 + version: 1.0.2 + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + + client/packages/tailchat-client-sdk: + dependencies: + axios: + specifier: ^1.3.2 + version: 1.3.2 + socket.io-client: + specifier: ^4.7.1 + version: 4.7.1 + socket.io-msgpack-parser: + specifier: ^3.0.2 + version: 3.0.2 + tailchat-types: + specifier: workspace:* + version: link:../../../packages/types devDependencies: - '@types/babel__generator': 7.6.4 - '@types/babel__traverse': 7.17.1 - '@types/node': 15.14.9 - '@types/webpack': 5.28.0 - rollup: 2.75.0 - ts-node: 10.7.0_ixcth6kbstn6no7hiktnzckliq - typescript: 4.6.4 - webpack: 5.72.1 - webpack-test-utils: 1.1.0_webpack@5.72.1 - - packages/source-ref-loader: - specifiers: - '@babel/generator': ^7.17.7 - '@babel/parser': ^7.17.7 - '@babel/traverse': ^7.17.3 - '@babel/types': ^7.17.10 - '@types/babel__generator': ^7.6.4 - '@types/babel__traverse': ^7.17.1 - '@types/node': ^15.12.5 - '@types/webpack': ^5.28.0 - ts-node: ^10.0.0 - typescript: ^4.5.2 - webpack: ^5.72.0 - webpack-test-utils: ^1.1.0 - dependencies: - '@babel/generator': 7.17.10 - '@babel/parser': 7.17.10 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 + '@types/jest': + specifier: ^29.5.1 + version: 29.5.1 + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + jest: + specifier: 27.5.1 + version: 27.5.1(ts-node@10.9.1) + ts-jest: + specifier: 27.1.4 + version: 27.1.4(@babel/core@7.21.0)(@types/jest@29.5.1)(esbuild@0.15.18)(jest@27.5.1)(typescript@4.9.4) + typescript: + specifier: 4.9.4 + version: 4.9.4 + + client/shared: + dependencies: + '@reduxjs/toolkit': + specifier: ^1.7.1 + version: 1.8.5(react-redux@8.0.2)(react@18.2.0) + '@tanstack/query-async-storage-persister': + specifier: 4.32.6 + version: 4.32.6 + '@tanstack/react-query': + specifier: 4.33.0 + version: 4.33.0(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-persist-client': + specifier: 4.33.0 + version: 4.33.0(@tanstack/react-query@4.33.0) + axios: + specifier: ^0.21.1 + version: 0.21.4 + crc: + specifier: ^3.8.0 + version: 3.8.0 + dayjs: + specifier: ^1.10.6 + version: 1.11.5 + eventemitter-strict: + specifier: ^1.0.1 + version: 1.0.1 + filesize: + specifier: ^8.0.7 + version: 8.0.7 + flatted: + specifier: ^3.2.4 + version: 3.2.7 + formik: + specifier: ^2.2.9 + version: 2.2.9(react@18.2.0) + i18next: + specifier: ^21.9.2 + version: 21.9.2 + i18next-http-backend: + specifier: ^1.4.1 + version: 1.4.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-i18next: + specifier: ^11.18.6 + version: 11.18.6(i18next@21.9.2)(react-dom@18.2.0)(react@18.2.0) + react-native-storage: + specifier: npm:@trpgengine/react-native-storage@^1.0.1 + version: /@trpgengine/react-native-storage@1.0.1 + react-redux: + specifier: ^8.0.2 + version: 8.0.2(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + regenerator-runtime: + specifier: ^0.13.9 + version: 0.13.9 + socket.io-client: + specifier: ^4.1.2 + version: 4.5.1 + socket.io-msgpack-parser: + specifier: ^3.0.2 + version: 3.0.2 + tailchat-types: + specifier: workspace:^ + version: link:../../packages/types + url-regex: + specifier: ^5.0.0 + version: 5.0.0 + yup: + specifier: ^0.32.9 + version: 0.32.11 + zustand: + specifier: 4.3.6 + version: 4.3.6(immer@9.0.21)(react@18.2.0) devDependencies: - '@types/babel__generator': 7.6.4 - '@types/babel__traverse': 7.17.1 - '@types/node': 15.14.9 - '@types/webpack': 5.28.0 - ts-node: 10.7.0_ixcth6kbstn6no7hiktnzckliq - typescript: 4.6.4 - webpack: 5.72.1 - webpack-test-utils: 1.1.0_webpack@5.72.1 - - packages/source-ref-open-vscode: - specifiers: {} - - shared: - specifiers: - '@reduxjs/toolkit': ^1.7.1 - '@types/crc': ^3.4.0 - '@types/lodash': ^4.14.170 - '@types/react-redux': ^7.1.24 - axios: ^0.21.1 - crc: ^3.8.0 - dayjs: ^1.10.6 - events: ^3.3.0 - filesize: ^8.0.7 - flatted: ^3.2.4 - formik: ^2.2.9 - i18next: ^20.3.2 - i18next-http-backend: ^1.2.6 - lodash: ^4.17.21 - react: 17.0.2 - react-i18next: ^11.15.1 - react-native-storage: npm:@trpgengine/react-native-storage@^1.0.1 - react-query: ^3.34.6 - react-redux: ^7.2.6 - regenerator-runtime: ^0.13.9 - socket.io-client: ^4.1.2 - url-regex: ^5.0.0 - yup: ^0.32.9 - dependencies: - '@reduxjs/toolkit': 1.8.1_bjryulbxll5jujtwpu5a2wm2cy - axios: 0.21.4 - crc: 3.8.0 - dayjs: 1.10.7 - events: 3.3.0 - filesize: 8.0.7 - flatted: 3.2.5 - formik: 2.2.9_react@17.0.2 - i18next: 20.6.1 - i18next-http-backend: 1.4.0 - lodash: 4.17.21 - react-i18next: 11.16.9_fx4b3zen7tdcdwbld3lkpcycbu - react-native-storage: /@trpgengine/react-native-storage/1.0.1 - react-query: 3.39.0_react@17.0.2 - react-redux: 7.2.8_react@17.0.2 - regenerator-runtime: 0.13.9 - socket.io-client: 4.4.0 - url-regex: 5.0.0 - yup: 0.32.11 + '@types/crc': + specifier: ^3.4.0 + version: 3.8.0 + '@types/lodash': + specifier: ^4.14.170 + version: 4.14.184 + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + react: + specifier: 18.2.0 + version: 18.2.0 + + client/web: + dependencies: + '@bytemd/plugin-gfm': + specifier: ^1.21.0 + version: 1.21.0(bytemd@1.21.0) + '@bytemd/react': + specifier: ^1.21.0 + version: 1.21.0(react@18.2.0) + '@emoji-mart/data': + specifier: ^1.1.2 + version: 1.1.2 + '@emoji-mart/react': + specifier: ^1.1.1 + version: 1.1.1(emoji-mart@5.5.2)(react@18.2.0) + '@loadable/component': + specifier: ^5.15.3 + version: 5.15.3(react@18.2.0) + '@tanstack/react-query-devtools': + specifier: 4.33.0 + version: 4.33.0(@tanstack/react-query@4.33.0)(react-dom@18.2.0)(react@18.2.0) + '@use-gesture/react': + specifier: ^10.2.24 + version: 10.2.24(react@18.2.0) + ahooks: + specifier: ^3.7.4 + version: 3.7.4(react@18.2.0) + antd: + specifier: ^4.24.13 + version: 4.24.13(react-dom@18.2.0)(react@18.2.0) + array-move: + specifier: 3.0.1 + version: 3.0.1 + axios: + specifier: ^0.21.4 + version: 0.21.4 + bytemd: + specifier: ^1.21.0 + version: 1.21.0 + clsx: + specifier: ^1.2.1 + version: 1.2.1 + compressorjs: + specifier: ^1.1.1 + version: 1.1.1 + copy-to-clipboard: + specifier: ^3.3.3 + version: 3.3.3 + detect-browser: + specifier: ^5.3.0 + version: 5.3.0 + emoji-mart: + specifier: ^5.5.2 + version: 5.5.2 + generate-json-webpack-plugin: + specifier: ^2.0.0 + version: 2.0.0 + immer: + specifier: 9.0.21 + version: 9.0.21 + is-electron: + specifier: ^2.2.2 + version: 2.2.2 + is-hotkey: + specifier: ^0.2.0 + version: 0.2.0 + jsonschema: + specifier: ^1.4.1 + version: 1.4.1 + jwt-decode: + specifier: ^3.1.2 + version: 3.1.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + memoize-one: + specifier: ^6.0.0 + version: 6.0.0 + mini-star: + specifier: 2.1.1 + version: 2.1.1 + minimatch: + specifier: ^5.1.6 + version: 5.1.6 + p-min-delay: + specifier: ^4.0.2 + version: 4.0.2 + qs: + specifier: ^6.11.0 + version: 6.11.0 + rc-tree: + specifier: ^5.7.2 + version: 5.7.2(react-dom@18.2.0)(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@18.11.9)(@types/react@18.0.20)(react@18.2.0) + react-dnd-html5-backend: + specifier: ^16.0.1 + version: 16.0.1 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-easy-crop: + specifier: ^5.0.0 + version: 5.0.0(react-dom@18.2.0)(react@18.2.0) + react-easy-sort: + specifier: ^1.5.1 + version: 1.5.1(react-dom@18.2.0)(react@18.2.0) + react-helmet: + specifier: ^6.1.0 + version: 6.1.0(react@18.2.0) + react-is: + specifier: ^18.2.0 + version: 18.2.0 + react-markdown: + specifier: ^8.0.5 + version: 8.0.5(@types/react@18.0.20)(react@18.2.0) + react-mentions: + specifier: ^4.4.7 + version: 4.4.7(react-dom@18.2.0)(react@18.2.0) + react-router: + specifier: 6.11.0 + version: 6.11.0(react@18.2.0) + react-router-dom: + specifier: 6.11.0 + version: 6.11.0(react-dom@18.2.0)(react@18.2.0) + react-split: + specifier: ^2.0.14 + version: 2.0.14(react@18.2.0) + react-transition-group: + specifier: ^4.4.5 + version: 4.4.5(react-dom@18.2.0)(react@18.2.0) + react-virtualized-auto-sizer: + specifier: ^1.0.7 + version: 1.0.7(react-dom@18.2.0)(react@18.2.0) + react-virtuoso: + specifier: ^4.4.0 + version: 4.4.0(react-dom@18.2.0)(react@18.2.0) + rehype-raw: + specifier: ^6.1.1 + version: 6.1.1 + rehype-sanitize: + specifier: ^6.0.0 + version: 6.0.0 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + socket.io-client: + specifier: ^4.6.1 + version: 4.6.1 + source-ref-runtime: + specifier: ^1.0.7 + version: 1.0.7 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + tailchat-design: + specifier: workspace:^1.0.0 + version: link:../packages/design + tailchat-shared: + specifier: ^1.0.0 + version: link:../shared + tailwindcss: + specifier: ^2.2.19 + version: 2.2.19(autoprefixer@10.4.13)(postcss@8.4.21)(ts-node@10.9.1) + url: + specifier: ^0.11.0 + version: 0.11.0 + web-vitals: + specifier: ^3.1.1 + version: 3.1.1 + yup: + specifier: ^0.32.11 + version: 0.32.11 + zustand: + specifier: 4.3.6 + version: 4.3.6(immer@9.0.21)(react@18.2.0) devDependencies: - '@types/crc': 3.4.0 - '@types/lodash': 4.14.178 - '@types/react-redux': 7.1.24 - react: 17.0.2 - - web: - specifiers: - '@loadable/component': ^5.15.2 - '@testing-library/jest-dom': ^5.14.1 - '@testing-library/react': ^12.0.0 - '@testing-library/react-hooks': ^7.0.1 - '@types/copy-webpack-plugin': ^8.0.0 - '@types/dts-generator': ^2.1.6 - '@types/emoji-mart': ^3.0.8 - '@types/is-hotkey': ^0.1.5 - '@types/jest': ^27.0.3 - '@types/loadable__component': ^5.13.4 - '@types/lodash': ^4.14.170 - '@types/mini-css-extract-plugin': ^1.4.3 - '@types/node': ^15.12.5 - '@types/qs': ^6.9.7 - '@types/react': ^17.0.39 - '@types/react-dom': ^17.0.8 - '@types/react-helmet': ^6.1.2 - '@types/react-mentions': ^4.1.5 - '@types/react-router': ^5.1.15 - '@types/react-router-dom': ^5.1.7 - '@types/react-transition-group': ^4.4.2 - '@types/react-virtualized': ^9.21.14 - '@types/react-virtualized-auto-sizer': ^1.0.1 - '@types/webpack': ^5.28.0 - '@types/webpack-bundle-analyzer': ^4.4.1 - '@types/webpack-dev-server': ^4.3.1 - antd: ^4.19.5 - autoprefixer: ^10.2.6 - axios: ^0.21.1 - bundle-stats-webpack-plugin: ^3.2.9 - clsx: ^1.1.1 - compressorjs: ^1.1.1 - copy-to-clipboard: ^3.3.1 - copy-webpack-plugin: ^9.0.1 - cross-env: ^7.0.3 - css-loader: ^5.2.6 - dotenv: ^10.0.0 - dts-generator: ^3.0.0 - emoji-mart: ^3.0.1 - esbuild-loader: ^2.13.1 - execa: ^5.1.1 - file-loader: ^6.2.0 - glob: ^7.2.0 - html-webpack-plugin: ^5.3.2 - is-hotkey: ^0.2.0 - jest: ^27.4.5 - jsonschema: ^1.4.0 - jwt-decode: ^3.1.2 - less: ^4.1.1 - less-loader: ^10.0.0 - lodash: ^4.17.21 - memoize-one: ^6.0.0 - mini-css-extract-plugin: ^1.6.2 - mini-star: ^1.3.1 - p-min-delay: ^4.0.0 - postcss: ^8.3.5 - postcss-loader: ^6.1.0 - qs: ^6.10.3 - rc-tree: ^5.3.6 - react: 17.0.2 - react-dom: 17.0.2 - react-easy-crop: ^3.5.2 - react-helmet: ^6.1.0 - react-markdown: '6' - react-mentions: ^4.3.1 - react-router: ^5.2.0 - react-router-dom: ^5.2.0 - react-split: ^2.0.14 - react-transition-group: ^4.4.2 - react-use-gesture: ^9.1.3 - react-virtualized-auto-sizer: ^1.0.6 - react-virtuoso: ^2.8.3 - rimraf: ^3.0.2 - rollup-plugin-copy: ^3.4.0 - rollup-plugin-replace: ^2.2.0 - rollup-plugin-source-ref: workspace:^1.0.0 - socket.io-client: ^4.1.2 - source-ref-loader: workspace:^1.0.0 - source-ref-open-vscode: workspace:^1.0.0 - style-loader: ^3.0.0 - tailchat-design: workspace:^1.0.0 - tailchat-plugin-declaration-generator: workspace:^1.0.0 - tailchat-shared: '*' - tailwindcss: ^2.2.4 - ts-jest: ^27.1.2 - ts-node: ^10.0.0 - tsconfig-paths: ^3.9.0 - tsconfig-paths-webpack-plugin: ^3.5.1 - typescript: ^4.5.2 - url: ^0.11.0 - url-loader: ^4.1.1 - webpack: 5.73.0 - webpack-bundle-analyzer: ^4.5.0 - webpack-cli: ^4.9.1 - webpack-dev-server: ^4.3.1 - webpackbar: ^5.0.2 - workbox-webpack-plugin: ^6.5.1 - yup: ^0.32.9 - dependencies: - '@loadable/component': 5.15.2_react@17.0.2 - antd: 4.20.4_sfoxds7t5ydpegc3knd667wn6m - axios: 0.21.4 - clsx: 1.1.1 - compressorjs: 1.1.1 - copy-to-clipboard: 3.3.1 - emoji-mart: 3.0.1_react@17.0.2 - is-hotkey: 0.2.0 - jsonschema: 1.4.0 - jwt-decode: 3.1.2 - lodash: 4.17.21 - memoize-one: 6.0.0 - mini-star: 1.3.1 - p-min-delay: 4.0.1 - qs: 6.10.3 - rc-tree: 5.6.1_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-easy-crop: 3.5.3_sfoxds7t5ydpegc3knd667wn6m - react-helmet: 6.1.0_react@17.0.2 - react-markdown: 6.0.3_zdsfwtvwq54q3oqxwtq4jnbhh4 - react-mentions: 4.3.2_sfoxds7t5ydpegc3knd667wn6m - react-router: 5.3.1_react@17.0.2 - react-router-dom: 5.3.1_react@17.0.2 - react-split: 2.0.14_react@17.0.2 - react-transition-group: 4.4.2_sfoxds7t5ydpegc3knd667wn6m - react-use-gesture: 9.1.3_react@17.0.2 - react-virtualized-auto-sizer: 1.0.6_sfoxds7t5ydpegc3knd667wn6m - react-virtuoso: 2.11.0_sfoxds7t5ydpegc3knd667wn6m - socket.io-client: 4.4.0 - source-ref-open-vscode: link:../packages/source-ref-open-vscode - tailchat-design: link:../packages/design - tailchat-shared: link:../shared - tailwindcss: 2.2.19_hqu7j45oxtlo2g5y3qitzppg3y - url: 0.11.0 - yup: 0.32.11 + '@perfsee/webpack': + specifier: 1.0.0-alpha.4 + version: 1.0.0-alpha.4(webpack@5.75.0) + '@testing-library/jest-dom': + specifier: ^5.16.5 + version: 5.16.5 + '@testing-library/react': + specifier: ^13.4.0 + version: 13.4.0(react-dom@18.2.0)(react@18.2.0) + '@testing-library/react-hooks': + specifier: ^8.0.1 + version: 8.0.1(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@types/copy-webpack-plugin': + specifier: ^8.0.1 + version: 8.0.1(esbuild@0.12.29)(webpack-cli@4.10.0) + '@types/dts-generator': + specifier: ^2.1.7 + version: 2.1.7 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/generate-json-webpack-plugin': + specifier: ^0.3.4 + version: 0.3.4 + '@types/is-hotkey': + specifier: ^0.1.7 + version: 0.1.7 + '@types/jest': + specifier: ^29.4.0 + version: 29.4.0 + '@types/loadable__component': + specifier: ^5.13.4 + version: 5.13.4 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/mini-css-extract-plugin': + specifier: ^1.4.3 + version: 1.4.3(esbuild@0.12.29)(webpack-cli@4.10.0) + '@types/minimatch': + specifier: ^3.0.5 + version: 3.0.5 + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + '@types/qs': + specifier: ^6.9.7 + version: 6.9.7 + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + '@types/react-dom': + specifier: 18.0.6 + version: 18.0.6 + '@types/react-helmet': + specifier: ^6.1.6 + version: 6.1.6 + '@types/react-mentions': + specifier: ^4.1.8 + version: 4.1.8 + '@types/react-router': + specifier: ^5.1.20 + version: 5.1.20 + '@types/react-router-dom': + specifier: ^5.3.3 + version: 5.3.3 + '@types/react-transition-group': + specifier: ^4.4.5 + version: 4.4.5 + '@types/react-virtualized': + specifier: ^9.21.21 + version: 9.21.21 + '@types/react-virtualized-auto-sizer': + specifier: ^1.0.1 + version: 1.0.1 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + '@types/webpack': + specifier: ^5.28.0 + version: 5.28.0(esbuild@0.12.29)(webpack-cli@4.10.0) + '@types/webpack-bundle-analyzer': + specifier: ^4.6.0 + version: 4.6.0(esbuild@0.12.29)(webpack-cli@4.10.0) + '@types/webpack-dev-server': + specifier: ^4.7.2 + version: 4.7.2(webpack-cli@4.10.0)(webpack@5.75.0) + autoprefixer: + specifier: ^10.4.13 + version: 10.4.13(postcss@8.4.21) + bundle-stats-webpack-plugin: + specifier: ^4.2.3 + version: 4.2.3(react-dom@18.2.0)(react@18.2.0)(webpack@5.75.0) + copy-webpack-plugin: + specifier: ^11.0.0 + version: 11.0.0(webpack@5.75.0) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + css-loader: + specifier: ^5.2.7 + version: 5.2.7(webpack@5.75.0) + css-minimizer-webpack-plugin: + specifier: ^4.2.2 + version: 4.2.2(esbuild@0.12.29)(webpack@5.75.0) + dotenv: + specifier: ^10.0.0 + version: 10.0.0 + dts-generator: + specifier: ^3.0.0 + version: 3.0.0 + esbuild-loader: + specifier: ^2.21.0 + version: 2.21.0(webpack@5.75.0) + execa: + specifier: ^5.1.1 + version: 5.1.1 + file-loader: + specifier: ^6.2.0 + version: 6.2.0(webpack@5.75.0) + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + glob: + specifier: ^7.2.3 + version: 7.2.3 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.5.0(webpack@5.75.0) + identity-obj-proxy: + specifier: ^3.0.0 + version: 3.0.0 + jest: + specifier: 27.5.1 + version: 27.5.1(ts-node@10.9.1) + jest-environment-jsdom: + specifier: 27.5.1 + version: 27.5.1 + less: + specifier: ^4.1.3 + version: 4.1.3 + less-loader: + specifier: ^10.2.0 + version: 10.2.0(less@4.1.3)(webpack@5.75.0) + mini-css-extract-plugin: + specifier: ^2.7.2 + version: 2.7.2(webpack@5.75.0) + normalize-path: + specifier: ^3.0.0 + version: 3.0.0 + postcss: + specifier: ^8.4.21 + version: 8.4.21 + postcss-loader: + specifier: ^6.2.1 + version: 6.2.1(postcss@8.4.21)(webpack@5.75.0) + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + rollup-plugin-copy: + specifier: ^3.4.0 + version: 3.4.0 + rollup-plugin-replace: + specifier: ^2.2.0 + version: 2.2.0 + rollup-plugin-source-ref: + specifier: ^1.0.7 + version: 1.0.7 + source-ref-loader: + specifier: ^1.0.7 + version: 1.0.7 + style-loader: + specifier: ^3.3.1 + version: 3.3.1(webpack@5.75.0) + tailchat-plugin-declaration-generator: + specifier: workspace:^1.0.0 + version: link:../packages/plugin-declaration-generator + terser-webpack-plugin: + specifier: ^5.3.6 + version: 5.3.6(esbuild@0.12.29)(webpack@5.75.0) + ts-jest: + specifier: 27.1.4 + version: 27.1.4(@babel/core@7.21.0)(@types/jest@29.4.0)(esbuild@0.12.29)(jest@27.5.1)(typescript@4.9.4) + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + tsconfig-paths: + specifier: ^3.14.1 + version: 3.14.1 + tsconfig-paths-webpack-plugin: + specifier: ^4.0.0 + version: 4.0.0 + typescript: + specifier: 4.9.4 + version: 4.9.4 + url-loader: + specifier: ^4.1.1 + version: 4.1.1(file-loader@6.2.0)(webpack@5.75.0) + webpack: + specifier: 5.75.0 + version: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + webpack-bundle-analyzer: + specifier: ^4.8.0 + version: 4.8.0 + webpack-cli: + specifier: ^4.10.0 + version: 4.10.0(webpack-bundle-analyzer@4.8.0)(webpack-dev-server@4.11.1)(webpack@5.75.0) + webpack-dev-server: + specifier: ^4.11.1 + version: 4.11.1(webpack-cli@4.10.0)(webpack@5.75.0) + webpack-retry-chunk-load-plugin: + specifier: ^3.1.1 + version: 3.1.1(webpack@5.75.0) + webpack-stats-viewer-plugin: + specifier: 1.0.2 + version: 1.0.2(webpack@5.75.0) + webpackbar: + specifier: ^5.0.2 + version: 5.0.2(webpack@5.75.0) + workbox-build: + specifier: ^6.5.4 + version: 6.5.4 + workbox-webpack-plugin: + specifier: ^6.5.4 + version: 6.5.4(webpack@5.75.0) + + client/web/plugins/com.msgbyte.ai-assistant: devDependencies: - '@testing-library/jest-dom': 5.16.4 - '@testing-library/react': 12.1.5_sfoxds7t5ydpegc3knd667wn6m - '@testing-library/react-hooks': 7.0.2_sfoxds7t5ydpegc3knd667wn6m - '@types/copy-webpack-plugin': 8.0.1_webpack-cli@4.9.2 - '@types/dts-generator': 2.1.7 - '@types/emoji-mart': 3.0.9 - '@types/is-hotkey': 0.1.7 - '@types/jest': 27.5.1 - '@types/loadable__component': 5.13.4 - '@types/lodash': 4.14.178 - '@types/mini-css-extract-plugin': 1.4.3_webpack-cli@4.9.2 - '@types/node': 15.14.9 - '@types/qs': 6.9.7 - '@types/react': 17.0.44 - '@types/react-dom': 17.0.16 - '@types/react-helmet': 6.1.5 - '@types/react-mentions': 4.1.6 - '@types/react-router': 5.1.18 - '@types/react-router-dom': 5.3.3 - '@types/react-transition-group': 4.4.4 - '@types/react-virtualized': 9.21.21 - '@types/react-virtualized-auto-sizer': 1.0.1 - '@types/webpack': 5.28.0_webpack-cli@4.9.2 - '@types/webpack-bundle-analyzer': 4.4.1_webpack-cli@4.9.2 - '@types/webpack-dev-server': 4.7.2_gkh3o7gdsall36kyfdv2sybo54 - autoprefixer: 10.4.7_postcss@8.4.13 - bundle-stats-webpack-plugin: 3.3.8_webpack@5.73.0 - copy-webpack-plugin: 9.1.0_webpack@5.73.0 - cross-env: 7.0.3 - css-loader: 5.2.7_webpack@5.73.0 - dotenv: 10.0.0 - dts-generator: 3.0.0 - esbuild-loader: 2.18.0_webpack@5.73.0 - execa: 5.1.1 - file-loader: 6.2.0_webpack@5.73.0 - glob: 7.2.0 - html-webpack-plugin: 5.5.0_webpack@5.73.0 - jest: 27.5.1_ts-node@10.7.0 - less: 4.1.2 - less-loader: 10.2.0_less@4.1.2+webpack@5.73.0 - mini-css-extract-plugin: 1.6.2_webpack@5.73.0 - postcss: 8.4.13 - postcss-loader: 6.2.1_antlv5ffwu5b3l6qf5ix53g2p4 - rimraf: 3.0.2 - rollup-plugin-copy: 3.4.0 - rollup-plugin-replace: 2.2.0 - rollup-plugin-source-ref: link:../packages/rollup-plugin-source-ref - source-ref-loader: link:../packages/source-ref-loader - style-loader: 3.3.1_webpack@5.73.0 - tailchat-plugin-declaration-generator: link:../packages/plugin-declaration-generator - ts-jest: 27.1.4_ibhx3ehxrt2kgmkik4bkzmyeei - ts-node: 10.7.0_ixcth6kbstn6no7hiktnzckliq - tsconfig-paths: 3.14.1 - tsconfig-paths-webpack-plugin: 3.5.2 - typescript: 4.6.4 - url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm - webpack: 5.73.0_webpack-cli@4.9.2 - webpack-bundle-analyzer: 4.5.0 - webpack-cli: 4.9.2_w5nksobufzg2ereh4ivwj2odyu - webpack-dev-server: 4.9.0_gkh3o7gdsall36kyfdv2sybo54 - webpackbar: 5.0.2_webpack@5.73.0 - workbox-webpack-plugin: 6.5.3_webpack@5.73.0 - - web/plugins/com.msgbyte.bbcode: - specifiers: - '@bbob/parser': ^2.7.0 - '@types/react-highlight': ^0.12.5 - highlight.js: ^11.5.1 - react: 17.0.2 - react-dom: 17.0.2 - react-highlight: ^0.14.0 - url-regex: ^5.0.0 - dependencies: - '@bbob/parser': 2.8.0 - highlight.js: 11.5.1 - react-highlight: 0.14.0_sfoxds7t5ydpegc3knd667wn6m - url-regex: 5.0.0 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + client/web/plugins/com.msgbyte.bbcode: + dependencies: + '@bbob/parser': + specifier: ^2.7.0 + version: 2.8.1 + highlight.js: + specifier: ^11.5.1 + version: 11.6.0 + react-highlight: + specifier: ^0.14.0 + version: 0.14.0(react-dom@18.2.0)(react@18.2.0) + url-regex: + specifier: ^5.0.0 + version: 5.0.0 devDependencies: - '@types/react-highlight': 0.12.5 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@types/react-highlight': + specifier: ^0.12.5 + version: 0.12.5 + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) - web/plugins/com.msgbyte.draw: - specifiers: - '@types/react-canvas-draw': ^1.1.1 - react: 17.0.2 - react-canvas-draw: ^1.2.1 + client/web/plugins/com.msgbyte.biggerfont: dependencies: - react-canvas-draw: 1.2.1_react@17.0.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 devDependencies: - '@types/react-canvas-draw': 1.2.0 - react: 17.0.2 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - web/plugins/com.msgbyte.genshin: - specifiers: - genshin-gacha-kit: ^1.1.0 - html-react-parser: ^1.4.5 - react: 17.0.2 + client/web/plugins/com.msgbyte.draw: dependencies: - genshin-gacha-kit: 1.1.0 - html-react-parser: 1.4.12_react@17.0.2 + react-canvas-draw: + specifier: ^1.2.1 + version: 1.2.1(react@18.2.0) devDependencies: - react: 17.0.2 - - web/plugins/com.msgbyte.intro: - specifiers: - shepherd.js: ^8.3.1 - dependencies: - shepherd.js: 8.3.1 + '@types/react-canvas-draw': + specifier: ^1.1.1 + version: 1.2.0 + react: + specifier: 18.2.0 + version: 18.2.0 - web/plugins/com.msgbyte.miaolang: - specifiers: - miao-lang: ^1.0.5 + client/web/plugins/com.msgbyte.env.electron: dependencies: - miao-lang: 1.0.5 + semver: + specifier: ^7.5.4 + version: 7.5.4 + devDependencies: + '@types/semver': + specifier: ^7.5.0 + version: 7.5.0 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - web/plugins/com.msgbyte.notify: - specifiers: {} + client/web/plugins/com.msgbyte.env.rn: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - web/plugins/com.msgbyte.openapi: - specifiers: {} + client/web/plugins/com.msgbyte.filepizza: + devDependencies: + react: + specifier: 18.2.0 + version: 18.2.0 - web/plugins/com.msgbyte.theme.genshin: - specifiers: {} + client/web/plugins/com.msgbyte.filesend: + devDependencies: + react: + specifier: 18.2.0 + version: 18.2.0 - web/plugins/com.msgbyte.theme.miku: - specifiers: {} + client/web/plugins/com.msgbyte.filesfm: + devDependencies: + react: + specifier: 18.2.0 + version: 18.2.0 - web/plugins/com.msgbyte.webview: - specifiers: - js-base64: ^3.7.2 - script_sanitize: ^1.2.6 + client/web/plugins/com.msgbyte.genshin: dependencies: - js-base64: 3.7.2 - script_sanitize: 1.2.6 + genshin-gacha-kit: + specifier: ^1.1.0 + version: 1.1.0 + html-react-parser: + specifier: ^1.4.5 + version: 1.4.14(react@18.2.0) + devDependencies: + react: + specifier: 18.2.0 + version: 18.2.0 -packages: + client/web/plugins/com.msgbyte.integration: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - /@ampproject/remapping/2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} - engines: {node: '>=6.0.0'} + client/web/plugins/com.msgbyte.intro: dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.13 - dev: true + shepherd.js: + specifier: ^11.1.1 + version: 11.1.1 - /@ant-design/colors/6.0.0: - resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + client/web/plugins/com.msgbyte.mdpanel: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + client/web/plugins/com.msgbyte.miaolang: dependencies: - '@ctrl/tinycolor': 3.4.1 - dev: false + miao-lang: + specifier: ^1.0.5 + version: 1.0.5 - /@ant-design/icons-svg/4.2.1: - resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==} - dev: false + client/web/plugins/com.msgbyte.music: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + client/web/plugins/com.msgbyte.notify: + dependencies: + lodash: + specifier: ^4.17.21 + version: 4.17.21 + tinycon: + specifier: ^0.6.8 + version: 0.6.8 + devDependencies: + '@types/tinycon': + specifier: ^0.6.3 + version: 0.6.3 - /@ant-design/icons/4.7.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-aoB4Z7JA431rt6d4u+8xcNPPCrdufSRMUOpxa1ab6mz1JCQZOEVolj2WVs/tDFmN62zzK30mNelEsprLYsSF3g==} - engines: {node: '>=8'} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - dependencies: - '@ant-design/colors': 6.0.0 - '@ant-design/icons-svg': 4.2.1 - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - dev: false + client/web/plugins/com.msgbyte.offline-icons: + devDependencies: + '@babel/parser': + specifier: ^7.20.5 + version: 7.20.5 + '@babel/traverse': + specifier: ^7.20.5 + version: 7.20.5 + '@babel/types': + specifier: ^7.20.5 + version: 7.20.5 + '@types/babel__traverse': + specifier: ^7.18.3 + version: 7.18.3 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + globby: + specifier: 11.1.0 + version: 11.1.0 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: + specifier: 4.9.4 + version: 4.9.4 - /@ant-design/react-slick/0.28.4_react@17.0.2: - resolution: {integrity: sha512-j9eAHTn7GxbXUFNknJoHS2ceAsqrQi2j8XykjZE1IXCD8kJF+t28EvhBLniDpbOsBk/3kjalnhriTfZcjBHNqg==} - peerDependencies: - react: '>=16.9.0' - dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - json2mq: 0.2.0 - lodash: 4.17.21 - react: 17.0.2 - resize-observer-polyfill: 1.5.1 - dev: false + client/web/plugins/com.msgbyte.openapi: {} - /@apideck/better-ajv-errors/0.3.3_ajv@8.11.0: - resolution: {integrity: sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==} - engines: {node: '>=10'} - peerDependencies: - ajv: '>=8' + client/web/plugins/com.msgbyte.posthog: dependencies: - ajv: 8.11.0 - json-schema: 0.4.0 - jsonpointer: 5.0.0 - leven: 3.1.0 - dev: true + posthog-js: + specifier: ^1.35.0 + version: 1.35.0 + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + client/web/plugins/com.msgbyte.sentry: + dependencies: + '@sentry/react': + specifier: ^7.38.0 + version: 7.38.0(react@18.2.0) + '@sentry/tracing': + specifier: ^7.38.0 + version: 7.38.0 + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - /@babel/code-frame/7.12.11: - resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - dependencies: - '@babel/highlight': 7.17.9 - dev: true + client/web/plugins/com.msgbyte.snapdrop: {} - /@babel/code-frame/7.16.7: - resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.17.9 + client/web/plugins/com.msgbyte.theme.genshin: {} - /@babel/compat-data/7.17.10: - resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==} - engines: {node: '>=6.9.0'} - dev: true + client/web/plugins/com.msgbyte.theme.miku: {} - /@babel/core/7.12.9: - resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.10 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helpers': 7.17.9 - '@babel/parser': 7.17.10 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 - convert-source-map: 1.8.0 - debug: 4.3.3 - gensync: 1.0.0-beta.2 - json5: 2.2.1 - lodash: 4.17.21 - resolve: 1.22.0 - semver: 5.7.1 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - dev: true + client/web/plugins/com.msgbyte.toolwa: {} - /@babel/core/7.17.10: - resolution: {integrity: sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.10 - '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helpers': 7.17.9 - '@babel/parser': 7.17.10 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 - convert-source-map: 1.8.0 - debug: 4.3.3 - gensync: 1.0.0-beta.2 - json5: 2.2.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true + client/web/plugins/com.msgbyte.user.location: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + client/web/plugins/com.msgbyte.webview: + dependencies: + url-regex: + specifier: ^5.0.0 + version: 5.0.0 + xss: + specifier: ^1.0.14 + version: 1.0.14 + + client/web/plugins/com.msgbyte.wenshushu: + devDependencies: + react: + specifier: 18.2.0 + version: 18.2.0 - /@babel/generator/7.17.10: - resolution: {integrity: sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==} - engines: {node: '>=6.9.0'} + client/web/plugins/com.msgbyte.widget.sakana: dependencies: - '@babel/types': 7.17.10 - '@jridgewell/gen-mapping': 0.1.1 - jsesc: 2.5.2 + sakana-widget: + specifier: ^2.6.0 + version: 2.6.0 + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.10(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - /@babel/helper-annotate-as-pure/7.16.7: - resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.10 - dev: true + client/web/plugins/com.msgbyte.wormhole: + devDependencies: + react: + specifier: 18.2.0 + version: 18.2.0 - /@babel/helper-builder-binary-assignment-operator-visitor/7.16.7: - resolution: {integrity: sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-explode-assignable-expression': 7.16.7 - '@babel/types': 7.17.10 - dev: true + packages/types: + devDependencies: + concurrently: + specifier: ^7.6.0 + version: 7.6.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + typescript: + specifier: 4.9.4 + version: 4.9.4 + + server: + dependencies: + '@socket.io/admin-ui': + specifier: ^0.5.1 + version: 0.5.1(socket.io@4.7.2) + '@socket.io/redis-adapter': + specifier: ^8.2.1 + version: 8.2.1(socket.io-adapter@2.5.2) + '@typegoose/typegoose': + specifier: 9.3.1 + version: 9.3.1(mongoose@6.1.1) + '@types/blessed': + specifier: ^0.1.19 + version: 0.1.19 + '@types/bluebird': + specifier: ^3.5.36 + version: 3.5.36 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + accepts: + specifier: ^1.3.8 + version: 1.3.8 + bcryptjs: + specifier: ^2.4.3 + version: 2.4.3 + bluebird: + specifier: ^3.7.2 + version: 3.7.2 + crc: + specifier: ^3.8.0 + version: 3.8.0 + crypto-random-string: + specifier: 3.3.1 + version: 3.3.1 + dotenv: + specifier: ^10.0.0 + version: 10.0.0 + ejs: + specifier: ^3.1.6 + version: 3.1.8 + es6-error: + specifier: ^4.1.1 + version: 4.1.1 + execa: + specifier: '5' + version: 5.1.1 + glob: + specifier: ^10.3.3 + version: 10.3.3 + got: + specifier: 11.8.3 + version: 11.8.3 + i18next: + specifier: ^20.3.5 + version: 20.6.1 + ioredis: + specifier: ^4.27.6 + version: 4.28.5 + jsonwebtoken: + specifier: ^8.5.1 + version: 8.5.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + mime: + specifier: ^2.5.2 + version: 2.6.0 + mkdirp: + specifier: ^1.0.4 + version: 1.0.4 + moment: + specifier: ^2.29.1 + version: 2.29.4 + mongodb: + specifier: 4.2.1 + version: 4.2.1 + mongoose: + specifier: 6.1.1 + version: 6.1.1 + mongoose-findorcreate: + specifier: 3.0.0 + version: 3.0.0 + nanoid: + specifier: ^3.1.23 + version: 3.3.4 + nodemailer: + specifier: ^6.7.2 + version: 6.7.8 + oidc-provider: + specifier: ^7.10.6 + version: 7.11.5 + p-map: + specifier: ^4.0.0 + version: 4.0.0 + promise-retry: + specifier: ^2.0.1 + version: 2.0.1 + qs: + specifier: ^6.10.3 + version: 6.11.0 + redlock: + specifier: ^4.2.0 + version: 4.2.0 + send: + specifier: ^0.18.0 + version: 0.18.0 + serve-static: + specifier: ^1.15.0 + version: 1.15.0 + socket.io: + specifier: ^4.7.2 + version: 4.7.2 + socket.io-msgpack-parser: + specifier: ^3.0.2 + version: 3.0.2 + tailchat-server-sdk: + specifier: workspace:* + version: link:packages/sdk + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: + specifier: 4.9.4 + version: 4.9.4 + url-regex: + specifier: ^5.0.0 + version: 5.0.0 + devDependencies: + '@babel/helper-compilation-targets': + specifier: ^7.18.2 + version: 7.18.9(@babel/core@7.21.0) + '@types/accepts': + specifier: ^1.3.5 + version: 1.3.5 + '@types/bcryptjs': + specifier: ^2.4.2 + version: 2.4.2 + '@types/crc': + specifier: ^3.4.0 + version: 3.8.0 + '@types/ejs': + specifier: ^3.1.0 + version: 3.1.1 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/i18next-fs-backend': + specifier: ^1.0.1 + version: 1.1.2 + '@types/inquirer': + specifier: ^8.2.1 + version: 8.2.3 + '@types/ioredis': + specifier: ^4.26.4 + version: 4.28.10 + '@types/jest': + specifier: ^26.0.23 + version: 26.0.24 + '@types/jsonwebtoken': + specifier: ^8.5.2 + version: 8.5.9 + '@types/lodash': + specifier: ^4.14.170 + version: 4.14.184 + '@types/mime': + specifier: ^2.0.3 + version: 2.0.3 + '@types/minio': + specifier: ^7.0.9 + version: 7.0.13 + '@types/mkdirp': + specifier: ^1.0.1 + version: 1.0.2 + '@types/mongoose': + specifier: ^5.11.97 + version: 5.11.97 + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + '@types/nodemailer': + specifier: ^6.4.4 + version: 6.4.5 + '@types/oidc-provider': + specifier: ^7.8.1 + version: 7.11.1 + '@types/promise-retry': + specifier: ^1.1.3 + version: 1.1.3 + '@types/send': + specifier: ^0.17.1 + version: 0.17.1 + '@types/serve-static': + specifier: ^1.15.0 + version: 1.15.0 + '@types/swagger-jsdoc': + specifier: ^6.0.1 + version: 6.0.1 + fs-extra: + specifier: ^10.0.0 + version: 10.1.0 + gulp-sort: + specifier: ^2.0.0 + version: 2.0.0 + i18next-scanner: + specifier: ^3.0.0 + version: 3.3.0 + inquirer: + specifier: ^8.2.2 + version: 8.2.4 + jest: + specifier: 27.5.1 + version: 27.5.1(ts-node@10.9.1) + mini-star: + specifier: ^1.2.8 + version: 1.3.1 + moleculer: + specifier: 0.14.23 + version: 0.14.23(patch_hash=ahhlgpfy57fntn2aftq6beaeja)(ioredis@4.28.5)(nats@1.4.12)(redlock@4.2.0) + moleculer-cli: + specifier: ^0.7.1 + version: 0.7.1(ejs@3.1.8)(ioredis@4.28.5)(redlock@4.2.0) + neo-blessed: + specifier: ^0.2.0 + version: 0.2.0 + ora: + specifier: '5' + version: 5.4.1 + prettier: + specifier: ^2.3.2 + version: 2.7.1 + socket.io-client: + specifier: ^4.1.3 + version: 4.5.1 + swagger-jsdoc: + specifier: ^6.2.8 + version: 6.2.8(openapi-types@12.1.0) + tailchat-service-openapi-generator: + specifier: workspace:^ + version: link:packages/openapi-generator + tailchat-service-swagger-generator: + specifier: workspace:^1.0.0 + version: link:packages/swagger-jsdoc-generator + ts-jest: + specifier: 27.1.4 + version: 27.1.4(@babel/core@7.21.0)(@types/jest@26.0.24)(esbuild@0.12.29)(jest@27.5.1)(typescript@4.9.4) + vinyl-fs: + specifier: ^3.0.3 + version: 3.0.3 + + server/admin: + dependencies: + '@bytemd/plugin-gfm': + specifier: ^1.21.0 + version: 1.21.0(bytemd@1.21.0) + '@bytemd/react': + specifier: ^1.21.0 + version: 1.21.0(react@18.2.0) + '@fastify/busboy': + specifier: ^1.1.0 + version: 1.1.0 + '@loadable/component': + specifier: ^5.15.3 + version: 5.15.3(react@18.2.0) + axios: + specifier: ^1.4.0 + version: 1.4.0 + bytemd: + specifier: ^1.21.0 + version: 1.21.0 + compression: + specifier: ^1.7.4 + version: 1.7.4 + dayjs: + specifier: ^1.11.7 + version: 1.11.7 + express: + specifier: ^4.18.2 + version: 4.18.2 + express-mongoose-ra-json-server: + specifier: ^0.1.0 + version: 0.1.0(express@4.18.2)(mongoose@6.1.1) + filesize: + specifier: ^8.0.7 + version: 8.0.7 + jsonwebtoken: + specifier: ^8.5.1 + version: 8.5.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + md5: + specifier: ^2.3.0 + version: 2.3.0 + morgan: + specifier: ^1.10.0 + version: 1.10.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + tailchat-server-sdk: + specifier: workspace:^ + version: link:../packages/sdk + tushan: + specifier: ^0.3.11 + version: 0.3.11(prop-types@15.8.1)(ts-node@10.9.1) + vite-express: + specifier: 0.8.0 + version: 0.8.0(patch_hash=u6touqej4dt3zxnslnszarl7vq)(express@4.18.2)(vite@4.2.0) + devDependencies: + '@types/compression': + specifier: ^1.7.2 + version: 1.7.2 + '@types/express': + specifier: ^4.17.15 + version: 4.17.15 + '@types/loadable__component': + specifier: ^5.13.4 + version: 5.13.4 + '@types/md5': + specifier: ^2.3.2 + version: 2.3.2 + '@types/morgan': + specifier: ^1.9.4 + version: 1.9.4 + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + '@types/react-dom': + specifier: ^18.0.11 + version: 18.0.11 + '@vitejs/plugin-react': + specifier: ^3.1.0 + version: 3.1.0(vite@4.2.0) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: + specifier: 4.9.4 + version: 4.9.4 + vite: + specifier: ^4.2.0 + version: 4.2.0(@types/node@18.11.9) + + server/packages/openapi-generator: + dependencies: + '@apidevtools/swagger-parser': + specifier: ^10.1.0 + version: 10.1.0(openapi-types@12.1.0) + globby: + specifier: 11.1.0 + version: 11.1.0 + openapi3-ts: + specifier: ^4.3.1 + version: 4.3.1 + tailchat-server-sdk: + specifier: workspace:^ + version: link:../sdk + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + devDependencies: + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + typescript: + specifier: 4.9.4 + version: 4.9.4 + + server/packages/sdk: + dependencies: + '@fastify/busboy': + specifier: ^1.1.0 + version: 1.1.0 + '@typegoose/typegoose': + specifier: 9.3.1 + version: 9.3.1(mongoose@6.1.1) + accept-language: + specifier: ^3.0.18 + version: 3.0.18 + axios: + specifier: ^1.3.3 + version: 1.3.3 + body-parser: + specifier: ^1.20.1 + version: 1.20.1 + crc: + specifier: ^3.8.0 + version: 3.8.0 + dotenv: + specifier: ^10.0.0 + version: 10.0.0 + etag: + specifier: ^1.8.1 + version: 1.8.1 + fastest-validator: + specifier: ^1.12.0 + version: 1.13.0 + fresh: + specifier: ^0.5.2 + version: 0.5.2 + i18next: + specifier: ^20.3.5 + version: 20.6.1 + i18next-fs-backend: + specifier: ^1.1.1 + version: 1.1.5 + ioredis: + specifier: ^4.27.6 + version: 4.28.5 + isstream: + specifier: ^0.1.2 + version: 0.1.2 + kleur: + specifier: ^4.1.4 + version: 4.1.5 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + minio: + specifier: ^7.1.1 + version: 7.1.1 + moleculer: + specifier: 0.14.23 + version: 0.14.23(patch_hash=ahhlgpfy57fntn2aftq6beaeja)(ioredis@4.28.5)(nats@1.4.12)(redlock@4.2.0) + moleculer-db: + specifier: 0.8.19 + version: 0.8.19(moleculer@0.14.23) + moleculer-repl: + specifier: ^0.7.2 + version: 0.7.2 + moment: + specifier: ^2.29.1 + version: 2.29.4 + mongodb: + specifier: 4.2.1 + version: 4.2.1 + mongoose: + specifier: 6.1.1 + version: 6.1.1 + path-to-regexp: + specifier: ^6.2.1 + version: 6.2.1 + ramda-adjunct: + specifier: ^4.0.0 + version: 4.0.0(ramda@0.29.0) + tailchat-types: + specifier: workspace:* + version: link:../../../packages/types + devDependencies: + '@types/jest': + specifier: ^29.5.1 + version: 29.5.1 + typescript: + specifier: 4.9.4 + version: 4.9.4 - /@babel/helper-compilation-targets/7.17.10_@babel+core@7.17.10: - resolution: {integrity: sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + server/packages/swagger-jsdoc-generator: dependencies: - '@babel/compat-data': 7.17.10 - '@babel/core': 7.17.10 - '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.3 - semver: 6.3.0 - dev: true + globby: + specifier: 11.1.0 + version: 11.1.0 + ts-morph: + specifier: ^16.0.0 + version: 16.0.0 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + devDependencies: + '@types/node': + specifier: 18.11.9 + version: 18.11.9 + typescript: + specifier: 4.9.4 + version: 4.9.4 - /@babel/helper-create-class-features-plugin/7.17.9_@babel+core@7.17.10: - resolution: {integrity: sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + server/plugins/com.msgbyte.agora: dependencies: - '@babel/core': 7.17.10 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.17.9 - '@babel/helper-member-expression-to-functions': 7.17.7 - '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-replace-supers': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - transitivePeerDependencies: - - supports-color - dev: true + got: + specifier: 11.8.3 + version: 11.8.3 + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@rollup/plugin-replace': + specifier: ^5.0.2 + version: 5.0.2(rollup@2.79.1) + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + mini-star: + specifier: '*' + version: 2.0.5 + normalize-path: + specifier: ^3.0.0 + version: 3.0.0 + rollup-plugin-copy: + specifier: ^3.4.0 + version: 3.4.0 + + server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora: + dependencies: + agora-rtc-react: + specifier: ^1.1.3 + version: 1.1.3(react@18.2.0) + ahooks: + specifier: ^3.7.4 + version: 3.7.4(react@18.2.0) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + zustand: + specifier: 4.3.6 + version: 4.3.6(immer@9.0.21)(react@18.2.0) + + server/plugins/com.msgbyte.autojoinGroup: + dependencies: + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + mini-star: + specifier: '*' + version: 1.3.1 - /@babel/helper-create-regexp-features-plugin/7.17.0_@babel+core@7.17.10: - resolution: {integrity: sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + server/plugins/com.msgbyte.discover: dependencies: - '@babel/core': 7.17.10 - '@babel/helper-annotate-as-pure': 7.16.7 - regexpu-core: 5.0.1 + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + mini-star: + specifier: '*' + version: 1.3.1 + + server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + server/plugins/com.msgbyte.getui: + dependencies: + got: + specifier: 11.8.3 + version: 11.8.3 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + + server/plugins/com.msgbyte.github: + dependencies: + '@octokit/webhooks-types': + specifier: ^5.4.0 + version: 5.8.0 + devDependencies: + '@types/react-router': + specifier: ^5.1.20 + version: 5.1.20 + less: + specifier: ^4.1.2 + version: 4.1.3 + mini-star: + specifier: ^1.2.8 + version: 1.3.1 + rollup-plugin-less: + specifier: ^1.1.3 + version: 1.1.3 + + server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github: {} + + server/plugins/com.msgbyte.iam: + dependencies: + got: + specifier: 11.8.3 + version: 11.8.3 + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + mini-star: + specifier: '*' + version: 1.3.1 + + server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + server/plugins/com.msgbyte.linkmeta: + dependencies: + got: + specifier: 11.8.3 + version: 11.8.3 + link-preview-js: + specifier: ^2.1.10 + version: 2.1.19 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + devDependencies: + less: + specifier: ^4.1.2 + version: 4.1.3 + mini-star: + specifier: ^1.2.8 + version: 1.3.1 + + server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta: + dependencies: + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + url-regex: + specifier: ^5.0.0 + version: 5.0.0 + + server/plugins/com.msgbyte.livekit: + dependencies: + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + express: + specifier: ^4.18.2 + version: 4.18.2 + livekit-server-sdk: + specifier: ^1.2.5 + version: 1.2.5 + long: + specifier: ^5.2.3 + version: 5.2.3 + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@types/express': + specifier: ^4.17.15 + version: 4.17.17 + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + mini-star: + specifier: '*' + version: 1.3.1 + normalize-path: + specifier: ^3.0.0 + version: 3.0.0 + rollup-plugin-copy: + specifier: ^3.4.0 + version: 3.4.0 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + + server/plugins/com.msgbyte.livekit/web/plugins/com.msgbyte.livekit: + dependencies: + '@livekit/components-core': + specifier: ^0.6.11 + version: 0.6.11(livekit-client@1.12.1) + '@livekit/components-react': + specifier: ^1.0.8 + version: 1.0.8(livekit-client@1.12.1)(react-dom@18.2.0)(react@18.2.0) + '@livekit/components-styles': + specifier: ^1.0.4 + version: 1.0.4 + livekit-client: + specifier: ^1.12.1 + version: 1.12.1 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + zustand: + specifier: 4.3.6 + version: 4.3.6(immer@9.0.21)(react@18.2.0) + devDependencies: + '@types/lodash': + specifier: ^4.14.196 + version: 4.14.196 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + react-router: + specifier: 6.11.0 + version: 6.11.0(react@18.2.0) + styled-components: + specifier: ^5.3.6 + version: 5.3.10(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + server/plugins/com.msgbyte.meeting: + devDependencies: + less: + specifier: ^4.1.2 + version: 4.1.3 + mini-star: + specifier: ^1.3.1 + version: 1.3.1 + rollup: + specifier: ^2.75.3 + version: 2.78.1 + rollup-plugin-polyfill-node: + specifier: ^0.9.0 + version: 0.9.0(rollup@2.78.1) + + server/plugins/com.msgbyte.meeting/web/plugins/com.msgbyte.meeting: + dependencies: + tailchat-meeting-sdk: + specifier: 1.2.4 + version: 1.2.4 + devDependencies: + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + '@types/react-router': + specifier: ^5.1.18 + version: 5.1.18 + react: + specifier: 18.2.0 + version: 18.2.0 + + server/plugins/com.msgbyte.prettyinvite: + dependencies: + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + + server/plugins/com.msgbyte.simplenotify: + devDependencies: + mini-star: + specifier: ^1.2.8 + version: 1.3.1 + + server/plugins/com.msgbyte.simplenotify/web/plugins/com.msgbyte.simplenotify: + devDependencies: + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + react: + specifier: 18.2.0 + version: 18.2.0 + + server/plugins/com.msgbyte.tasks: + devDependencies: + less: + specifier: ^4.1.2 + version: 4.1.3 + mini-star: + specifier: ^1.2.8 + version: 1.3.1 + rollup-plugin-less: + specifier: ^1.1.3 + version: 1.1.3 + + server/plugins/com.msgbyte.tasks/web/plugins/com.msgbyte.tasks: {} + + server/plugins/com.msgbyte.topic: + dependencies: + lodash: + specifier: ^4.17.21 + version: 4.17.21 + nanoid: + specifier: ^3.1.23 + version: 3.3.4 + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + less: + specifier: ^4.1.3 + version: 4.1.3 + mini-star: + specifier: '*' + version: 1.3.1 + rollup-plugin-inject-process-env: + specifier: ^1.3.1 + version: 1.3.1 + rollup-plugin-less: + specifier: ^1.1.3 + version: 1.1.3 + + server/plugins/com.msgbyte.topic/web/plugins/com.msgbyte.topic: + dependencies: + lodash: + specifier: ^4.17.21 + version: 4.17.21 + devDependencies: + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.191 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + zustand: + specifier: 4.3.6 + version: 4.3.6(immer@9.0.21)(react@18.2.0) + + server/plugins/com.msgbyte.welcome: + dependencies: + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + mini-star: + specifier: '*' + version: 1.3.1 + + server/plugins/com.msgbyte.welcome/web/plugins/com.msgbyte.welcome: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + server/plugins/com.msgbyte.wxpusher: + dependencies: + got: + specifier: 11.8.3 + version: 11.8.3 + tailchat-server-sdk: + specifier: '*' + version: link:../../packages/sdk + devDependencies: + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + mini-star: + specifier: '*' + version: 1.3.1 + normalize-path: + specifier: ^3.0.0 + version: 3.0.0 + rollup-plugin-copy: + specifier: ^3.4.0 + version: 3.4.0 + + server/plugins/com.msgbyte.wxpusher/web/plugins/com.msgbyte.wxpusher: + devDependencies: + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + react: + specifier: 18.2.0 + version: 18.2.0 + styled-components: + specifier: ^5.3.6 + version: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + server/test/demo/openapi-client: + dependencies: + axios: + specifier: ^0.26.0 + version: 0.26.1 + express: + specifier: ^4.17.2 + version: 4.18.2 + openid-client: + specifier: ^5.1.5 + version: 5.3.2 + devDependencies: + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + + server/test/demo/openapi-client-simple: + dependencies: + axios: + specifier: ^0.26.0 + version: 0.26.1 + express: + specifier: ^4.17.2 + version: 4.18.2 + devDependencies: + '@types/express': + specifier: ^4.17.15 + version: 4.17.15 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + + server/test/demo/openapi-oidc-page: + dependencies: + express: + specifier: ^4.17.2 + version: 4.18.2 + devDependencies: + '@types/express': + specifier: ^4.17.15 + version: 4.17.17 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + + website: + dependencies: + '@docusaurus/core': + specifier: 2.4.0 + version: 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/preset-classic': + specifier: 2.4.0 + version: 2.4.0(@algolia/client-search@4.14.3)(@types/react@18.0.20)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/theme-common': + specifier: 2.4.0 + version: 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/types': + specifier: 2.4.0 + version: 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@mdx-js/react': + specifier: ^1.6.22 + version: 1.6.22(react@17.0.2) + '@svgr/webpack': + specifier: ^5.5.0 + version: 5.5.0 + clsx: + specifier: ^1.2.1 + version: 1.2.1 + docusaurus-plugin-image-zoom: + specifier: ^0.1.1 + version: 0.1.1 + docusaurus-plugin-less: + specifier: ^2.0.2 + version: 2.0.2(@docusaurus/core@2.4.0)(less-loader@10.2.0)(less@4.1.3) + file-loader: + specifier: ^6.2.0 + version: 6.2.0(webpack@5.75.0) + medium-zoom: + specifier: ^1.0.8 + version: 1.0.8 + prism-react-renderer: + specifier: ^1.3.5 + version: 1.3.5(react@17.0.2) + react: + specifier: ^17.0.2 + version: 17.0.2 + react-dom: + specifier: ^17.0.2 + version: 17.0.2(react@17.0.2) + url-loader: + specifier: ^4.1.1 + version: 4.1.1(file-loader@6.2.0)(webpack@5.75.0) + devDependencies: + '@docusaurus/module-type-aliases': + specifier: 2.4.0 + version: 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@tsconfig/docusaurus': + specifier: ^1.0.6 + version: 1.0.6 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + '@types/react': + specifier: 18.0.20 + version: 18.0.20 + '@types/react-helmet': + specifier: ^6.1.6 + version: 6.1.6 + '@types/react-router-dom': + specifier: ^5.3.3 + version: 5.3.3 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + fs-extra: + specifier: ^10.1.0 + version: 10.1.0 + glob: + specifier: ^7.2.3 + version: 7.2.3 + less: + specifier: ^4.1.3 + version: 4.1.3 + less-loader: + specifier: ^10.2.0 + version: 10.2.0(less@4.1.3)(webpack@5.75.0) + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: + specifier: 4.9.4 + version: 4.9.4 + +packages: + + /@adobe/css-tools@4.2.0: + resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==} + dev: true + + /@algolia/autocomplete-core@1.7.4: + resolution: {integrity: sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==} + dependencies: + '@algolia/autocomplete-shared': 1.7.4 + dev: false + + /@algolia/autocomplete-preset-algolia@1.7.4(@algolia/client-search@4.14.3)(algoliasearch@4.14.3): + resolution: {integrity: sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/autocomplete-shared': 1.7.4 + '@algolia/client-search': 4.14.3 + algoliasearch: 4.14.3 + dev: false + + /@algolia/autocomplete-shared@1.7.4: + resolution: {integrity: sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==} + dev: false + + /@algolia/cache-browser-local-storage@4.14.3: + resolution: {integrity: sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==} + dependencies: + '@algolia/cache-common': 4.14.3 + dev: false + + /@algolia/cache-common@4.14.3: + resolution: {integrity: sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==} + dev: false + + /@algolia/cache-in-memory@4.14.3: + resolution: {integrity: sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==} + dependencies: + '@algolia/cache-common': 4.14.3 + dev: false + + /@algolia/client-account@4.14.3: + resolution: {integrity: sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==} + dependencies: + '@algolia/client-common': 4.14.3 + '@algolia/client-search': 4.14.3 + '@algolia/transporter': 4.14.3 + dev: false + + /@algolia/client-analytics@4.14.3: + resolution: {integrity: sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==} + dependencies: + '@algolia/client-common': 4.14.3 + '@algolia/client-search': 4.14.3 + '@algolia/requester-common': 4.14.3 + '@algolia/transporter': 4.14.3 + dev: false + + /@algolia/client-common@4.14.3: + resolution: {integrity: sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==} + dependencies: + '@algolia/requester-common': 4.14.3 + '@algolia/transporter': 4.14.3 + dev: false + + /@algolia/client-personalization@4.14.3: + resolution: {integrity: sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==} + dependencies: + '@algolia/client-common': 4.14.3 + '@algolia/requester-common': 4.14.3 + '@algolia/transporter': 4.14.3 + dev: false + + /@algolia/client-search@4.14.3: + resolution: {integrity: sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==} + dependencies: + '@algolia/client-common': 4.14.3 + '@algolia/requester-common': 4.14.3 + '@algolia/transporter': 4.14.3 + dev: false + + /@algolia/events@4.0.1: + resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} + dev: false + + /@algolia/logger-common@4.14.3: + resolution: {integrity: sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==} + dev: false + + /@algolia/logger-console@4.14.3: + resolution: {integrity: sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==} + dependencies: + '@algolia/logger-common': 4.14.3 + dev: false + + /@algolia/requester-browser-xhr@4.14.3: + resolution: {integrity: sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==} + dependencies: + '@algolia/requester-common': 4.14.3 + dev: false + + /@algolia/requester-common@4.14.3: + resolution: {integrity: sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==} + dev: false + + /@algolia/requester-node-http@4.14.3: + resolution: {integrity: sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==} + dependencies: + '@algolia/requester-common': 4.14.3 + dev: false + + /@algolia/transporter@4.14.3: + resolution: {integrity: sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==} + dependencies: + '@algolia/cache-common': 4.14.3 + '@algolia/logger-common': 4.14.3 + '@algolia/requester-common': 4.14.3 + dev: false + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + + /@ampproject/remapping@2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + + /@ant-design/colors@6.0.0: + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + dependencies: + '@ctrl/tinycolor': 3.6.0 + dev: false + + /@ant-design/icons-svg@4.2.1: + resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==} + dev: false + + /@ant-design/icons@4.8.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.2.1 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@ant-design/react-slick@1.0.2(react@18.2.0): + resolution: {integrity: sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==} + peerDependencies: + react: '>=16.9.0' + dependencies: + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + json2mq: 0.2.0 + react: 18.2.0 + resize-observer-polyfill: 1.5.1 + throttle-debounce: 5.0.0 + dev: false + + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + + /@apidevtools/json-schema-ref-parser@9.0.6: + resolution: {integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==} + dependencies: + '@jsdevtools/ono': 7.1.3 + call-me-maybe: 1.0.1 + js-yaml: 3.14.1 + dev: false + + /@apidevtools/json-schema-ref-parser@9.1.1: + resolution: {integrity: sha512-Qx3hKlS1bNLQKLKJF90gb4t9C5mzvoIwL6SwchZUg25qi64yL9POVbtZYNxhnBX8ToXw3hASbHbhMJ0w3m+HYQ==} + engines: {node: '>= 17'} + deprecated: This version contained an accidental bc-break, please update to 9.1.2. + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.11 + call-me-maybe: 1.0.1 + js-yaml: 4.1.0 + dev: true + + /@apidevtools/openapi-schemas@2.1.0: + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + /@apidevtools/swagger-methods@3.0.2: + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + /@apidevtools/swagger-parser@10.0.3(openapi-types@12.1.0): + resolution: {integrity: sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==} + peerDependencies: + openapi-types: '>=7' + dependencies: + '@apidevtools/json-schema-ref-parser': 9.1.1 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + call-me-maybe: 1.0.1 + openapi-types: 12.1.0 + z-schema: 5.0.5 + dev: true + + /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.0): + resolution: {integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==} + peerDependencies: + openapi-types: '>=7' + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.6 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) + call-me-maybe: 1.0.1 + openapi-types: 12.1.0 + dev: false + + /@arco-design/color@0.4.0: + resolution: {integrity: sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==} + dependencies: + color: 3.2.1 + dev: false + + /@arco-design/web-react@2.51.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-oHZFLYSU81WY6Fyg2b+1X96MUhDtImwCqqABO7cIfNerzw3MkEW9xExaOCkvolbBjPKmFOzXrYgxg75TJBymMw==} + peerDependencies: + react: '>=16' + react-dom: '>=16' + dependencies: + '@arco-design/color': 0.4.0 + '@babel/runtime': 7.21.0 + b-tween: 0.3.3 + b-validate: 1.5.3 + compute-scroll-into-view: 1.0.20 + dayjs: 1.11.7 + lodash: 4.17.21 + number-precision: 1.6.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-focus-lock: 2.9.5(@types/react@18.0.20)(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.20 + shallowequal: 1.1.0 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@babel/code-frame@7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + + /@babel/compat-data@7.18.13: + resolution: {integrity: sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==} + engines: {node: '>=6.9.0'} + + /@babel/compat-data@7.21.0: + resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.12.9: + resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.1 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.2 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@9.2.2) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + lodash: 4.17.21 + resolve: 1.22.2 + semver: 5.7.1 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + + /@babel/core@7.18.13: + resolution: {integrity: sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.7 + '@babel/helper-compilation-targets': 7.18.9(@babel/core@7.18.13) + '@babel/helper-module-transforms': 7.18.9 + '@babel/helpers': 7.18.9 + '@babel/parser': 7.20.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 + convert-source-map: 1.8.0 + debug: 4.3.4(supports-color@9.2.2) + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + /@babel/core@7.21.0: + resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.1 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.2 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@9.2.2) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.20.5: + resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: false + + /@babel/generator@7.20.7: + resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + + /@babel/generator@7.21.1: + resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + 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.2 + + /@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.2 + + /@babel/helper-compilation-targets@7.18.9(@babel/core@7.18.13): + resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.18.13 + '@babel/core': 7.18.13 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.3 + semver: 6.3.0 + + /@babel/helper-compilation-targets@7.18.9(@babel/core@7.21.0): + resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.18.13 + '@babel/core': 7.21.0 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.3 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.18.13 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@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.0(@babel/core@7.18.13): + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@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-class-features-plugin@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@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 + + /@babel/helper-create-regexp-features-plugin@7.21.0(@babel/core@7.18.13): + resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.3.1 + + /@babel/helper-define-polyfill-provider@0.1.5(@babel/core@7.21.0): + resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/traverse': 7.21.2 + debug: 4.3.4(supports-color@9.2.2) + lodash.debounce: 4.0.8 + resolve: 1.22.2 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.18.13): + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + debug: 4.3.4(supports-color@9.2.2) + lodash.debounce: 4.0.8 + resolve: 1.22.2 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.0): + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + debug: 4.3.4(supports-color@9.2.2) + lodash.debounce: 4.0.8 + resolve: 1.22.2 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + /@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.2 + + /@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.2 + + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + + /@babel/helper-member-expression-to-functions@7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + + /@babel/helper-module-imports@7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + + /@babel/helper-module-transforms@7.18.9: + resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@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.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + + /@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.18.6 + '@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.2 + '@babel/types': 7.21.2 + 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.2 + + /@babel/helper-plugin-utils@7.10.4: + resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} + + /@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.18.13): + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@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.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.0): + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@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.2 + transitivePeerDependencies: + - supports-color + + /@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.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + + /@babel/helper-simple-access@7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + + /@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.2 + + /@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.2 + + /@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.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + 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.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + + /@babel/helpers@7.18.9: + resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + + /@babel/helpers@7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + 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.20.5: + resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.2 + + /@babel/parser@7.20.7: + resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.2 + + /@babel/parser@7.21.2: + resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.2 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.18.13 + '@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.18.13) + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.21.0 + '@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.0) + + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.18.13): + 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.18.13 + '@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.18.13) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.13) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.0): + 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.0 + '@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.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.0) + transitivePeerDependencies: + - supports-color + + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.18.13): + 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.18.13 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.0): + 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.0 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.18.13): + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.18.13) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.0) + transitivePeerDependencies: + - supports-color + + /@babel/plugin-proposal-decorators@7.18.10(@babel/core@7.21.0): + resolution: {integrity: sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.0) + '@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.18.6(@babel/core@7.21.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.0) + + /@babel/plugin-proposal-export-default-from@7.18.10(@babel/core@7.21.0): + resolution: {integrity: sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-default-from': 7.18.6(@babel/core@7.21.0) + dev: true + + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.18.13): + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.0) + + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.0) + + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.13) + dev: true + + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.0) + + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.0) + + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.13) + dev: true + + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.0) + + /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): + resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.12.9) + + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.18.13 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.18.13) + dev: true + + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.21.0) + + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.13) + dev: true + + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.0) + + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.18.13): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@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.18.13) + dev: true + + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@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.0) + + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.18.13): + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.18.13) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.0) + transitivePeerDependencies: + - supports-color + + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.13): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.0): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.0): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.13): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.0): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.18.13): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.0): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-decorators@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.0): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-export-default-from@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.0): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-flow@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.18.13): + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.0): + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9): + resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.13): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.0): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.0): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.13): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.0): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.0): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.0): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.13): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.0): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.18.13): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.0): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.13): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.0): + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.18.13): + 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.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.18.13) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.0) + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.18.13): + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.18.13): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.18.13) + '@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-classes@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) + '@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 + + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/template': 7.20.7 + dev: true + + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/template': 7.20.7 + + /@babel/plugin-transform-destructuring@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-destructuring@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.18.13): + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-flow-strip-types@7.18.9(@babel/core@7.18.13): + resolution: {integrity: sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.18.13): + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.18.13): + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.18.13) + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.0): + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.18.13): + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.0): + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.18.13): + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.0): + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.18.13): + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@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-commonjs@7.21.2(@babel/core@7.21.0): + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.18.13): + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@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-systemjs@7.20.11(@babel/core@7.21.0): + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@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 + + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.18.13): + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.0): + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.18.13): + 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.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-parameters@7.20.7(@babel/core@7.12.9): + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-parameters@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-parameters@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-react-constant-elements@7.20.2(@babel/core@7.21.0): + resolution: {integrity: sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/plugin-transform-react-jsx': 7.18.10(@babel/core@7.18.13) + dev: true + + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/plugin-transform-react-jsx': 7.18.10(@babel/core@7.21.0) + + /@babel/plugin-transform-react-jsx-self@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.21.0): + resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-react-jsx@7.18.10(@babel/core@7.18.13): + resolution: {integrity: sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.18.13) + '@babel/types': 7.21.2 + dev: true + + /@babel/plugin-transform-react-jsx@7.18.10(@babel/core@7.21.0): + resolution: {integrity: sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.0) + '@babel/types': 7.21.2 + + /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.18.13): + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.1 + dev: true + + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.0): + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.1 + + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-runtime@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.0) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.0) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.0) + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.18.13): + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + dev: true + + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.0): + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.18.13): + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.0): + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.18.13): + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.0): + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-typescript@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.0) + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.18.13): + 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.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.0): + 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.0 + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.18.13) + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.21.0) + '@babel/helper-plugin-utils': 7.20.2 + + /@babel/preset-env@7.20.2(@babel/core@7.18.13): + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.18.13 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.18.13) + '@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.18.13) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.18.13) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.18.13) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.18.13) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.18.13) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.13) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.13) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.18.13) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.18.13) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.13) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.13) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.18.13) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.13) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.18.13) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.18.13) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-transform-destructuring': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.18.13) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.18.13) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.18.13) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.18.13) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.18.13) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.18.13) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.18.13) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.18.13) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.18.13) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.18.13) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.18.13) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.18.13) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.18.13) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.18.13) + '@babel/preset-modules': 0.1.5(@babel/core@7.18.13) + '@babel/types': 7.21.2 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.18.13) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.18.13) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.18.13) + core-js-compat: 3.28.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-env@7.20.2(@babel/core@7.21.0): + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) + '@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.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.0) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.0) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-destructuring': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.0) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.0) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.0) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.21.0) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.0) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.21.0) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.0) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.21.0) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.0) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.0) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.0) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.0) + '@babel/preset-modules': 0.1.5(@babel/core@7.21.0) + '@babel/types': 7.21.2 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.0) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.0) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.0) + core-js-compat: 3.28.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + /@babel/preset-flow@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-flow-strip-types': 7.18.9(@babel/core@7.18.13) + dev: true + + /@babel/preset-modules@0.1.5(@babel/core@7.18.13): + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.18.13) + '@babel/types': 7.21.2 + esutils: 2.0.3 + dev: true + + /@babel/preset-modules@0.1.5(@babel/core@7.21.0): + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.0) + '@babel/types': 7.21.2 + esutils: 2.0.3 + + /@babel/preset-react@7.18.6(@babel/core@7.18.13): + resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-react-jsx': 7.18.10(@babel/core@7.18.13) + '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.18.13) + '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.18.13) + dev: true + + /@babel/preset-react@7.18.6(@babel/core@7.21.0): + resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-react-jsx': 7.18.10(@babel/core@7.21.0) + '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.21.0) + + /@babel/preset-typescript@7.21.0(@babel/core@7.21.0): + resolution: {integrity: sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-typescript': 7.21.0(@babel/core@7.21.0) + transitivePeerDependencies: + - supports-color + + /@babel/register@7.18.9(@babel/core@7.21.0): + resolution: {integrity: sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.5 + source-map-support: 0.5.21 + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + /@babel/runtime-corejs3@7.18.9: + resolution: {integrity: sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.28.0 + regenerator-runtime: 0.13.11 + dev: false + + /@babel/runtime-corejs3@7.21.0: + resolution: {integrity: sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.28.0 + regenerator-runtime: 0.13.11 + dev: false + + /@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 + + /@babel/template@7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.20.5 + '@babel/types': 7.20.5 + dev: false + + /@babel/template@7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.21.2 + '@babel/types': 7.21.2 + + /@babel/traverse@7.20.12: + resolution: {integrity: sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.1 + '@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.2 + '@babel/types': 7.21.2 + debug: 4.3.4(supports-color@9.2.2) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/traverse@7.20.5: + resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.1 + '@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.2 + '@babel/types': 7.21.2 + debug: 4.3.4(supports-color@9.2.2) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/traverse@7.21.2: + resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.1 + '@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.2 + '@babel/types': 7.21.2 + debug: 4.3.4(supports-color@9.2.2) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/traverse@7.21.2(supports-color@5.5.0): + resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.1 + '@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.2 + '@babel/types': 7.21.2 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.20.5: + resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} + 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 + + /@babel/types@7.20.7: + resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + 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 + + /@babel/types@7.21.2: + resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} + 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 + + /@balena/dockerignore@1.0.2: + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + dev: false + + /@base2/pretty-print-object@1.0.1: + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + dev: true + + /@bbob/parser@2.8.1: + resolution: {integrity: sha512-iRj7dbSLnuPvV46Lo1KeTFMoo4ux1jYmQ3rHYK7iUe8vUFAQvwEfHs/K9/1cE7ktrBpObIyepZD7PvN0QXw6Gw==} + dependencies: + '@bbob/plugin-helper': 2.8.1 + dev: false + + /@bbob/plugin-helper@2.8.1: + resolution: {integrity: sha512-u7DlTdj1QcbFyKDKlmPXDCvSmDrUM+hBY8NTQ/Y6EhC4y5jvRhau2bsKlMB454uuzkbE44qRsxF6ZpIhpTCLOw==} + dev: false + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@bundle-stats/cli-utils@4.2.3(lodash@4.17.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DZpxEGvQs/K8i9mtXnG/II2rWVpPCK1qQOfRoRfc8pdWSpBDHO0eUjxP5UqtM5qaCbJ9Hz2y4myFaNvvawoyog==} + engines: {node: '>= 14.0'} + dependencies: + '@bundle-stats/html-templates': 4.2.3 + '@bundle-stats/plugin-webpack-filter': 4.2.3(core-js@3.28.0) + '@bundle-stats/plugin-webpack-validate': 4.2.3 + '@bundle-stats/utils': 4.2.3(core-js@3.28.0)(lodash@4.17.21)(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 + find-cache-dir: 3.3.2 + fs-extra: 11.1.0 + transitivePeerDependencies: + - lodash + - react + - react-dom + dev: true + + /@bundle-stats/html-templates@4.2.3: + resolution: {integrity: sha512-ieHpklOMtcc6oR5zfdmvWkXLj1IuQBvfldn93X/S1BBZUq4QH2tIO7CKpcb2tSI9DbgUn6p3bVC/W35wKp5Ktg==} + dev: true + + /@bundle-stats/plugin-webpack-filter@4.2.3(core-js@3.28.0): + resolution: {integrity: sha512-lJvWzyL5YRSiwuQGZSoBAHzJO+OYy9QsLo4OK0LGJPhij4Lt1z5cL/NxBZPoMCqNVcO3dt7A6VNsfWqj+A5l6A==} + engines: {node: '>= 14.0'} + peerDependencies: + core-js: ^3.0.0 + dependencies: + core-js: 3.28.0 + dev: true + + /@bundle-stats/plugin-webpack-validate@4.2.3: + resolution: {integrity: sha512-1xEF3DjgeHW3UEd4Y3Cnyn8UM9SOdVRGcuJFk71MnxOk2ph5TVnX0fpaGKWWR/I0p/Km3chB9TgpphoenW8xUg==} + engines: {node: '>= 14.0'} + dependencies: + lodash: 4.17.21 + superstruct: 1.0.3 + dev: true + + /@bundle-stats/utils@4.2.3(core-js@3.28.0)(lodash@4.17.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-maSiSAYDLhv9ImckaRHeJNvxgJq071w7Oziruj0N3+J9tuB/R9DFX2BVWPXGNnltryo+vm0cVaUn8M4HKIgtVA==} + engines: {node: '>= 14.0'} + peerDependencies: + core-js: ^3.0.0 + lodash: ^4.0.0 + dependencies: + '@bundle-stats/plugin-webpack-filter': 4.2.3(core-js@3.28.0) + '@bundle-stats/plugin-webpack-validate': 4.2.3 + core-js: 3.28.0 + lodash: 4.17.21 + query-string: 7.1.3 + serialize-query-params: 2.0.2 + use-query-params: 2.2.0(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react + - react-dom + dev: true + + /@bytemd/plugin-gfm@1.21.0(bytemd@1.21.0): + resolution: {integrity: sha512-ZlrLa+Nl80gUDeC1hTnyRDfgJU3DGQVjQvX9rIIitUCler+KsAiagEnng6S/W2SZNpv+f8eWpVNL8KA8X3d7Tg==} + peerDependencies: + bytemd: ^1.5.0 + dependencies: + bytemd: 1.21.0 + remark-gfm: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@bytemd/react@1.21.0(react@18.2.0): + resolution: {integrity: sha512-WYb+XlFHWraK9KWuNUlWMZoKlI55wDj4388E40zCsxaN/O6UUnCGdrE+6ZiVGPN3ZiqfQ1iceGIzmJ2PiB2T9w==} + peerDependencies: + react: '*' + dependencies: + bytemd: 1.21.0 + react: 18.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@cnakazawa/watch@1.0.4: + resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} + engines: {node: '>=0.1.95'} + hasBin: true + dependencies: + exec-sh: 0.3.6 + minimist: 1.2.8 + dev: true + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + optional: true + + /@commitlint/cli@17.4.4: + resolution: {integrity: sha512-HwKlD7CPVMVGTAeFZylVNy14Vm5POVY0WxPkZr7EXLC/os0LH/obs6z4HRvJtH/nHCMYBvUBQhGwnufKfTjd5g==} + engines: {node: '>=v14'} + hasBin: true + dependencies: + '@commitlint/format': 17.4.4 + '@commitlint/lint': 17.4.4 + '@commitlint/load': 17.4.4 + '@commitlint/read': 17.4.4 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional@17.4.4: + resolution: {integrity: sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==} + engines: {node: '>=v14'} + dependencies: + conventional-changelog-conventionalcommits: 5.0.0 + dev: true + + /@commitlint/config-validator@17.4.4: + resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure@17.4.4: + resolution: {integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@17.4.0: + resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/format@17.4.4: + resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@17.4.4: + resolution: {integrity: sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + semver: 7.3.8 + dev: true + + /@commitlint/lint@17.4.4: + resolution: {integrity: sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/is-ignored': 17.4.4 + '@commitlint/parse': 17.4.4 + '@commitlint/rules': 17.4.4 + '@commitlint/types': 17.4.4 + dev: true + + /@commitlint/load@17.4.4: + resolution: {integrity: sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.4.4 + '@commitlint/execute-rule': 17.4.0 + '@commitlint/resolve-extends': 17.4.4 + '@commitlint/types': 17.4.4 + '@types/node': 18.11.9 + chalk: 4.1.2 + cosmiconfig: 8.0.0 + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.11.9)(cosmiconfig@8.0.0)(ts-node@10.9.1)(typescript@4.9.4) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: 4.9.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/message@17.4.2: + resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/parse@17.4.4: + resolution: {integrity: sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read@17.4.4: + resolution: {integrity: sha512-B2TvUMJKK+Svzs6eji23WXsRJ8PAD+orI44lVuVNsm5zmI7O8RSGJMvdEZEikiA4Vohfb+HevaPoWZ7PiFZ3zA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/top-level': 17.4.0 + '@commitlint/types': 17.4.4 + fs-extra: 11.1.0 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@17.4.4: + resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.4.4 + '@commitlint/types': 17.4.4 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@17.4.4: + resolution: {integrity: sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/ensure': 17.4.4 + '@commitlint/message': 17.4.2 + '@commitlint/to-lines': 17.4.0 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@17.4.0: + resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/top-level@17.4.0: + resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} + engines: {node: '>=v14'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@17.4.4: + resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + /@ctrl/tinycolor@3.6.0: + resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==} + engines: {node: '>=10'} + dev: false + + /@design-systems/utils@2.12.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Y/d2Zzr+JJfN6u1gbuBUb1ufBuLMJJRZQk+dRmw8GaTpqKx5uf7cGUYGTwN02dIb3I+Tf+cW8jcGBTRiFxdYFg==} + peerDependencies: + '@types/react': 18.0.20 + react: '>= 16.8.6' + react-dom: '>= 16.8.6' + dependencies: + '@babel/runtime': 7.21.0 + '@types/react': 18.0.20 + clsx: 1.2.1 + focus-lock: 0.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-merge-refs: 1.1.0 + dev: true + + /@devtools-ds/object-inspector@1.2.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VztcwqVwScSvYdvJVZBJYsVO/2Pew3JPpFV3T9fuCHQLlHcLYOV3aU/kBS2ScuE2O1JN0ZbobLqFLa3vQF54Fw==} + peerDependencies: + react: '>= 16.8.6' + dependencies: + '@babel/runtime': 7.21.0 + '@devtools-ds/object-parser': 1.2.0 + '@devtools-ds/themes': 1.2.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@devtools-ds/tree': 1.2.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + clsx: 1.1.0 + react: 18.2.0 + transitivePeerDependencies: + - '@types/react' + - react-dom + dev: true + + /@devtools-ds/object-parser@1.2.0: + resolution: {integrity: sha512-SjGGyiFFY8dtUpiWXAvRSzRT+hE11EAAysrq2PsC/GVLf2ZLyT2nHlQO5kDStywyTz+fjw7S7pyDRj1HG9YTTA==} + dependencies: + '@babel/runtime': 7.21.0 + dev: true + + /@devtools-ds/themes@1.2.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-LimEITorE6yWZWWuMc6OiBfLQgPrQqWbyMEmfRUDPa3PHXoAY4SpDxczfg31fgyRDUNWnZhjaJH5bBbu8VEbIw==} + peerDependencies: + react: '>= 16.8.6' + dependencies: + '@babel/runtime': 7.21.0 + '@design-systems/utils': 2.12.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + clsx: 1.1.0 + react: 18.2.0 + transitivePeerDependencies: + - '@types/react' + - react-dom + dev: true + + /@devtools-ds/tree@1.2.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hC4g4ocuo2eg7jsnzKdauxH0sDQiPW3KSM2+uK3kRgcmr9PzpBD5Kob+Y/WFSVKswFleftOGKL4BQLuRv0sPxA==} + peerDependencies: + react: '>= 16.8.6' + dependencies: + '@babel/runtime': 7.21.0 + '@devtools-ds/themes': 1.2.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + clsx: 1.1.0 + react: 18.2.0 + transitivePeerDependencies: + - '@types/react' + - react-dom + dev: true + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + /@docsearch/css@3.3.3: + resolution: {integrity: sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==} + dev: false + + /@docsearch/react@3.3.3(@algolia/client-search@4.14.3)(@types/react@18.0.20)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==} + peerDependencies: + '@types/react': 18.0.20 + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + '@algolia/autocomplete-core': 1.7.4 + '@algolia/autocomplete-preset-algolia': 1.7.4(@algolia/client-search@4.14.3)(algoliasearch@4.14.3) + '@docsearch/css': 3.3.3 + '@types/react': 18.0.20 + algoliasearch: 4.14.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + transitivePeerDependencies: + - '@algolia/client-search' + dev: false + + /@docusaurus/core@2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==} + engines: {node: '>=16.14'} + hasBin: true + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/generator': 7.21.1 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-transform-runtime': 7.21.0(@babel/core@7.21.0) + '@babel/preset-env': 7.20.2(@babel/core@7.21.0) + '@babel/preset-react': 7.18.6(@babel/core@7.21.0) + '@babel/preset-typescript': 7.21.0(@babel/core@7.21.0) + '@babel/runtime': 7.21.0 + '@babel/runtime-corejs3': 7.21.0 + '@babel/traverse': 7.21.2 + '@docusaurus/cssnano-preset': 2.4.0 + '@docusaurus/logger': 2.4.0 + '@docusaurus/mdx-loader': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/react-loadable': 5.5.2(react@17.0.2) + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@docusaurus/utils-common': 2.4.0(@docusaurus/types@2.4.0) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@slorber/static-site-generator-webpack-plugin': 4.0.7 + '@svgr/webpack': 6.5.1 + autoprefixer: 10.4.13(postcss@8.4.21) + babel-loader: 8.3.0(@babel/core@7.21.0)(webpack@5.75.0) + babel-plugin-dynamic-import-node: 2.3.3 + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.5.3 + clean-css: 5.3.2 + cli-table3: 0.6.3 + combine-promises: 1.1.0 + commander: 5.1.0 + copy-webpack-plugin: 11.0.0(webpack@5.75.0) + core-js: 3.28.0 + css-loader: 6.7.3(webpack@5.75.0) + css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(esbuild@0.15.18)(webpack@5.75.0) + cssnano: 5.1.15(postcss@8.4.21) + del: 6.1.1 + detect-port: 1.5.1 + escape-html: 1.0.3 + eta: 2.0.0 + file-loader: 6.2.0(webpack@5.75.0) + fs-extra: 10.1.0 + html-minifier-terser: 6.1.0 + html-tags: 3.2.0 + html-webpack-plugin: 5.5.0(webpack@5.75.0) + import-fresh: 3.3.0 + leven: 3.1.0 + lodash: 4.17.21 + mini-css-extract-plugin: 2.7.2(webpack@5.75.0) + postcss: 8.4.21 + postcss-loader: 7.0.2(postcss@8.4.21)(webpack@5.75.0) + prompts: 2.4.2 + react: 17.0.2 + react-dev-utils: 12.0.1(eslint@8.34.0)(typescript@4.9.4)(webpack@5.75.0) + react-dom: 17.0.2(react@17.0.2) + react-helmet-async: 1.3.0(react-dom@17.0.2)(react@17.0.2) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@17.0.2) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.75.0) + react-router: 5.3.4(react@17.0.2) + react-router-config: 5.1.1(react-router@5.3.4)(react@17.0.2) + react-router-dom: 5.3.4(react@17.0.2) + rtl-detect: 1.0.4 + semver: 7.5.4 + serve-handler: 6.1.5 + shelljs: 0.8.5 + terser-webpack-plugin: 5.3.6(esbuild@0.15.18)(webpack@5.75.0) + tslib: 2.5.0 + update-notifier: 5.1.0 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.75.0) + wait-on: 6.0.1 + webpack: 5.75.0(esbuild@0.15.18) + webpack-bundle-analyzer: 4.8.0 + webpack-dev-server: 4.11.1(webpack@5.75.0) + webpack-merge: 5.8.0 + webpackbar: 5.0.2(webpack@5.75.0) + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/cssnano-preset@2.4.0: + resolution: {integrity: sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==} + engines: {node: '>=16.14'} + dependencies: + cssnano-preset-advanced: 5.3.10(postcss@8.4.27) + postcss: 8.4.27 + postcss-sort-media-queries: 4.3.0(postcss@8.4.27) + tslib: 2.5.0 + dev: false + + /@docusaurus/logger@2.4.0: + resolution: {integrity: sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==} + engines: {node: '>=16.14'} + dependencies: + chalk: 4.1.2 + tslib: 2.5.0 + dev: false + + /@docusaurus/mdx-loader@2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@babel/parser': 7.21.2 + '@babel/traverse': 7.21.2 + '@docusaurus/logger': 2.4.0 + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@mdx-js/mdx': 1.6.22 + escape-html: 1.0.3 + file-loader: 6.2.0(webpack@5.75.0) + fs-extra: 10.1.0 + image-size: 1.0.2 + mdast-util-to-string: 2.0.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + remark-emoji: 2.2.0 + stringify-object: 3.3.0 + tslib: 2.5.0 + unified: 9.2.2 + unist-util-visit: 2.0.3 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.75.0) + webpack: 5.75.0(esbuild@0.15.18) + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/module-type-aliases@2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@docusaurus/react-loadable': 5.5.2(react@17.0.2) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@types/history': 4.7.11 + '@types/react': 18.0.20 + '@types/react-router-config': 5.0.6 + '@types/react-router-dom': 5.3.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-helmet-async: 1.3.0(react-dom@17.0.2)(react@17.0.2) + react-loadable: /@docusaurus/react-loadable@5.5.2(react@17.0.2) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/plugin-content-blog@2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/logger': 2.4.0 + '@docusaurus/mdx-loader': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@docusaurus/utils-common': 2.4.0(@docusaurus/types@2.4.0) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + cheerio: 1.0.0-rc.12 + feed: 4.2.2 + fs-extra: 10.1.0 + lodash: 4.17.21 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + reading-time: 1.5.0 + tslib: 2.5.0 + unist-util-visit: 2.0.3 + utility-types: 3.10.0 + webpack: 5.75.0(esbuild@0.15.18) + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-content-docs@2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/logger': 2.4.0 + '@docusaurus/mdx-loader': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/module-type-aliases': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@types/react-router-config': 5.0.6 + combine-promises: 1.1.0 + fs-extra: 10.1.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + tslib: 2.5.0 + utility-types: 3.10.0 + webpack: 5.75.0(esbuild@0.15.18) + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-content-pages@2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/mdx-loader': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + fs-extra: 10.1.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + tslib: 2.5.0 + webpack: 5.75.0(esbuild@0.15.18) + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-debug@2.4.0(@types/react@18.0.20)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + fs-extra: 10.1.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-json-view: 1.21.3(@types/react@18.0.20)(react-dom@17.0.2)(react@17.0.2) + tslib: 2.5.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - encoding + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-analytics@2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + tslib: 2.5.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-gtag@2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + tslib: 2.5.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-google-tag-manager@2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + tslib: 2.5.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/plugin-sitemap@2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/logger': 2.4.0 + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@docusaurus/utils-common': 2.4.0(@docusaurus/types@2.4.0) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + fs-extra: 10.1.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + sitemap: 7.1.1 + tslib: 2.5.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/preset-classic@2.4.0(@algolia/client-search@4.14.3)(@types/react@18.0.20)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-content-blog': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-content-docs': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-content-pages': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-debug': 2.4.0(@types/react@18.0.20)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-google-analytics': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-google-gtag': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-google-tag-manager': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-sitemap': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/theme-classic': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/theme-common': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/theme-search-algolia': 2.4.0(@algolia/client-search@4.14.3)(@docusaurus/types@2.4.0)(@types/react@18.0.20)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + transitivePeerDependencies: + - '@algolia/client-search' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - encoding + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/react-loadable@5.5.2(react@17.0.2): + resolution: {integrity: sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==} + peerDependencies: + react: '*' + dependencies: + '@types/react': 18.0.20 + prop-types: 15.8.1 + react: 17.0.2 + + /@docusaurus/theme-classic@2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/mdx-loader': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/module-type-aliases': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/plugin-content-blog': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-content-docs': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-content-pages': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/theme-common': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/theme-translations': 2.4.0 + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@docusaurus/utils-common': 2.4.0(@docusaurus/types@2.4.0) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@mdx-js/react': 1.6.22(react@17.0.2) + clsx: 1.2.1 + copy-text-to-clipboard: 3.0.1 + infima: 0.2.0-alpha.43 + lodash: 4.17.21 + nprogress: 0.2.0 + postcss: 8.4.27 + prism-react-renderer: 1.3.5(react@17.0.2) + prismjs: 1.29.0 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-router-dom: 5.3.4(react@17.0.2) + rtlcss: 3.5.0 + tslib: 2.5.0 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-common@2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/mdx-loader': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/module-type-aliases': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/plugin-content-blog': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-content-docs': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/plugin-content-pages': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@docusaurus/utils-common': 2.4.0(@docusaurus/types@2.4.0) + '@types/history': 4.7.11 + '@types/react': 18.0.20 + '@types/react-router-config': 5.0.6 + clsx: 1.2.1 + parse-numeric-range: 1.3.0 + prism-react-renderer: 1.3.5(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + tslib: 2.5.0 + use-sync-external-store: 1.2.0(react@17.0.2) + utility-types: 3.10.0 + transitivePeerDependencies: + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-search-algolia@2.4.0(@algolia/client-search@4.14.3)(@docusaurus/types@2.4.0)(@types/react@18.0.20)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docsearch/react': 3.3.3(@algolia/client-search@4.14.3)(@types/react@18.0.20)(react-dom@17.0.2)(react@17.0.2) + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/logger': 2.4.0 + '@docusaurus/plugin-content-docs': 2.4.0(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/theme-common': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + '@docusaurus/theme-translations': 2.4.0 + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + '@docusaurus/utils-validation': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + algoliasearch: 4.14.3 + algoliasearch-helper: 3.11.3(algoliasearch@4.14.3) + clsx: 1.2.1 + eta: 2.0.0 + fs-extra: 10.1.0 + lodash: 4.17.21 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + tslib: 2.5.0 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/types' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: false + + /@docusaurus/theme-translations@2.4.0: + resolution: {integrity: sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==} + engines: {node: '>=16.14'} + dependencies: + fs-extra: 10.1.0 + tslib: 2.5.0 + dev: false + + /@docusaurus/types@2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.0.20 + commander: 5.1.0 + joi: 17.8.3 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-helmet-async: 1.3.0(react-dom@17.0.2)(react@17.0.2) + utility-types: 3.10.0 + webpack: 5.75.0(esbuild@0.15.18) + webpack-merge: 5.8.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + + /@docusaurus/utils-common@2.4.0(@docusaurus/types@2.4.0): + resolution: {integrity: sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==} + engines: {node: '>=16.14'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + dependencies: + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + tslib: 2.5.0 + dev: false + + /@docusaurus/utils-validation@2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18): + resolution: {integrity: sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==} + engines: {node: '>=16.14'} + dependencies: + '@docusaurus/logger': 2.4.0 + '@docusaurus/utils': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18) + joi: 17.8.3 + js-yaml: 4.1.0 + tslib: 2.5.0 + transitivePeerDependencies: + - '@docusaurus/types' + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@docusaurus/utils@2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18): + resolution: {integrity: sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==} + engines: {node: '>=16.14'} + peerDependencies: + '@docusaurus/types': '*' + peerDependenciesMeta: + '@docusaurus/types': + optional: true + dependencies: + '@docusaurus/logger': 2.4.0 + '@docusaurus/types': 2.4.0(esbuild@0.15.18)(react-dom@17.0.2)(react@17.0.2) + '@svgr/webpack': 6.5.1 + escape-string-regexp: 4.0.0 + file-loader: 6.2.0(webpack@5.75.0) + fs-extra: 10.1.0 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + js-yaml: 4.1.0 + lodash: 4.17.21 + micromatch: 4.0.5 + resolve-pathname: 3.0.0 + shelljs: 0.8.5 + tslib: 2.5.0 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.75.0) + webpack: 5.75.0(esbuild@0.15.18) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: false + + /@emoji-mart/data@1.1.2: + resolution: {integrity: sha512-1HP8BxD2azjqWJvxIaWAMyTySeZY0Osr83ukYjltPVkNXeJvTz7yDrPLBtnrD5uqJ3tg4CcLuuBW09wahqL/fg==} + dev: false + + /@emoji-mart/react@1.1.1(emoji-mart@5.5.2)(react@18.2.0): + resolution: {integrity: sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==} + peerDependencies: + emoji-mart: ^5.2 + react: ^16.8 || ^17 || ^18 + dependencies: + emoji-mart: 5.5.2 + react: 18.2.0 + dev: false + + /@emotion/babel-plugin@11.10.2(@babel/core@7.18.13): + resolution: {integrity: sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.13 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.18.13) + '@babel/runtime': 7.21.0 + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/serialize': 1.1.0 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.0.13 + dev: false + + /@emotion/cache@11.10.5: + resolution: {integrity: sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==} + dependencies: + '@emotion/memoize': 0.8.0 + '@emotion/sheet': 1.2.1 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + stylis: 4.1.3 + dev: false + + /@emotion/css@11.10.0(@babel/core@7.18.13): + resolution: {integrity: sha512-dH9f+kSCucc8ilMg0MUA1AemabcyzYpe5EKX24F528PJjD7HyIY/VBNJHxfUdc8l400h2ncAjR6yEDu+DBj2cg==} + peerDependencies: + '@babel/core': ^7.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/core': 7.18.13 + '@emotion/babel-plugin': 11.10.2(@babel/core@7.18.13) + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.0 + '@emotion/sheet': 1.2.1 + '@emotion/utils': 1.2.0 + dev: false + + /@emotion/hash@0.9.0: + resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} + dev: false + + /@emotion/is-prop-valid@1.2.0: + resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==} + dependencies: + '@emotion/memoize': 0.8.0 + + /@emotion/memoize@0.8.0: + resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} + + /@emotion/react@11.10.4(@babel/core@7.18.13)(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA==} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/core': 7.18.13 + '@babel/runtime': 7.21.0 + '@emotion/babel-plugin': 11.10.2(@babel/core@7.18.13) + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + '@types/react': 18.0.20 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize@1.1.0: + resolution: {integrity: sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==} + dependencies: + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/unitless': 0.8.0 + '@emotion/utils': 1.2.0 + csstype: 3.1.1 + dev: false + + /@emotion/sheet@1.2.1: + resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} + dev: false + + /@emotion/styled@11.10.4(@babel/core@7.18.13)(@emotion/react@11.10.4)(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-pRl4R8Ez3UXvOPfc2bzIoV8u9P97UedgHS4FPX594ntwEuAMA114wlaHvOK24HB48uqfXiGlYIZYCxVJ1R1ttQ==} + peerDependencies: + '@babel/core': ^7.0.0 + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/core': 7.18.13 + '@babel/runtime': 7.21.0 + '@emotion/babel-plugin': 11.10.2(@babel/core@7.18.13) + '@emotion/is-prop-valid': 1.2.0 + '@emotion/react': 11.10.4(@babel/core@7.18.13)(@types/react@18.0.20)(react@18.2.0) + '@emotion/serialize': 1.1.0 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) + '@emotion/utils': 1.2.0 + '@types/react': 18.0.20 + react: 18.2.0 + dev: false + + /@emotion/stylis@0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + /@emotion/unitless@0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.0(react@18.2.0): + resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils@1.2.0: + resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==} + dev: false + + /@emotion/weak-memoize@0.3.0: + resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} + dev: false + + /@esbuild/android-arm64@0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.15.18: + resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.16.17: + resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.16.17: + resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.16.17: + resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.16.17: + resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.16.17: + resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.16.17: + resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.15.18: + resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.16.17: + resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.16.17: + resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.16.17: + resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.16.17: + resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.16.17: + resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.16.17: + resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.17.10: - resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/traverse': 7.17.10 - debug: 4.3.3 - lodash.debounce: 4.0.8 - resolve: 1.22.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true + /@esbuild/linux-x64@0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true - /@babel/helper-define-polyfill-provider/0.3.1_@babel+core@7.17.10: - resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/traverse': 7.17.10 - debug: 4.3.3 - lodash.debounce: 4.0.8 - resolve: 1.22.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color + /@esbuild/netbsd-x64@0.16.17: + resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true dev: true + optional: true - /@babel/helper-environment-visitor/7.16.7: - resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.10 + /@esbuild/netbsd-x64@0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true - /@babel/helper-explode-assignable-expression/7.16.7: - resolution: {integrity: sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.10 + /@esbuild/openbsd-x64@0.16.17: + resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true dev: true + optional: true - /@babel/helper-function-name/7.17.9: - resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.16.7 - '@babel/types': 7.17.10 - - /@babel/helper-hoist-variables/7.16.7: - resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.10 + /@esbuild/openbsd-x64@0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true - /@babel/helper-member-expression-to-functions/7.17.7: - resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.10 + /@esbuild/sunos-x64@0.16.17: + resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true dev: true + optional: true - /@babel/helper-module-imports/7.16.7: - resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.10 - dev: true + /@esbuild/sunos-x64@0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true - /@babel/helper-module-transforms/7.17.7: - resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-simple-access': 7.17.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 - transitivePeerDependencies: - - supports-color + /@esbuild/win32-arm64@0.16.17: + resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@babel/helper-optimise-call-expression/7.16.7: - resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.10 - dev: true + /@esbuild/win32-arm64@0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true - /@babel/helper-plugin-utils/7.10.4: - resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} + /@esbuild/win32-ia32@0.16.17: + resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true dev: true + optional: true - /@babel/helper-plugin-utils/7.16.7: - resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} - engines: {node: '>=6.9.0'} - dev: true + /@esbuild/win32-ia32@0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true - /@babel/helper-remap-async-to-generator/7.16.8: - resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-wrap-function': 7.16.8 - '@babel/types': 7.17.10 - transitivePeerDependencies: - - supports-color + /@esbuild/win32-x64@0.16.17: + resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@babel/helper-replace-supers/7.16.7: - resolution: {integrity: sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==} - engines: {node: '>=6.9.0'} + /@esbuild/win32-x64@0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@eslint/eslintrc@1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-member-expression-to-functions': 7.17.7 - '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 + ajv: 6.12.6 + debug: 4.3.4(supports-color@9.2.2) + espree: 9.4.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@babel/helper-simple-access/7.17.7: - resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} - engines: {node: '>=6.9.0'} + /@fastify/busboy@1.1.0: + resolution: {integrity: sha512-Fv854f94v0CzIDllbY3i/0NJPNBRNLDawf3BTYVGCe9VrIIs3Wi7AFx24F9NzCxdf0wyx/x0Q9kEVnvDOPnlxA==} + engines: {node: '>=10.17.0'} dependencies: - '@babel/types': 7.17.10 - dev: true + text-decoding: 1.0.0 + dev: false - /@babel/helper-skip-transparent-expression-wrappers/7.16.0: - resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.10 - dev: true + /@floating-ui/core@1.3.1: + resolution: {integrity: sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==} + dev: false - /@babel/helper-split-export-declaration/7.16.7: - resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} - engines: {node: '>=6.9.0'} + /@floating-ui/dom@1.4.5: + resolution: {integrity: sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==} dependencies: - '@babel/types': 7.17.10 - - /@babel/helper-validator-identifier/7.16.7: - resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} - engines: {node: '>=6.9.0'} + '@floating-ui/core': 1.3.1 + dev: false - /@babel/helper-validator-option/7.16.7: - resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} - engines: {node: '>=6.9.0'} + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true - /@babel/helper-wrap-function/7.16.8: - resolution: {integrity: sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==} - engines: {node: '>=6.9.0'} + /@hapi/bourne@2.1.0: + resolution: {integrity: sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==} + dev: false + + /@hapi/hoek@9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + /@hapi/topo@5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} dependencies: - '@babel/helper-function-name': 7.17.9 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 - transitivePeerDependencies: - - supports-color - dev: true + '@hapi/hoek': 9.3.0 - /@babel/helpers/7.17.9: - resolution: {integrity: sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==} - engines: {node: '>=6.9.0'} + /@humanwhocodes/config-array@0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} dependencies: - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@9.2.2) + minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@babel/highlight/7.17.9: - resolution: {integrity: sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - chalk: 2.4.2 - js-tokens: 4.0.0 + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - /@babel/parser/7.17.10: - resolution: {integrity: sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.17.10 + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.10 + /@iarna/toml@2.2.5: + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} dev: true - /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.10: - resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} - engines: {node: '>=6.9.0'} + /@iconify/react@3.2.2(react@18.2.0): + resolution: {integrity: sha512-z3+Jno3VcJzgNHsN5mEvYMsgCkOZkydqdIwOxjXh45+i2Vs9RGH68Y52vt39izwFSfuYUXhaW+1u7m7+IhCn/g==} peerDependencies: - '@babel/core': ^7.0.0-0 + react: '>=16' dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-remap-async-to-generator': 7.16.8 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.10 - transitivePeerDependencies: - - supports-color - dev: true + react: 18.2.0 + dev: false - /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} - engines: {node: '>=6.9.0'} + /@icons/material@0.2.4(react@18.2.0): + resolution: {integrity: sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==} peerDependencies: - '@babel/core': ^7.0.0-0 + react: '*' dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - transitivePeerDependencies: - - supports-color - dev: true + react: 18.2.0 + dev: false - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.10: - resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.10 - transitivePeerDependencies: - - supports-color - dev: true + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.0.1 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false - /@babel/plugin-proposal-decorators/7.17.9_@babel+core@7.17.10: - resolution: {integrity: sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-replace-supers': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/plugin-syntax-decorators': 7.17.0_@babel+core@7.17.10 - charcodes: 0.2.0 - transitivePeerDependencies: - - supports-color + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 dev: true - /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.10 + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} dev: true - /@babel/plugin-proposal-export-default-from/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/console@27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-export-default-from': 7.16.7_@babel+core@7.17.10 + '@jest/types': 27.5.1 + '@types/node': 18.11.9 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 dev: true - /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} - engines: {node: '>=6.9.0'} + /@jest/core@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: - '@babel/core': ^7.0.0-0 + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.10 + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.11.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(ts-node@10.9.1) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate dev: true - /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/environment@27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.10 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.11.9 + jest-mock: 27.5.1 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/expect-utils@29.4.3: + resolution: {integrity: sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.10 + jest-get-type: 29.4.3 dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/fake-timers@27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.10 + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 18.11.9 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 dev: true - /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/globals@27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.10 + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 dev: true - /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: - resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} + /@jest/reporters@27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: - '@babel/core': ^7.0.0-0 + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.11.9 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.10: - resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/schemas@29.4.3: + resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/compat-data': 7.17.10 - '@babel/core': 7.17.10 - '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.10 - dev: true + '@sinclair/typebox': 0.25.24 - /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/source-map@27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.10 + callsites: 3.1.0 + graceful-fs: 4.2.10 + source-map: 0.6.1 dev: true - /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/test-result@27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.10 + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 dev: true - /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.10: - resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/test-sequencer@27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/transform@26.6.2: + resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} + engines: {node: '>= 10.14.2'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.17.10 + '@babel/core': 7.21.0 + '@jest/types': 26.6.2 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 26.6.2 + jest-regex-util: 26.0.0 + jest-util: 26.6.2 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/transform@27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + '@babel/core': 7.21.0 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.10: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/types@26.6.2: + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.9 + '@types/yargs': 15.0.14 + chalk: 4.1.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.9 + '@types/yargs': 16.0.5 + chalk: 4.1.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.10: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jest/types@29.5.0: + resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@jest/schemas': 29.4.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.9 + '@types/yargs': 17.0.22 + chalk: 4.1.2 - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.17.10: - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jridgewell/gen-mapping@0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 - /@babel/plugin-syntax-decorators/7.17.0_@babel+core@7.17.10: - resolution: {integrity: sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} - /@babel/plugin-syntax-export-default-from/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jridgewell/source-map@0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 - /@babel/plugin-syntax-flow/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + /@jridgewell/trace-mapping@0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.17.10: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: false + + /@koa/cors@3.4.1: + resolution: {integrity: sha512-/sG9NlpGZ/aBpnRamIlGs+wX+C/IJ5DodNK7iPQIVCG4eUQdGeshGhWQ6JCi7tpnD9sCtFXcS04iTimuaJfh4Q==} + engines: {node: '>= 8.0.0'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + vary: 1.1.2 + dev: false - /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: - resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@kwsites/file-exists@1.1.1: + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.16.7 + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + /@kwsites/promise-deferred@1.1.1: + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.10: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + + /@linaria/core@3.0.0-beta.13: + resolution: {integrity: sha512-3zEi5plBCOsEzUneRVuQb+2SAx3qaC1dj0FfFAI6zIJQoDWu0dlSwKijMRack7oO9tUWrchfj3OkKQAd1LBdVg==} + dev: false + + /@lingui/core@3.14.0: + resolution: {integrity: sha512-ertREq9oi9B/umxpd/pInm9uFO8FLK2/0FXfDmMqvH5ydswWn/c9nY5YO4W1h4/8LWO45mewypOIyjoue4De1w==} + engines: {node: '>=10.0.0'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@babel/runtime': 7.21.0 + make-plural: 6.2.2 + messageformat-parser: 4.1.3 + dev: false - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + /@lingui/detect-locale@3.14.0: + resolution: {integrity: sha512-IELWULt9I+iyVlxGES21cXoOwTcPSIisElAmr3/KJlqvJ9zXT3s4w4Jxw9j5oHJjdxBDRkifwpnVmGd57wrmzg==} + engines: {node: '>=10.0.0'} + dev: false + + /@livekit/components-core@0.6.11(livekit-client@1.12.1): + resolution: {integrity: sha512-FufCqJ/G0rznKR4hCY1EM+9GtwGK+easNgOPw4WPvhFEOO4L00KuEYWpzbWBzVFBHYqBuypkZS4enOsSHwPAJQ==} + engines: {node: '>=14'} peerDependencies: - '@babel/core': ^7.0.0-0 + livekit-client: ^1.12.0 dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@floating-ui/dom': 1.4.5 + email-regex: 5.0.0 + global-tld-list: 0.0.1139 + livekit-client: 1.12.1 + loglevel: 1.8.1 + rxjs: 7.8.0 + dev: false - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.10: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + /@livekit/components-react@1.0.8(livekit-client@1.12.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JOGcoLwOXI2vQW0U7Zwh+DXIoC/Nm9/yOg7U6tAv6+Sps/BlAjyY09XVnI6GBLeJpiaqzlY2ualmfMKiWDgDhw==} + engines: {node: '>=14'} peerDependencies: - '@babel/core': ^7.0.0-0 + livekit-client: ^1.12.0 + react: '>=18' + react-dom: '>=18' dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@livekit/components-core': 0.6.11(livekit-client@1.12.1) + '@react-hook/latest': 1.0.3(react@18.2.0) + clsx: 1.2.1 + livekit-client: 1.12.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + /@livekit/components-styles@1.0.4: + resolution: {integrity: sha512-bLCj+asyZLKtviKK+wU2WJ/pe0K/QSkzolXAOKkVedojs2Yc4e6i1tjOr0rTRSJxl4opYrZK9Ye89HLq6J04fA==} + engines: {node: '>=14'} + dev: false + + /@loadable/component@5.15.3(react@18.2.0): + resolution: {integrity: sha512-VOgYgCABn6+/7aGIpg7m0Ruj34tGetaJzt4bQ345FwEovDQZ+dua+NWLmuJKv8rWZyxOUSfoJkmGnzyDXH2BAQ==} + engines: {node: '>=8'} peerDependencies: - '@babel/core': ^7.0.0-0 + react: ^16.3.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@babel/runtime': 7.21.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-is: 16.13.1 + dev: false - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@mdx-js/mdx@1.6.22: + resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@babel/core': 7.12.9 + '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) + '@mdx-js/util': 1.6.22 + babel-plugin-apply-mdx-type-prop: 1.6.22(@babel/core@7.12.9) + babel-plugin-extract-import-names: 1.6.22 + camelcase-css: 2.0.1 + detab: 2.0.4 + hast-util-raw: 6.0.1 + lodash.uniq: 4.5.0 + mdast-util-to-hast: 10.0.1 + remark-footnotes: 2.0.0 + remark-mdx: 1.6.22 + remark-parse: 8.0.3 + remark-squeeze-paragraphs: 4.0.0 + style-to-object: 0.3.0 + unified: 9.2.0 + unist-builder: 2.0.3 + unist-util-visit: 2.0.3 + transitivePeerDependencies: + - supports-color - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + /@mdx-js/react@1.6.22(react@17.0.2): + resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} peerDependencies: - '@babel/core': ^7.0.0-0 + react: ^16.13.1 || ^17.0.0 dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + react: 17.0.2 + dev: false - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + /@mdx-js/react@1.6.22(react@18.2.0): + resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} peerDependencies: - '@babel/core': ^7.0.0-0 + react: ^16.13.1 || ^17.0.0 dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + react: 18.2.0 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.17.10: - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + /@mdx-js/util@1.6.22: + resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.10: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@moleculer/vorpal@1.11.5: + resolution: {integrity: sha512-E1lm/o7Wi5WgbXU3YwRv175fXgvExB1ZzIRAGemV8NH2j7D1hAaYUREfhdA7ut3sMe3VBqfTMNaOKoBO44BxFA==} + engines: {node: '>= 8.0.0'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + babel-polyfill: 6.26.0 + chalk: 2.4.2 + in-publish: 2.0.1 + inquirer: 7.0.0 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + log-update: 3.4.0 + minimist: 1.2.8 + node-localstorage: 1.3.1 + strip-ansi: 5.2.0 + wrap-ansi: 6.2.0 - /@babel/plugin-syntax-typescript/7.17.10_@babel+core@7.17.10: - resolution: {integrity: sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@mrmlnc/readdir-enhanced@2.2.1: + resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} + engines: {node: '>=4'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + call-me-maybe: 1.0.1 + glob-to-regexp: 0.3.0 dev: true - /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + /@msgpack/msgpack@2.8.0: + resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} + engines: {node: '>= 10'} dev: true - /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.10: - resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} - engines: {node: '>=6.9.0'} + /@mui/base@5.0.0-alpha.112(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-KPwb1iYPXsV/P8uu0SNQrj7v7YU6wdN4Eccc2lZQyRDW+f6PJYjHBuFUTYKc408B98Jvs1XbC/z5MN45a2DWrQ==} + engines: {node: '>=12.0.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@types/react': 18.0.20 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-remap-async-to-generator': 7.16.8 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/runtime': 7.21.0 + '@emotion/is-prop-valid': 1.2.0 + '@mui/types': 7.2.3(@types/react@18.0.20) + '@mui/utils': 5.11.12(react@18.2.0) + '@popperjs/core': 2.11.7 + '@types/react': 18.0.20 + clsx: 1.2.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + dev: false - /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + /@mui/core-downloads-tracker@5.11.3: + resolution: {integrity: sha512-Bgb6//KtxY7IC7M5Pa5RKFX1wttc213mqpKqydnz3wn4BGDXfA5c0vf5nTu5zqsJeB4T3ysAJTRJhQ/E1GsZDQ==} + dev: false - /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} - engines: {node: '>=6.9.0'} + /@mui/material@5.11.3(@emotion/react@11.10.4)(@emotion/styled@11.10.4)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Oz+rMFiMtxzzDLUxKyyj4mSxF9ShmsBoJ9qvglXCYqklgSrEl1R/Z4hfPZ+2pWd5CriO8U/0CFHr4DksrlTiCw==} + engines: {node: '>=12.0.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': 18.0.20 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@babel/runtime': 7.21.0 + '@emotion/react': 11.10.4(@babel/core@7.18.13)(@types/react@18.0.20)(react@18.2.0) + '@emotion/styled': 11.10.4(@babel/core@7.18.13)(@emotion/react@11.10.4)(@types/react@18.0.20)(react@18.2.0) + '@mui/base': 5.0.0-alpha.112(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.11.3 + '@mui/system': 5.11.12(@emotion/react@11.10.4)(@emotion/styled@11.10.4)(@types/react@18.0.20)(react@18.2.0) + '@mui/types': 7.2.3(@types/react@18.0.20) + '@mui/utils': 5.11.12(react@18.2.0) + '@types/react': 18.0.20 + '@types/react-transition-group': 4.4.5 + clsx: 1.2.1 + csstype: 3.1.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + dev: false - /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} - engines: {node: '>=6.9.0'} + /@mui/private-theming@5.11.12(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-hnJ0svNI1TPeWZ18E6DvES8PB4NyMLwal6EyXf69rTrYqT6wZPLjB+HiCYfSOCqU/fwArhupSqIIkQpDs8CkAw==} + engines: {node: '>=12.0.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@types/react': 18.0.20 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.17.9 - '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-replace-supers': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/runtime': 7.21.0 + '@mui/utils': 5.11.12(react@18.2.0) + '@types/react': 18.0.20 + prop-types: 15.8.1 + react: 18.2.0 + dev: false - /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} - engines: {node: '>=6.9.0'} + /@mui/styled-engine@5.11.11(@emotion/react@11.10.4)(@emotion/styled@11.10.4)(react@18.2.0): + resolution: {integrity: sha512-wV0UgW4lN5FkDBXefN8eTYeuE9sjyQdg5h94vtwZCUamGQEzmCOtir4AakgmbWMy0x8OLjdEUESn9wnf5J9MOg==} + engines: {node: '>=12.0.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@babel/runtime': 7.21.0 + '@emotion/cache': 11.10.5 + '@emotion/react': 11.10.4(@babel/core@7.18.13)(@types/react@18.0.20)(react@18.2.0) + '@emotion/styled': 11.10.4(@babel/core@7.18.13)(@emotion/react@11.10.4)(@types/react@18.0.20)(react@18.2.0) + csstype: 3.1.1 + prop-types: 15.8.1 + react: 18.2.0 + dev: false - /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.10: - resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} - engines: {node: '>=6.9.0'} + /@mui/system@5.11.12(@emotion/react@11.10.4)(@emotion/styled@11.10.4)(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-sYjsXkiwKpZDC3aS6O/6KTjji0jGINLQcrD5EJ5NTkIDiLf19I4HJhnufgKqlTWNfoDBlRohuTf3TzfM06c4ug==} + engines: {node: '>=12.0.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': 18.0.20 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@babel/runtime': 7.21.0 + '@emotion/react': 11.10.4(@babel/core@7.18.13)(@types/react@18.0.20)(react@18.2.0) + '@emotion/styled': 11.10.4(@babel/core@7.18.13)(@emotion/react@11.10.4)(@types/react@18.0.20)(react@18.2.0) + '@mui/private-theming': 5.11.12(@types/react@18.0.20)(react@18.2.0) + '@mui/styled-engine': 5.11.11(@emotion/react@11.10.4)(@emotion/styled@11.10.4)(react@18.2.0) + '@mui/types': 7.2.3(@types/react@18.0.20) + '@mui/utils': 5.11.12(react@18.2.0) + '@types/react': 18.0.20 + clsx: 1.2.1 + csstype: 3.1.1 + prop-types: 15.8.1 + react: 18.2.0 + dev: false - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} - engines: {node: '>=6.9.0'} + /@mui/types@7.2.3(@types/react@18.0.20): + resolution: {integrity: sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@types/react': 18.0.20 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@types/react': 18.0.20 + dev: false - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} - engines: {node: '>=6.9.0'} + /@mui/utils@5.11.12(react@18.2.0): + resolution: {integrity: sha512-5vH9B/v8pzkpEPO2HvGM54ToXV6cFdAn8UrvdN8TMEEwpn/ycW0jLiyBcgUlPsQ+xha7hqXCPQYHaYFDIcwaiw==} + engines: {node: '>=12.0.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + react: ^17.0.0 || ^18.0.0 dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@babel/runtime': 7.21.0 + '@types/prop-types': 15.7.5 + '@types/react-is': 17.0.3 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + dev: false - /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - /@babel/plugin-transform-flow-strip-types/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.17.10 + /@nodelib/fs.stat@1.1.3: + resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} + engines: {node: '>= 6'} dev: true - /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 - /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@npmcli/fs@1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 - '@babel/helper-function-name': 7.17.9 - '@babel/helper-plugin-utils': 7.16.7 + '@gar/promisify': 1.1.3 + semver: 7.5.4 dev: true - /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@npmcli/move-file@1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + mkdirp: 1.0.4 + rimraf: 3.0.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@ocavue/svgmoji-cjs@0.1.1: + resolution: {integrity: sha512-tCP6ggbtgIL4hPM5goVFSjL51jH/BLl/yBLy98wAV9a2L/Sn9iS3abfprPeQw6/nan5lLaz4Vz8ZP37LKh+xfQ==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + svgmoji: 3.2.0 + dev: false - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/auth-app@4.0.6: + resolution: {integrity: sha512-zFWDWZ2b1YH9EohhJFswSGzhXdO6al+DPt99ipYUwC81CsFP3wsC4g4WNxpLj8+CIQrGURa8sIcedq2QALNRAw==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helper-plugin-utils': 7.16.7 - babel-plugin-dynamic-import-node: 2.3.3 + '@octokit/auth-oauth-app': 5.0.3 + '@octokit/auth-oauth-user': 2.0.3 + '@octokit/request': 6.2.1 + '@octokit/request-error': 3.0.1 + '@octokit/types': 7.5.1 + '@types/lru-cache': 5.1.1 + deprecation: 2.3.1 + lru-cache: 6.0.0 + universal-github-app-jwt: 1.1.0 + universal-user-agent: 6.0.0 transitivePeerDependencies: - - supports-color - dev: true + - encoding + dev: false - /@babel/plugin-transform-modules-commonjs/7.17.9_@babel+core@7.17.10: - resolution: {integrity: sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/auth-oauth-app@5.0.3: + resolution: {integrity: sha512-qnETfWn58nNQG8An8PbYDaGfNfPfLSSwjfRk5lCBuB2r/Lt+uLYhf6vyIL/NMRxCykDQBguGJISSXT6UpfV3cA==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-simple-access': 7.17.7 - babel-plugin-dynamic-import-node: 2.3.3 + '@octokit/auth-oauth-device': 4.0.2 + '@octokit/auth-oauth-user': 2.0.3 + '@octokit/request': 6.2.1 + '@octokit/types': 7.5.1 + '@types/btoa-lite': 1.0.0 + btoa-lite: 1.0.0 + universal-user-agent: 6.0.0 transitivePeerDependencies: - - supports-color - dev: true + - encoding + dev: false - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.10: - resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/auth-oauth-device@4.0.2: + resolution: {integrity: sha512-h5Ir0q5c6dHZwWMrSWMvgu3JyuH7qCPJ0kB9jNYDugsAob69N65ebA3E5FWPUN6hGJguZpy3CRmqejTx7aSobQ==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-hoist-variables': 7.16.7 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - babel-plugin-dynamic-import-node: 2.3.3 + '@octokit/oauth-methods': 2.0.3 + '@octokit/request': 6.2.1 + '@octokit/types': 7.5.1 + universal-user-agent: 6.0.0 transitivePeerDependencies: - - supports-color - dev: true + - encoding + dev: false - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/auth-oauth-user@2.0.3: + resolution: {integrity: sha512-NMGTTGa1j6JVtlpZUOrhi1RxBjHaogS0p59qV8HtFOx3Rgq503xfjjA8npyVbRuAf30iW/K5YueZKivMkhBITA==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helper-plugin-utils': 7.16.7 + '@octokit/auth-oauth-device': 4.0.2 + '@octokit/oauth-methods': 2.0.3 + '@octokit/request': 6.2.1 + '@octokit/types': 7.5.1 + btoa-lite: 1.0.0 + universal-user-agent: 6.0.0 transitivePeerDependencies: - - supports-color - dev: true + - encoding + dev: false - /@babel/plugin-transform-named-capturing-groups-regex/7.17.10_@babel+core@7.17.10: - resolution: {integrity: sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + /@octokit/auth-token@2.5.0: + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.10 - dev: true + '@octokit/types': 6.41.0 + dev: false - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/auth-token@3.0.1: + resolution: {integrity: sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/types': 7.5.1 + dev: false - /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/auth-token@3.0.3: + resolution: {integrity: sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-replace-supers': 7.16.7 - transitivePeerDependencies: - - supports-color + '@octokit/types': 9.0.0 dev: true - /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/auth-unauthenticated@3.0.2: + resolution: {integrity: sha512-wCGPQaXynH2wtqABsHukY06VPw4zHXtfbE/maEngj2k9h9o2hfzC6WAzzjExyISgRnDc9ae/HXzKakUWvWSb2Q==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/request-error': 3.0.1 + '@octokit/types': 7.5.1 + dev: false - /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/core@3.6.0: + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.3 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false - /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/core@4.2.0: + resolution: {integrity: sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + '@octokit/auth-token': 3.0.3 + '@octokit/graphql': 5.0.5 + '@octokit/request': 6.2.3 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.0.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding dev: true - /@babel/plugin-transform-react-display-name/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/endpoint@6.0.12: + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: false - /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/endpoint@7.0.2: + resolution: {integrity: sha512-8/AUACfE9vpRpehE6ZLfEtzkibe5nfsSwFZVMsG8qabqRt1M81qZYUFRZa1B8w8lP6cdfDJfRq9HWS+MbmR7tw==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.10 - dev: true + '@octokit/types': 7.5.1 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: false - /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.17.10: - resolution: {integrity: sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/endpoint@7.0.5: + resolution: {integrity: sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.17.10 - '@babel/types': 7.17.10 + '@octokit/types': 9.0.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 dev: true - /@babel/plugin-transform-react-pure-annotations/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/graphql@4.8.0: + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + dependencies: + '@octokit/request': 5.6.3 + '@octokit/types': 6.41.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/graphql@5.0.5: + resolution: {integrity: sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 + '@octokit/request': 6.2.3 + '@octokit/types': 9.0.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding dev: true - /@babel/plugin-transform-regenerator/7.17.9_@babel+core@7.17.10: - resolution: {integrity: sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/oauth-authorization-url@5.0.0: + resolution: {integrity: sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==} + engines: {node: '>= 14'} + dev: false + + /@octokit/oauth-methods@2.0.3: + resolution: {integrity: sha512-XM+pPsj6TB9zXHfGszZmIp2zRShjQuwGLEKbkOQ7mZBHBPpx0TRzSYwUbwiAJsWefkPUXgr7i0qFsxLr/Uciyg==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - regenerator-transform: 0.15.0 + '@octokit/oauth-authorization-url': 5.0.0 + '@octokit/request': 6.2.1 + '@octokit/request-error': 3.0.1 + '@octokit/types': 7.5.1 + btoa-lite: 1.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/openapi-types@12.11.0: + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} + dev: false + + /@octokit/openapi-types@13.13.1: + resolution: {integrity: sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==} + dev: false + + /@octokit/openapi-types@14.0.0: + resolution: {integrity: sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==} + + /@octokit/openapi-types@16.0.0: + resolution: {integrity: sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==} dev: true - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/plugin-enterprise-compatibility@1.3.0: + resolution: {integrity: sha512-h34sMGdEOER/OKrZJ55v26ntdHb9OPfR1fwOx6Q4qYyyhWA104o11h9tFxnS/l41gED6WEI41Vu2G2zHDVC5lQ==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + dev: false - /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} - engines: {node: '>=6.9.0'} + /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): + resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@octokit/core': '>=2' dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + dev: false - /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} - engines: {node: '>=6.9.0'} + /@octokit/plugin-paginate-rest@5.0.1(@octokit/core@4.2.0): + resolution: {integrity: sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==} + engines: {node: '>= 14'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@octokit/core': '>=4' dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@octokit/core': 4.2.0 + '@octokit/types': 8.2.1 dev: true - /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} - engines: {node: '>=6.9.0'} + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.0): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@octokit/core': '>=3' dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + '@octokit/core': 4.2.0 dev: true - /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} - engines: {node: '>=6.9.0'} + /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@octokit/core': '>=3' dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + dev: false - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} - engines: {node: '>=6.9.0'} + /@octokit/plugin-rest-endpoint-methods@6.8.1(@octokit/core@4.2.0): + resolution: {integrity: sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg==} + engines: {node: '>= 14'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@octokit/core': '>=3' dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 + '@octokit/core': 4.2.0 + '@octokit/types': 8.2.1 + deprecation: 2.3.1 dev: true - /@babel/plugin-transform-typescript/7.16.8_@babel+core@7.17.10: - resolution: {integrity: sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/plugin-retry@3.0.9: + resolution: {integrity: sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-typescript': 7.17.10_@babel+core@7.17.10 - transitivePeerDependencies: - - supports-color - dev: true + '@octokit/types': 6.41.0 + bottleneck: 2.19.5 + dev: false - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} - engines: {node: '>=6.9.0'} + /@octokit/plugin-throttling@3.7.0(@octokit/core@3.6.0): + resolution: {integrity: sha512-qrKT1Yl/KuwGSC6/oHpLBot3ooC9rq0/ryDYBCpkRtoj+R8T47xTMDT6Tk2CxWopFota/8Pi/2SqArqwC0JPow==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@octokit/core': ^3.5.0 dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + bottleneck: 2.19.5 + dev: false - /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/request-error@2.1.0: + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: false - /@babel/preset-env/7.17.10_@babel+core@7.17.10: - resolution: {integrity: sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/request-error@3.0.1: + resolution: {integrity: sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==} + engines: {node: '>= 14'} dependencies: - '@babel/compat-data': 7.17.10 - '@babel/core': 7.17.10 - '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.17.10 - '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.17.10 - '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.10 - '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.10 - '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.10 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.10 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.10 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.10 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.10 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.17.10 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.10 - '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.17.10 - '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.10 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-modules-commonjs': 7.17.9_@babel+core@7.17.10 - '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.17.10 - '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-named-capturing-groups-regex': 7.17.10_@babel+core@7.17.10 - '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-regenerator': 7.17.9_@babel+core@7.17.10 - '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.17.10 - '@babel/preset-modules': 0.1.5_@babel+core@7.17.10 - '@babel/types': 7.17.10 - babel-plugin-polyfill-corejs2: 0.3.1_@babel+core@7.17.10 - babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.17.10 - babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.17.10 - core-js-compat: 3.22.5 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true + '@octokit/types': 7.5.1 + deprecation: 2.3.1 + once: 1.4.0 + dev: false - /@babel/preset-flow/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-transform-flow-strip-types': 7.16.7_@babel+core@7.17.10 + '@octokit/types': 9.0.0 + deprecation: 2.3.1 + once: 1.4.0 dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.17.10: - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/request@5.6.3: + resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.17.10 - '@babel/types': 7.17.10 - esutils: 2.0.3 - dev: true + '@octokit/endpoint': 6.0.12 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.9 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false - /@babel/preset-react/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/request@6.2.1: + resolution: {integrity: sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.10 - '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.17.10 - dev: true + '@octokit/endpoint': 7.0.2 + '@octokit/request-error': 3.0.1 + '@octokit/types': 7.5.1 + is-plain-object: 5.0.0 + node-fetch: 2.6.9 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false - /@babel/preset-typescript/7.16.7_@babel+core@7.17.10: - resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/request@6.2.3: + resolution: {integrity: sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.17.10 + '@octokit/endpoint': 7.0.5 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.0.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.9 + universal-user-agent: 6.0.0 transitivePeerDependencies: - - supports-color + - encoding dev: true - /@babel/register/7.17.7_@babel+core@7.17.10: - resolution: {integrity: sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@octokit/rest@19.0.5: + resolution: {integrity: sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==} + engines: {node: '>= 14'} dependencies: - '@babel/core': 7.17.10 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.5 - source-map-support: 0.5.21 + '@octokit/core': 4.2.0 + '@octokit/plugin-paginate-rest': 5.0.1(@octokit/core@4.2.0) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.0) + '@octokit/plugin-rest-endpoint-methods': 6.8.1(@octokit/core@4.2.0) + transitivePeerDependencies: + - encoding dev: true - /@babel/runtime/7.17.9: - resolution: {integrity: sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==} - engines: {node: '>=6.9.0'} + /@octokit/types@6.41.0: + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} dependencies: - regenerator-runtime: 0.13.9 + '@octokit/openapi-types': 12.11.0 + dev: false - /@babel/runtime/7.4.5: - resolution: {integrity: sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==} + /@octokit/types@7.5.1: + resolution: {integrity: sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==} dependencies: - regenerator-runtime: 0.13.9 + '@octokit/openapi-types': 13.13.1 dev: false - /@babel/template/7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} - engines: {node: '>=6.9.0'} + /@octokit/types@8.0.0: + resolution: {integrity: sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.10 - '@babel/types': 7.17.10 + '@octokit/openapi-types': 14.0.0 + dev: false - /@babel/traverse/7.17.10: - resolution: {integrity: sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==} - engines: {node: '>=6.9.0'} + /@octokit/types@8.2.1: + resolution: {integrity: sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw==} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.10 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.17.9 - '@babel/helper-hoist-variables': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.17.10 - '@babel/types': 7.17.10 - debug: 4.3.3 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types': 14.0.0 + dev: true - /@babel/types/7.17.10: - resolution: {integrity: sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==} - engines: {node: '>=6.9.0'} + /@octokit/types@9.0.0: + resolution: {integrity: sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==} dependencies: - '@babel/helper-validator-identifier': 7.16.7 - to-fast-properties: 2.0.0 - - /@base2/pretty-print-object/1.0.1: - resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + '@octokit/openapi-types': 16.0.0 dev: true - /@bbob/parser/2.8.0: - resolution: {integrity: sha512-S6mB7WmfQMcllginLf2KIen12Aswd93hJkxRr2FllDjT+5FGs0cCpDXPm9jVGOJl3TWlZOnj9Vnpvfj0ZejhXQ==} - dependencies: - '@bbob/plugin-helper': 2.8.0 + /@octokit/webhooks-methods@2.0.0: + resolution: {integrity: sha512-35cfQ4YWlnZnmZKmIxlGPUPLtbkF8lr/A/1Sk1eC0ddLMwQN06dOuLc+dI3YLQS+T+MoNt3DIQ0NynwgKPilig==} dev: false - /@bbob/plugin-helper/2.8.0: - resolution: {integrity: sha512-uwl7KbHZ3J+APPUAAEHHS6AoyU6iB4wgZo6U+M+99NSykt/TE8APfU1cMs1EzGsOGkPci8In8VwwZZgnXg3qeg==} + /@octokit/webhooks-types@5.8.0: + resolution: {integrity: sha512-8adktjIb76A7viIdayQSFuBEwOzwhDC+9yxZpKNHjfzrlostHCw0/N7JWpWMObfElwvJMk2fY2l1noENCk9wmw==} dev: false - /@bcoe/v8-coverage/0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true + /@octokit/webhooks@9.26.0: + resolution: {integrity: sha512-foZlsgrTDwAmD5j2Czn6ji10lbWjGDVsUxTIydjG9KTkAWKJrFapXJgO5SbGxRwfPd3OJdhK3nA2YPqVhxLXqA==} + dependencies: + '@octokit/request-error': 2.1.0 + '@octokit/webhooks-methods': 2.0.0 + '@octokit/webhooks-types': 5.8.0 + aggregate-error: 3.1.0 + dev: false - /@bundle-stats/cli-utils/3.3.8: - resolution: {integrity: sha512-Jbuq1v5bJTPDlYtbIWHhenOR8GnpX3HJ18eOgfIAAHDTwOuKiHydi/GCfV+IeAK1Ptaczt7Bo7ILHp8TB/Nx0Q==} - engines: {node: '>= 12.0'} + /@perfsee/bundle-analyzer@1.0.0-alpha.4: + resolution: {integrity: sha512-nqU0xLlrme8SwkXohUlUcVSpkJZo9WEjr+Ub/VNeJUsdwFdFuvMCNPHIEBlyiBBJwxdTpzJMoB+W0hinjEvWdg==} dependencies: - '@bundle-stats/html-templates': 3.3.8 - '@bundle-stats/utils': 3.3.8_xqc3ywgrobkwiqao2oqbih6pzm - core-js: 3.22.5 - find-cache-dir: 3.3.2 - fs-extra: 10.1.0 + '@msgpack/msgpack': 2.8.0 + '@perfsee/utils': 1.0.0-alpha.3 + acorn: 8.8.2 + acorn-walk: 8.2.0 + htmlparser2: 8.0.1 lodash: 4.17.21 + query-string: 7.1.3 + tar: 6.1.13 + tslib: 2.5.0 dev: true - /@bundle-stats/html-templates/3.3.8: - resolution: {integrity: sha512-2eC+x/XxyWvPnh8e6sd7BtdYa25XChLvXKsjGEdqI+AP5gIysPNYTIfM4UybCTVwUGXhnadfIWQMvQ1iKGcgiw==} - dev: true - - /@bundle-stats/plugin-webpack-filter/3.3.8_xqc3ywgrobkwiqao2oqbih6pzm: - resolution: {integrity: sha512-jQ4VwuxliJ2by6ELb30iu5qmJA+2HNG6IKhGxY7feYVkhd1IYgemcfh9GvRDFb9VDR10GF4FWSfVz/sRWOtCYQ==} - engines: {node: '>= 12.0'} - peerDependencies: - core-js: ^3.0.0 - lodash: ^4.0.0 + /@perfsee/plugin-utils@1.0.0-alpha.4: + resolution: {integrity: sha512-8602Vt1b8IAZmBk8kHNp7Ej7hPgQUUeWCDPwv+CRx4Pr9PiA27Z+8+FTrKCyWaKtShKSO7hs0d1vmq+wrYZKtA==} dependencies: - core-js: 3.22.5 + '@msgpack/msgpack': 2.8.0 + '@perfsee/bundle-analyzer': 1.0.0-alpha.4 + '@perfsee/utils': 1.0.0-alpha.3 + chalk: 4.1.2 + debug: 4.3.4(supports-color@9.2.2) + env-ci: 7.3.0 + file-type: 16.5.4 lodash: 4.17.21 + node-fetch: 2.6.9 + query-string: 7.1.3 + simple-git: 3.16.1 + table: 6.8.1 + tar: 6.1.13 + tslib: 2.5.0 + uuid: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@bundle-stats/plugin-webpack-validate/3.3.8: - resolution: {integrity: sha512-G3uy9NYpQ0JJ9if1sGI2h09XRPY+Br2XtsaPlSM9bCAnfhqaeWYcTi9mRlh8qeXVTYhJug5T24aBMHgx3YWEpw==} - engines: {node: '>= 12.0'} + /@perfsee/utils@1.0.0-alpha.3: + resolution: {integrity: sha512-Uku7cs/9uORukZrfr3J9tDXMOOB0nxTykQH0wL8ZfbFbunsZEE9nsszhS4rLPR7e7Qbu+oXLh69cioCl8Lc2wg==} dependencies: - superstruct: 0.8.3 + tslib: 2.5.0 dev: true - /@bundle-stats/utils/3.3.8_xqc3ywgrobkwiqao2oqbih6pzm: - resolution: {integrity: sha512-WF29+HUDXS3eJWP4EkbcA9XJmX8jDLfaaxzGjIlle7QafL4f+fdN+TpXYFetYwfGMGKVX4DVJaHtvaqQwkq4Vg==} - engines: {node: '>= 12.0'} + /@perfsee/webpack@1.0.0-alpha.4(webpack@5.75.0): + resolution: {integrity: sha512-3+c/X3PPGzpICNF3NkmNCBhubcd99tPtAXODyWNQAlz3ncesAmx1yLgaPKbN5lMT0A+1vBOTWDJZGKAt5/dYfA==} peerDependencies: - core-js: ^3.0.0 - lodash: ^4.0.0 + webpack: 5.75.0 dependencies: - '@bundle-stats/plugin-webpack-filter': 3.3.8_xqc3ywgrobkwiqao2oqbih6pzm - '@bundle-stats/plugin-webpack-validate': 3.3.8 - convert-units: 3.0.0-beta.4 - core-js: 3.22.5 - lodash: 4.17.21 - query-string: 7.1.1 - serialize-query-params: 1.3.6_query-string@7.1.1 - dev: true - - /@cnakazawa/watch/1.0.4: - resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} - engines: {node: '>=0.1.95'} - hasBin: true - dependencies: - exec-sh: 0.3.6 - minimist: 1.2.6 + '@perfsee/bundle-analyzer': 1.0.0-alpha.4 + '@perfsee/plugin-utils': 1.0.0-alpha.4 + chalk: 4.1.2 + tslib: 2.5.0 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@colors/colors/1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} requiresBuild: true - dev: true + dev: false optional: true - /@commitlint/cli/12.1.4: - resolution: {integrity: sha512-ZR1WjXLvqEffYyBPT0XdnSxtt3Ty1TMoujEtseW5o3vPnkA1UNashAMjQVg/oELqfaiAMnDw8SERPMN0e/0kLg==} - engines: {node: '>=v10'} - hasBin: true + /@pmmmwh/react-refresh-webpack-plugin@0.5.7(react-refresh@0.11.0)(webpack@5.75.0): + resolution: {integrity: sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <3.0.0' + webpack: 5.75.0 + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true dependencies: - '@commitlint/format': 12.1.4 - '@commitlint/lint': 12.1.4 - '@commitlint/load': 12.1.4 - '@commitlint/read': 12.1.4 - '@commitlint/types': 12.1.4 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 16.2.0 + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.28.0 + error-stack-parser: 2.1.4 + find-up: 5.0.0 + html-entities: 2.3.3 + loader-utils: 2.0.4 + react-refresh: 0.11.0 + schema-utils: 3.1.1 + source-map: 0.7.4 + webpack: 5.75.0(esbuild@0.15.18) dev: true - /@commitlint/config-conventional/12.1.4: - resolution: {integrity: sha512-ZIdzmdy4o4WyqywMEpprRCrehjCSQrHkaRTVZV411GyLigFQHlEBSJITAihLAWe88Qy/8SyoIe5uKvAsV5vRqQ==} - engines: {node: '>=v10'} + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} dependencies: - conventional-changelog-conventionalcommits: 4.6.3 + graceful-fs: 4.2.10 dev: true - /@commitlint/ensure/12.1.4: - resolution: {integrity: sha512-MxHIBuAG9M4xl33qUfIeMSasbv3ktK0W+iygldBxZOL4QSYC2Gn66pZAQMnV9o3V+sVFHoAK2XUKqBAYrgbEqw==} - engines: {node: '>=v10'} + /@pnpm/npm-conf@1.0.5: + resolution: {integrity: sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==} + engines: {node: '>=12'} dependencies: - '@commitlint/types': 12.1.4 - lodash: 4.17.21 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 dev: true - /@commitlint/execute-rule/12.1.4: - resolution: {integrity: sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg==} - engines: {node: '>=v10'} - dev: true + /@polka/url@1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} - /@commitlint/format/12.1.4: - resolution: {integrity: sha512-h28ucMaoRjVvvgS6Bdf85fa/+ZZ/iu1aeWGCpURnQV7/rrVjkhNSjZwGlCOUd5kDV1EnZ5XdI7L18SUpRjs26g==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - chalk: 4.1.2 - dev: true + /@popperjs/core@2.11.7: + resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==} + dev: false - /@commitlint/is-ignored/12.1.4: - resolution: {integrity: sha512-uTu2jQU2SKvtIRVLOzMQo3KxDtO+iJ1p0olmncwrqy4AfPLgwoyCP2CiULq5M7xpR3+dE3hBlZXbZTQbD7ycIw==} - engines: {node: '>=v10'} + /@probot/get-private-key@1.1.1: + resolution: {integrity: sha512-hOmBNSAhSZc6PaNkTvj6CO9R5J67ODJ+w5XQlDW9w/6mtcpHWK4L+PZcW0YwVM7PpetLZjN6rsKQIR9yqIaWlA==} dependencies: - '@commitlint/types': 12.1.4 - semver: 7.3.5 - dev: true + '@types/is-base64': 1.1.1 + is-base64: 1.1.0 + dev: false - /@commitlint/lint/12.1.4: - resolution: {integrity: sha512-1kZ8YDp4to47oIPFELUFGLiLumtPNKJigPFDuHt2+f3Q3IKdQ0uk53n3CPl4uoyso/Og/EZvb1mXjFR/Yce4cA==} - engines: {node: '>=v10'} + /@probot/octokit-plugin-config@1.1.6(@octokit/core@3.6.0): + resolution: {integrity: sha512-L29wmnFvilzSfWn9tUgItxdLv0LJh2ICjma3FmLr80Spu3wZ9nHyRrKMo9R5/K2m7VuWmgoKnkgRt2zPzAQBEQ==} + peerDependencies: + '@octokit/core': '>=3' dependencies: - '@commitlint/is-ignored': 12.1.4 - '@commitlint/parse': 12.1.4 - '@commitlint/rules': 12.1.4 - '@commitlint/types': 12.1.4 - dev: true + '@octokit/core': 3.6.0 + '@types/js-yaml': 4.0.5 + js-yaml: 4.1.0 + dev: false - /@commitlint/load/12.1.4: - resolution: {integrity: sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA==} - engines: {node: '>=v10'} + /@probot/pino@2.3.5: + resolution: {integrity: sha512-IiyiNZonMw1dHC4EAdD55y5owV733d9Gll/IKsrLikB7EJ54+eMCOtL/qo+OmgWN9XV3NTDfziEQF2og/OBKog==} + hasBin: true dependencies: - '@commitlint/execute-rule': 12.1.4 - '@commitlint/resolve-extends': 12.1.4 - '@commitlint/types': 12.1.4 - chalk: 4.1.2 - cosmiconfig: 7.0.1 - lodash: 4.17.21 - resolve-from: 5.0.0 - dev: true + '@sentry/node': 6.19.7 + pino-pretty: 6.0.0 + pump: 3.0.0 + readable-stream: 3.6.1 + split2: 4.1.0 + transitivePeerDependencies: + - supports-color + dev: false - /@commitlint/message/12.1.4: - resolution: {integrity: sha512-6QhalEKsKQ/Y16/cTk5NH4iByz26fqws2ub+AinHPtM7Io0jy4e3rym9iE+TkEqiqWZlUigZnTwbPvRJeSUBaA==} - engines: {node: '>=v10'} - dev: true + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false - /@commitlint/parse/12.1.4: - resolution: {integrity: sha512-yqKSAsK2V4X/HaLb/yYdrzs6oD/G48Ilt0EJ2Mp6RJeWYxG14w/Out6JrneWnr/cpzemyN5hExOg6+TB19H/Lw==} - engines: {node: '>=v10'} + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: - '@commitlint/types': 12.1.4 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false - /@commitlint/read/12.1.4: - resolution: {integrity: sha512-TnPQSJgD8Aod5Xeo9W4SaYKRZmIahukjcCWJ2s5zb3ZYSmj6C85YD9cR5vlRyrZjj78ItLUV/X4FMWWVIS38Jg==} - engines: {node: '>=v10'} + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@rc-component/portal@1.1.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' dependencies: - '@commitlint/top-level': 12.1.4 - '@commitlint/types': 12.1.4 - fs-extra: 9.1.0 - git-raw-commits: 2.0.11 - dev: true + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false - /@commitlint/resolve-extends/12.1.4: - resolution: {integrity: sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg==} - engines: {node: '>=v10'} + /@reach/auto-id@0.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5ssbeP5bCkM39uVsfQCwBBL+KT8YColdnMN5/Eto6Rj7929ql95R3HZUOkKIvj7mgPtEb60BLQxd1P3o6cjbmg==} + peerDependencies: + react: ^16.8.0 || 17.x + react-dom: ^16.8.0 || 17.x dependencies: - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true + '@reach/utils': 0.16.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.5.0 + dev: false - /@commitlint/rules/12.1.4: - resolution: {integrity: sha512-W8m6ZSjg7RuIsIfzQiFHa48X5mcPXeKT9yjBxVmjHvYfS2FDBf1VxCQ7vO0JTVIdV4ohjZ0eKg/wxxUuZHJAZg==} - engines: {node: '>=v10'} + /@reach/utils@0.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PCggBet3qaQmwFNcmQ/GqHSefadAFyNCUekq9RrWoaU9hh/S4iaFgf2MBMdM47eQj5i/Bk0Mm07cP/XPFlkN+Q==} + peerDependencies: + react: ^16.8.0 || 17.x + react-dom: ^16.8.0 || 17.x dependencies: - '@commitlint/ensure': 12.1.4 - '@commitlint/message': 12.1.4 - '@commitlint/to-lines': 12.1.4 - '@commitlint/types': 12.1.4 - dev: true + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tiny-warning: 1.0.3 + tslib: 2.5.0 + dev: false - /@commitlint/to-lines/12.1.4: - resolution: {integrity: sha512-TParumvbi8bdx3EdLXz2MaX+e15ZgoCqNUgqHsRLwyqLUTRbqCVkzrfadG1UcMQk8/d5aMbb327ZKG3Q4BRorw==} - engines: {node: '>=v10'} - dev: true + /@react-dnd/asap@5.0.2: + resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} + dev: false + + /@react-dnd/invariant@4.0.2: + resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} + dev: false + + /@react-dnd/shallowequal@4.0.2: + resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} + dev: false - /@commitlint/top-level/12.1.4: - resolution: {integrity: sha512-d4lTJrOT/dXlpY+NIt4CUl77ciEzYeNVc0VFgUQ6VA+b1rqYD2/VWFjBlWVOrklxtSDeKyuEhs36RGrppEFAvg==} - engines: {node: '>=v10'} + /@react-hook/latest@1.0.3(react@18.2.0): + resolution: {integrity: sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==} + peerDependencies: + react: '>=16.8' dependencies: - find-up: 5.0.0 - dev: true + react: 18.2.0 + dev: false + + /@reduxjs/toolkit@1.8.5(react-redux@8.0.2)(react@18.2.0): + resolution: {integrity: sha512-f4D5EXO7A7Xq35T0zRbWq5kJQyXzzscnHKmjnu2+37B3rwHU6mX9PYlbfXdnxcY6P/7zfmjhgan0Z+yuOfeBmA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + immer: 9.0.21 + react: 18.2.0 + react-redux: 8.0.2(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + redux: 4.2.1 + redux-thunk: 2.4.1(redux@4.2.1) + reselect: 4.1.6 + dev: false - /@commitlint/types/12.1.4: - resolution: {integrity: sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw==} - engines: {node: '>=v10'} + /@release-it/conventional-changelog@5.1.1(release-it@15.6.0): + resolution: {integrity: sha512-QtbDBe36dQfzexAfDYrbLPvd5Cb5bMWmLcjcGhCOWBss7fe1/gCjoxDULVz+7N7G5Nu2UMeBwHcUp/w8RDh5VQ==} + engines: {node: '>=14'} + peerDependencies: + release-it: ^15.4.1 dependencies: - chalk: 4.1.2 + concat-stream: 2.0.0 + conventional-changelog: 3.1.25 + conventional-recommended-bump: 6.1.0 + release-it: 15.6.0 + semver: 7.3.8 dev: true - /@cspotcode/source-map-consumer/0.8.0: - resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} - engines: {node: '>= 12'} - - /@cspotcode/source-map-support/0.7.0: - resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} - engines: {node: '>=12'} + /@remirror/core-constants@2.0.0: + resolution: {integrity: sha512-vpePPMecHJllBqCWXl6+FIcZqS+tRUM2kSCCKFeEo1H3XUEv3ocijBIPhnlSAa7g6maX+12ATTgxrOsLpWVr2g==} dependencies: - '@cspotcode/source-map-consumer': 0.8.0 + '@babel/runtime': 7.21.0 + dev: false - /@ctrl/tinycolor/3.4.1: - resolution: {integrity: sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==} - engines: {node: '>=10'} + /@remirror/core-helpers@2.0.0: + resolution: {integrity: sha512-p41PQeqDGetYyCzQ4CZDA0Y0ix61YTbeejHhxQ5pU20UYIEVOXA4X1H8Ovi5dd8udvSjNri7B/WkO0RX3TeMGw==} + dependencies: + '@babel/runtime': 7.21.0 + '@linaria/core': 3.0.0-beta.13 + '@remirror/core-constants': 2.0.0 + '@remirror/types': 1.0.0 + '@types/object.omit': 3.0.0 + '@types/object.pick': 1.3.2 + '@types/throttle-debounce': 2.1.0 + case-anything: 2.1.10 + dash-get: 1.0.2 + deepmerge: 4.3.1 + fast-deep-equal: 3.1.3 + make-error: 1.3.6 + object.omit: 3.0.0 + object.pick: 1.3.0 + throttle-debounce: 3.0.1 dev: false - /@discoveryjs/json-ext/0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - dev: true + /@remirror/core-types@2.0.0(@remirror/pm@2.0.0): + resolution: {integrity: sha512-XnH52AxjSYXv5nEF6jrE5G7MGbp45F2bmBNvJu/DlKVKZQBt+qScnZBZ2oLyqvUElPYKB/3rIQRDaic8kHki5A==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@remirror/core-constants': 2.0.0 + '@remirror/pm': 2.0.0 + '@remirror/types': 1.0.0 + dev: false - /@emotion/cache/10.0.29: - resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} + /@remirror/core-utils@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-jtve7xCgoRh9/ytvYPlf78cxzSXsQzauIxnuxioZq0+Rr9rOFShlaL/4u8r50b1QrFjIFq2yajcj2ug0auMStg==} + peerDependencies: + '@remirror/pm': ^2.0.0 + '@types/node': 18.11.9 + peerDependenciesMeta: + '@types/node': + optional: true dependencies: - '@emotion/sheet': 0.9.4 - '@emotion/stylis': 0.8.5 - '@emotion/utils': 0.11.3 - '@emotion/weak-memoize': 0.2.5 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core-constants': 2.0.0 + '@remirror/core-helpers': 2.0.0 + '@remirror/core-types': 2.0.0(@remirror/pm@2.0.0) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@types/min-document': 2.19.0 + '@types/node': 18.11.9 + css-in-js-utils: 3.1.0 + get-dom-document: 0.1.1 + min-document: 2.19.0 + parenthesis: 3.1.8 + transitivePeerDependencies: + - jsdom + dev: false - /@emotion/core/10.3.1_react@17.0.2: - resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} + /@remirror/core@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-FRGNGP73DIirOozSTgzY75d6QkjyabjjgoIZTDzWDW+e5w2bbFRig2WNJAyCDplcz9PKFGKtuer3XduKTVWYtQ==} peerDependencies: - react: '>=16.3.0' + '@remirror/pm': ^2.0.0 dependencies: - '@babel/runtime': 7.17.9 - '@emotion/cache': 10.0.29 - '@emotion/css': 10.0.27 - '@emotion/serialize': 0.11.16 - '@emotion/sheet': 0.9.4 - '@emotion/utils': 0.11.3 - react: 17.0.2 - dev: true + '@babel/runtime': 7.21.0 + '@linaria/core': 3.0.0-beta.13 + '@remirror/core-constants': 2.0.0 + '@remirror/core-helpers': 2.0.0 + '@remirror/core-types': 2.0.0(@remirror/pm@2.0.0) + '@remirror/core-utils': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/i18n': 2.0.1 + '@remirror/icons': 2.0.0 + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + nanoevents: 5.1.13 + tiny-warning: 1.0.3 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/css/10.0.27: - resolution: {integrity: sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==} + /@remirror/dom@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-8q3tHIPJ+KYMUtgkZWJAfkGKisEdN7MKi9neQH6fUMsM/ukGuYoHsrWcU1aT5vbTrkMw7by0PNVYvWFqoZHe1w==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@emotion/serialize': 0.11.16 - '@emotion/utils': 0.11.3 - babel-plugin-emotion: 10.2.2 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/pm': 2.0.0 + '@remirror/preset-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/hash/0.8.0: - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - dev: true + /@remirror/extension-annotation@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-/1lsrmdC4e9/mYIXMh1oWA5JVeL2iwgbl1H9E5C5NcfNvAT0NxikpkGlP5kIxz/iUIz+6mf4rGJTZ0WhnYPnKw==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/is-prop-valid/0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + /@remirror/extension-bidi@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-LA3hwfhhiM9EkoN1VHJYAe5Ot6tpJVKD6+A4KFDuZMnO4c5/QRo/FSFwZYjPBDICtE4HijiA1ajNMo7ywvu1qA==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@emotion/memoize': 0.7.4 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@types/direction': 1.0.0 + direction: 1.0.4 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/memoize/0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - dev: true + /@remirror/extension-blockquote@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-MdK3N8Bp+3Hm+f3o9yDX725AhYchrOnvlHx3qruu5eC4nLfyiODVly/1nL8b4kjIlkdQ/7KpPmyxFpCjSSv30g==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/serialize/0.11.16: - resolution: {integrity: sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==} + /@remirror/extension-bold@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-iFvgAaOkYjyHrrRYKXYQqfyg3+by/M8LIu3PRAk4/Kh/q7u4cN6SpLyfVx41rgKcvB4HlL9jI7Bxlv7CTMZacw==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@emotion/hash': 0.8.0 - '@emotion/memoize': 0.7.4 - '@emotion/unitless': 0.7.5 - '@emotion/utils': 0.11.3 - csstype: 2.6.20 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/sheet/0.9.4: - resolution: {integrity: sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==} - dev: true + /@remirror/extension-callout@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-G9//3cuMT1gCwalTai0x4OIjNobL/8+hR/6cEaqcQXwWxOR/lY23xf9Gqmurw2IdozDehKmJeyaaz9qiCU7gIw==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/styled-base/10.3.0_gfrer23gq2rp2t523t6qbxrx6m: - resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} + /@remirror/extension-code-block@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(prettier@2.8.4): + resolution: {integrity: sha512-GgxY+3A4LcumQsKG9T2xbllOodtngyuwcNaYaBb0RCzDrp6drFPhr7IAjesYMUH1y/pndbraZhl6NKfO8nlPIA==} peerDependencies: - '@emotion/core': ^10.0.28 - react: '>=16.3.0' + '@remirror/pm': ^2.0.0 + '@types/prettier': ^2 + prettier: ^2 + peerDependenciesMeta: + '@types/prettier': + optional: true + prettier: + optional: true dependencies: - '@babel/runtime': 7.17.9 - '@emotion/core': 10.3.1_react@17.0.2 - '@emotion/is-prop-valid': 0.8.8 - '@emotion/serialize': 0.11.16 - '@emotion/utils': 0.11.3 - react: 17.0.2 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + '@types/refractor': 3.0.2 + prettier: 2.8.4 + refractor: 3.6.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/styled/10.3.0_gfrer23gq2rp2t523t6qbxrx6m: - resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} + /@remirror/extension-code@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-FzUv0jREH9qczawAseLYzk4gzwe7oqCND/ba/w+FvDTFG9gewIixHJKkbLsSgrtjgYdLLnDyey/fGUCH46PYjg==} peerDependencies: - '@emotion/core': ^10.0.27 - react: '>=16.3.0' + '@remirror/pm': ^2.0.0 dependencies: - '@emotion/core': 10.3.1_react@17.0.2 - '@emotion/styled-base': 10.3.0_gfrer23gq2rp2t523t6qbxrx6m - babel-plugin-emotion: 10.2.2 - react: 17.0.2 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/stylis/0.8.5: - resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - dev: true + /@remirror/extension-codemirror5@2.0.5(@remirror/pm@2.0.0)(@types/codemirror@5.60.5)(@types/node@18.11.9)(codemirror@5.65.9): + resolution: {integrity: sha512-kWPXcTIn3jX9u9sMEqThMPPyd9n0Gy6gEfr30jv0ibB8fl310hi22eZQsxHVOEgf8P2Emc7xz6T+M6fK1/Vx3g==} + peerDependencies: + '@remirror/pm': ^2.0.0 + '@types/codemirror': '*' + codemirror: ^5 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@types/codemirror': 5.60.5 + codemirror: 5.65.9 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/unitless/0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: true + /@remirror/extension-collaboration@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-6CavCYMJOPgMB8YFWzYv0yRCvYCXrQmARyyMQwrm/nM0pDMK0eaMAqhQ9cu5QIOumNs2rFax2UGoRvA3RrZYEQ==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/utils/0.11.3: - resolution: {integrity: sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==} - dev: true + /@remirror/extension-columns@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-1OKS2E2BJlwENIq8mkH6Krwza2nQv4lMPjPAcl82XCoLqDZUGAHBmoIkoRz6BXl9DMP4NNLZ5cIxh8pBgS/clA==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@emotion/weak-memoize/0.2.5: - resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} - dev: true + /@remirror/extension-diff@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-q9jsPPd33KXHPRM7HBGQYA701TDkNEcy+PIxwc+DJ7WV/yr04XTI48GbSokhgHciq6stZXTx8rK7xYm8N6HTPw==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@eslint/eslintrc/0.4.3: - resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} - engines: {node: ^10.12.0 || >=12.0.0} + /@remirror/extension-doc@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-VsJoVZ8qITXhFyc556Kav3PQQQsX96pGtCY4VE+u51X8ZUK7s5UTXCBov2tZkeikMsYzSKnumXmiGX7nBeFNog==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - ajv: 6.12.6 - debug: 4.3.3 - espree: 7.3.1 - globals: 13.14.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - js-yaml: 3.14.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 transitivePeerDependencies: - - supports-color - dev: true + - '@types/node' + - jsdom + dev: false - /@gar/promisify/1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - dev: true + /@remirror/extension-drop-cursor@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-k9O4Icpd66c2BlMXHSoFFh7QHPe5sMtYeeNd6eNyZUGG9hjdF07NI2agIKgIwZw5d9cyR/gkv/Ch3ZcpEBjqVQ==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@humanwhocodes/config-array/0.5.0: - resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} - engines: {node: '>=10.10.0'} + /@remirror/extension-embed@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-i/03OiqvheNeZkDJ6fWNmjypQ72twQR9XlkvaZk+PfbMS5hsYevOqTUknZsCkq8E1tOq1KWo0FfNexKkTu7C2A==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.3 - minimatch: 3.1.2 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@types/querystringify': 2.0.0 + prosemirror-resizable-view: 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + querystringify: 2.2.0 transitivePeerDependencies: - - supports-color - dev: true + - '@types/node' + - jsdom + dev: false - /@humanwhocodes/object-schema/1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true + /@remirror/extension-emoji@2.0.8(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-gielAMQtUFLoqBUuM0oGFWfSyf5NA4WFw0QF7Xo+eKjQDMXqlizMNesDyhEIoI/JEvG66IuufusRlyCaMuuKYA==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@ocavue/svgmoji-cjs': 0.1.1 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + emojibase: 6.1.0 + emojibase-data: 6.2.0(emojibase@6.1.0) + emojibase-regex: 6.0.1 + escape-string-regexp: 4.0.0 + svgmoji: 3.2.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@iconify/react/3.2.1: - resolution: {integrity: sha512-yKzixjC9ct9RC/aSGo1OGxkG2rpfhlr/urRz6k2YZlIBzn92PBTlqtSx8o8dFYEorr3eUFSCBZFzBy1yw5jsAA==} + /@remirror/extension-entity-reference@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-zusOyxTT+fEDz4zg7n1pKb2rtYsEvVRUxbAUDh9xDifKu83Bmu5lTEyTTLL2B+iwNJpRaKrin1oLeLqnhBzvlQ==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom dev: false - /@istanbuljs/load-nyc-config/1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + /@remirror/extension-epic-mode@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-/mwJK7bra41L+QRyrqL8uCW48/yvhbexlLe+wiaOxCUlP9cIiWLzyHCMQAcjCS2KbO1UR2v4nRlLiTiKxbFRbg==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@istanbuljs/schema/0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true + /@remirror/extension-events@2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-ZIprpQK8geNVTX5ZMBUDGxe9m9xJBP5RuYFG3yLe3A5/p/Gy9Wa6DeSToHtNsWmydMsQAjccV65cP4Qv/DfQ1A==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jest/console/27.5.1: - resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-font-family@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-R5x7VJvWUf+Ni9gZfXH4cvPVrK85BSzdOzN+G7Ul3nMCB7yElavp0M1729vpz3Ir48SvKbVdhuTShwcFzYNR/w==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@jest/types': 27.5.1 - '@types/node': 17.0.4 - chalk: 4.1.2 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jest/core/27.5.1_ts-node@10.7.0: - resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-font-size@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-9TamL9dByA9d7BVuckVSgYdFzIQQY2hUhezf+EMfaS4g+a5ERaIsxoMjVOqjQpBxn07qw9DafYHfb1GBRTmaNQ==} peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@remirror/pm': ^2.0.0 dependencies: - '@jest/console': 27.5.1 - '@jest/reporters': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.4 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.8.1 - exit: 0.1.2 - graceful-fs: 4.2.10 - jest-changed-files: 27.5.1 - jest-config: 27.5.1_ts-node@10.7.0 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 - micromatch: 4.0.5 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + round: 2.0.1 transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true + - '@types/node' + - jsdom + dev: false - /@jest/environment/27.5.1: - resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-gap-cursor@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-p1v1XFnF7/SufPxMQydNdouI+iNigTXWMfeyBB1m8g3zAH8ETjBAfmlGtIOFmlSTD+n2J32lCLlgNDhbFWthfw==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.4 - jest-mock: 27.5.1 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jest/fake-timers/27.5.1: - resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-hard-break@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-3kb3sjR7iC6tinZudxZw/ICEV5WEgLTS8COc8ZVmz2VRor0vMYkM5Lhfoc4+nBEOb6jyZJeb+OnsGYHOHeVsuw==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@jest/types': 27.5.1 - '@sinonjs/fake-timers': 8.1.0 - '@types/node': 17.0.4 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jest/globals/27.5.1: - resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-heading@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-yzLxgjlKNlJNKn8tcTsDV+f0w6hqzriC5TgbUyV27zzOFwVL9bkAAA7j+wiziV/HaALTLDSJOHKR73jJ2JIvmw==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@jest/environment': 27.5.1 - '@jest/types': 27.5.1 - expect: 27.5.1 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jest/reporters/27.5.1: - resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-history@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-mIZCXHZwNxliRPGT72FAXEbQlsrzUAdjmxpwBpgzOcMeJdEhnekrwRkg/ByMzyR64iidZu0K/th4p6uyLOM/Mg==} peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@remirror/pm': ^2.0.0 dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.4 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.0 - graceful-fs: 4.2.10 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.0 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.4 - jest-haste-map: 27.5.1 - jest-resolve: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - slash: 3.0.0 - source-map: 0.6.1 - string-length: 4.0.2 - terminal-link: 2.1.1 - v8-to-istanbul: 8.1.1 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false + + /@remirror/extension-horizontal-rule@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-xmcEWPE/X6FSv+vTyXKkOpx3BPsiXbVFkyPwnyQIucH4uUzYT8yCOIwRDWwuvUetQpaZrNRDG0wRJQA8s+9jcQ==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 transitivePeerDependencies: - - supports-color - dev: true + - '@types/node' + - jsdom + dev: false - /@jest/source-map/27.5.1: - resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-image@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-2p5mjs+fsE5sJCmI/DIq+qwA5sEGqThFggHR32Wfd5j68Ao6BM9cnNfrjM4zUi8mHLpznDI8dnQZo7Ff0gxaCw==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.10 - source-map: 0.6.1 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + prosemirror-resizable-view: 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jest/test-result/27.5.1: - resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-italic@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-uTGc0Tz+E8TN8uhOakSa9msEmDGEzW0hKMHLGqAo1eozPc3Jy/KlONuPRtwJOWQ1ApBDP5hQTWWuxu+BoFwVJA==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@jest/console': 27.5.1 - '@jest/types': 27.5.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jest/test-sequencer/27.5.1: - resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-link@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-/hAnbJHPViY9OsJ3wPExWA16SBYsxFnXJeKW5AZUHbmGJZXWUIdO8hHL7p0KGp3BOOhPTSUQ9M228wk90QskBg==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@jest/test-result': 27.5.1 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-runtime: 27.5.1 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + extract-domain: 2.2.1 transitivePeerDependencies: - - supports-color - dev: true + - '@types/node' + - jsdom + dev: false - /@jest/transform/26.6.2: - resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} - engines: {node: '>= 10.14.2'} + /@remirror/extension-list@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-9jXEhXP1F7Six5bWqU4LrqEFcX3dcXFx58fvE/T/KdzqGax4FNs6qU8jgCy9U/a1w6p2DMsDoVtOTTAOap9vlA==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@babel/core': 7.17.10 - '@jest/types': 26.6.2 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.8.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 26.6.2 - jest-regex-util: 26.0.0 - jest-util: 26.6.2 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) transitivePeerDependencies: - - supports-color - dev: true + - '@types/node' + - jsdom + dev: false - /@jest/transform/27.5.1: - resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-markdown@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-rLGoGAOARpCXlCmaITNCyyTQYpZf9/Jm8WUcnvMAi3kA//cAgCXp60XRDn3HO8VAiJ54ZnK0nmif6CS14gSe/g==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@babel/core': 7.17.10 - '@jest/types': 27.5.1 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.8.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@types/marked': 4.0.7 + '@types/turndown': 5.0.1 + marked: 4.1.1 + turndown: 7.1.1 + turndown-plugin-gfm: 1.0.2 transitivePeerDependencies: - - supports-color - dev: true + - '@types/node' + - jsdom + dev: false - /@jest/types/26.6.2: - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} + /@remirror/extension-mention-atom@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-abT6f9Ibo12IMQ/omxQSQ9AlL6WPqE+ufPko5V4gtg1mh4gMO+2C8UO1gA3LTljYx9YYz7nsFTWVz4Br4BOJpg==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.4 - '@types/yargs': 15.0.14 - chalk: 4.1.2 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jest/types/27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /@remirror/extension-mention@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-SEw4ahVUKmVsL+OJiPPmOxALmSOl5or7rzkwJqQ3xqIM0qV0zqCPX6049/9juKlvQiEp4wofAlFDJ33HMBZIlg==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.4 - '@types/yargs': 16.0.4 - chalk: 4.1.2 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + escape-string-regexp: 4.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jridgewell/gen-mapping/0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} - engines: {node: '>=6.0.0'} + /@remirror/extension-node-formatting@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-q7VwsYoUH7YNpHWgwqIIcSJikcMBuEsrnln9UoVfk1Md491PkBlsItgTxfNhKSOPgDuf9qlzgH2CAwpzjFXf5w==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@jridgewell/set-array': 1.1.1 - '@jridgewell/sourcemap-codec': 1.4.13 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jridgewell/resolve-uri/3.0.7: - resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} - engines: {node: '>=6.0.0'} - dev: true + /@remirror/extension-paragraph@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-6EprrG4YyDCWW31vxDt83+ixc/7ZXBc7QfbEwzPT8p22UVRhwtY/eQhpkz0hF9q4sgemo+yRxwep9xa9dCCqyA==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jridgewell/set-array/1.1.1: - resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==} - engines: {node: '>=6.0.0'} + /@remirror/extension-placeholder@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-Jv6Qohok+vl43ZweqctD7UdCZcQwjDeOu+KsFg6V9gB+Ek431C00SLFQctu3zpNwjTxVBotUoDjrGWdfeL2U3g==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jridgewell/sourcemap-codec/1.4.13: - resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} + /@remirror/extension-positioner@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-qjTJyjU5wta21DyRWSrAfUOOWwTG5zef6/O06GpEP97vKeDnq5Fz8j3yQDohK0Lyf7jqv4/iqwhnZ4yIP70S7g==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + nanoevents: 5.1.13 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@jridgewell/trace-mapping/0.3.13: - resolution: {integrity: sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==} + /@remirror/extension-react-component@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FRCVCmeo4ETLrQH/z6kZJW71ETbKA6WFWkNMzU5Qh3xQyTWbPthvrQnEpqVrgH0F3Gu8tXJ3Ss9gsBPT1agr9w==} + peerDependencies: + '@remirror/pm': ^2.0.0 + '@types/react': 18.0.20 + '@types/react-dom': ^16.9.0 || ^17 || ^18 + react: ^16.14.0 || ^17 || ^18 + react-dom: ^16.14.0 || ^17 || ^18 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@jridgewell/resolve-uri': 3.0.7 - '@jridgewell/sourcemap-codec': 1.4.13 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@types/react': 18.0.20 + '@types/react-dom': 18.0.6 + nanoevents: 5.1.13 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@leichtgewicht/ip-codec/2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - dev: true + /@remirror/extension-react-tables@2.0.9(@babel/core@7.18.13)(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(remirror@2.0.9): + resolution: {integrity: sha512-r5GroOGn+jbKeI740TCs2n5+fwoKDG9fef+sIgv07YXpOBxoo6tuokR58BYpshWKv2JuGmTDhz5qdyJXp21TCg==} + peerDependencies: + '@remirror/pm': ^2.0.0 + react: ^16.14.0 || ^17 || ^18 + react-dom: ^16.14.0 || ^17 || ^18 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/css': 11.10.0(@babel/core@7.18.13) + '@linaria/core': 3.0.0-beta.13 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/core-utils': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-tables': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/icons': 2.0.0 + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/preset-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/react-components': 2.0.9(@babel/core@7.18.13)(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(remirror@2.0.9) + '@remirror/react-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/react-hooks': 2.0.9(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + jsx-dom-cjs: 8.0.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@babel/core' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - jsdom + - remirror + dev: false - /@loadable/component/5.15.2_react@17.0.2: - resolution: {integrity: sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==} - engines: {node: '>=8'} + /@remirror/extension-search@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-WjxAMvCPuJRMtp/8utFEumU2zg+gGnu299UAvjPDv6BvnAq2F2430RbBkD2dTDu8TJaHO0SBUCS9eW9e83g+4A==} peerDependencies: - react: '>=16.3.0' + '@remirror/pm': ^2.0.0 dependencies: - '@babel/runtime': 7.17.9 - hoist-non-react-statics: 3.3.2 - react: 17.0.2 - react-is: 16.13.1 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + escape-string-regexp: 4.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom dev: false - /@mdx-js/loader/1.6.22_react@17.0.2: - resolution: {integrity: sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==} + /@remirror/extension-shortcuts@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-hQ2PfCG8uWHwVh/FF28gKXgKOi53jfVfuwAJYCYkivYNfaUhacwf0xh38004mKnwHBuHBpQIf+wZ43FRtTV5kA==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@mdx-js/mdx': 1.6.22 - '@mdx-js/react': 1.6.22_react@17.0.2 - loader-utils: 2.0.0 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/pm': 2.0.0 transitivePeerDependencies: - - react - - supports-color - dev: true + - '@types/node' + - jsdom + dev: false - /@mdx-js/mdx/1.6.22: - resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} + /@remirror/extension-strike@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-AL6hResXaZHb6/qTuqnUuGhSLwlAMHxrNSdSxwNHWSHoNbvN9+ahDz9FJILM71W64qdU07TihEGrypkOcQjA0A==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@babel/core': 7.12.9 - '@babel/plugin-syntax-jsx': 7.12.1_@babel+core@7.12.9 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@mdx-js/util': 1.6.22 - babel-plugin-apply-mdx-type-prop: 1.6.22_@babel+core@7.12.9 - babel-plugin-extract-import-names: 1.6.22 - camelcase-css: 2.0.1 - detab: 2.0.4 - hast-util-raw: 6.0.1 - lodash.uniq: 4.5.0 - mdast-util-to-hast: 10.0.1 - remark-footnotes: 2.0.0 - remark-mdx: 1.6.22 - remark-parse: 8.0.3 - remark-squeeze-paragraphs: 4.0.0 - style-to-object: 0.3.0 - unified: 9.2.0 - unist-builder: 2.0.3 - unist-util-visit: 2.0.3 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 transitivePeerDependencies: - - supports-color - dev: true + - '@types/node' + - jsdom + dev: false - /@mdx-js/react/1.6.22_react@17.0.2: - resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} + /@remirror/extension-sub@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-t3G4IORnXPAft+HzR6ViGCmsgQYpaNvVTuR5er6TU8LItFC2cgUPaQY3jNtmgBRH/oA5+LdAAYtO76S+lF9Y9A==} peerDependencies: - react: ^16.13.1 || ^17.0.0 + '@remirror/pm': ^2.0.0 dependencies: - react: 17.0.2 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@mdx-js/util/1.6.22: - resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} - dev: true + /@remirror/extension-sup@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-jTTxmFjfyW5wkFPmomr03WYPlO5d4qj2KjdI6Rv5AI42VVPVxHCgas0llNd6eq0hFG1f7MRWbCeTg+vYROSQHQ==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@mrmlnc/readdir-enhanced/2.2.1: - resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} - engines: {node: '>=4'} + /@remirror/extension-tables@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-UzuMjezwJlxgnw2Cfp3Dhd9le2JvveNOCyrPMY3oit+uBvFhInqveGZ9mgJUmCDCvccPYKp9b4myJ3xgdckUfg==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - call-me-maybe: 1.0.1 - glob-to-regexp: 0.3.0 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@nodelib/fs.scandir/2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + /@remirror/extension-text-case@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-4/OjUgU4eskebgncKyy3Xj4PV5fWboR1CF4irDwoD/KFgV0jnjZb0RakN8HImVX9lTLOGGTIMP8+rH9D5mFtUw==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@nodelib/fs.stat/1.1.3: - resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} - engines: {node: '>= 6'} - dev: true + /@remirror/extension-text-color@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-OuvIgAXcFjTTN6WIqbTcY8SoQNBmkzLsnNttVKrktWCZYPpNPMoLkGDsckyqjRoXmSkEotgKxD8xjrPVB1qmvw==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/i18n': 2.0.1 + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + color2k: 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@nodelib/fs.stat/2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + /@remirror/extension-text-highlight@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-7JX/N5y9C7LgRUcPJTTqxaRJMJceEMZWxMT2jk0BMmEm/IREdOYAx2mKKcazEGC+AO++S7EvNm6SsurWTbR7Ig==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text-color': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@nodelib/fs.walk/1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + /@remirror/extension-text@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-GwnwjhY2q4Rq4P/sg2eCWu94eQm0gPpAfkbPPpSZSlHgtVcObTg90WtsY/wIJA2TZwsaLyarDfYL6o+YH8V3AA==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@npmcli/fs/1.1.1: - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + /@remirror/extension-trailing-node@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-7XMxJc0Ez2DSpqB0ik+ypEmJoagctx7MEfBb+MKdQzutFtHIlu0FNySpxt2gNajTnIDJkS+2SiYanwyhaeqXKg==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - '@gar/promisify': 1.1.3 - semver: 7.3.7 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@npmcli/move-file/1.1.2: - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} + /@remirror/extension-underline@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-emXdF9ReVIt3zEhOmxc8BIjQSJ0F6Kz6017XhC5bIX9mKZBsLV+q3eg1HLCl5LCRPlM7tRTJq8SvV59aH+kBNQ==} + peerDependencies: + '@remirror/pm': ^2.0.0 dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false + + /@remirror/extension-whitespace@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-+TBXrzE4UChIJO+YJwMRwPDrEEvbdmHGgW4tjOd92almXMQTiPwZNwPpmIOchpy28DVeStgo+Sznhlt2onh+Bg==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false + + /@remirror/extension-yjs@3.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2)(yjs@13.5.41): + resolution: {integrity: sha512-Uz6Eokq+4pF28YERLULlHLBaCYb6CJgm2VR7eNyAgFNIvaLbsnzvRksklILtcLF1gi+QqBosSOJp1mf1bnPBJw==} + peerDependencies: + '@remirror/pm': ^2.0.0 + yjs: ^13.4.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + y-prosemirror: 1.1.3(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2)(y-protocols@1.0.5)(yjs@13.5.41) + y-protocols: 1.0.5 + yjs: 13.5.41 + transitivePeerDependencies: + - '@types/node' + - jsdom + - prosemirror-model + - prosemirror-state + - prosemirror-view + dev: false + + /@remirror/i18n@2.0.1: + resolution: {integrity: sha512-doS1zkR5hOLajMvsqGc1b5wCY7M3rvBDXY4qOVg82QKnXb8jvNtWoL1DoYHyYPtMIIAlyYwlddM+Icl9nrvztw==} + dependencies: + '@babel/runtime': 7.21.0 + '@lingui/core': 3.14.0 + '@lingui/detect-locale': 3.14.0 + '@remirror/core-helpers': 2.0.0 + make-plural: 6.2.2 + dev: false + + /@remirror/icons@2.0.0: + resolution: {integrity: sha512-kGQlDQ7LgsNBe5HIrqcUBrbc+E2ppZNifg40kfOigbR4iNNXgMyHQ17CFzjIgyGd3QlJzbRl2tdZc5FR8TevTg==} + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core-helpers': 2.0.0 + dev: false + + /@remirror/messages@2.0.1: + resolution: {integrity: sha512-t8uSzUydMX1/VWXfxmn7cGDI3TbowE1a/FNP+Ity/SFdozXKrdIozftEivW9SDIXrI6Aode+26mtvKCPtkTcfg==} + dependencies: + '@babel/runtime': 7.21.0 + '@lingui/core': 3.14.0 + '@remirror/core-helpers': 2.0.0 + dev: false + + /@remirror/pm@2.0.0: + resolution: {integrity: sha512-+9OvHB9AifWvckqEhwgLxiOVFsC3joHQXU1WIWm5gX5gODR+AV0Tuz4eQdb+flqIMh4CFTHMbGq4W0oa7CYz4A==} + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core-constants': 2.0.0 + '@remirror/core-helpers': 2.0.0 + prosemirror-collab: 1.3.0 + prosemirror-commands: 1.3.1 + prosemirror-dropcursor: 1.6.0 + prosemirror-gapcursor: 1.3.1 + prosemirror-history: 1.3.0 + prosemirror-inputrules: 1.2.0 + prosemirror-keymap: 1.2.0 + prosemirror-model: 1.18.1 + prosemirror-paste-rules: 2.0.0(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2) + prosemirror-schema-list: 1.2.2 + prosemirror-state: 1.4.1 + prosemirror-suggest: 2.0.0(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2) + prosemirror-tables: 1.2.5 + prosemirror-trailing-node: 2.0.0(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2) + prosemirror-transform: 1.7.0 + prosemirror-view: 1.28.2 + dev: false + + /@remirror/preset-core@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-FsMrw7PFkf62U8ikkYZ6AfZYBfYj3LH+QF2z1oHjTxdeMzRqaA3o+5RTbTCm3Oyw5UHxMN90de48Rl73VkUtBQ==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-doc': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-gap-cursor': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-history': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-paragraph': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false + + /@remirror/preset-formatting@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-jZbT68tGJ8yos1UWowmH3/3BQ3HEtc4reuMeJ+9K+GOpx0cIBJDvhnSIgJ+9SB4QeEGfkDGZIptmn1fXUmRodg==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-bold': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-columns': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-font-size': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-heading': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-italic': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-node-formatting': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-strike': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-sub': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-sup': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text-case': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text-color': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text-highlight': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-underline': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-whitespace': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/pm': 2.0.0 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false + + /@remirror/preset-react@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-bxYuYdLn6JTiKODm3T3yCdYulqVe58qtBy1RgxksFYMDtnlFLla6LCAXvYbmDd0/fg3+UYBV9jiRHT3anbYDmg==} + peerDependencies: + '@remirror/pm': ^2.0.0 + '@types/react': 18.0.20 + '@types/react-dom': ^16.9.0 || ^17 || ^18 + react: ^16.14.0 || ^17 || ^18 + react-dom: ^16.14.0 || ^17 || ^18 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-placeholder': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-react-component': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/pm': 2.0.0 + '@remirror/react-utils': 2.0.0(@remirror/pm@2.0.0)(@types/react@18.0.20)(react@18.2.0) + '@types/react': 18.0.20 + '@types/react-dom': 18.0.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false + + /@remirror/preset-wysiwyg@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9)(prettier@2.8.4): + resolution: {integrity: sha512-oFsBZyOOjWVVJHjwSVIDpwpdmMv0Tag++J23vIOw8LlZ4CPd+LtbEy2VkafoEMuWzOPMwr66IXYt4Rbky5P7Pg==} + peerDependencies: + '@remirror/pm': ^2.0.0 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-bidi': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-blockquote': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-bold': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-code': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-code-block': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(prettier@2.8.4) + '@remirror/extension-drop-cursor': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-embed': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-gap-cursor': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-hard-break': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-heading': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-horizontal-rule': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-image': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-italic': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-link': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-list': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-search': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-shortcuts': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-strike': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-trailing-node': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-underline': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/pm': 2.0.0 + '@remirror/preset-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + transitivePeerDependencies: + - '@types/node' + - '@types/prettier' + - jsdom + - prettier + dev: false + + /@remirror/react-components@2.0.9(@babel/core@7.18.13)(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(remirror@2.0.9): + resolution: {integrity: sha512-xFk2TB9Ltbk6H9aKyLIE3tGAGocjCqOJ2jV6+sjyN9kMqimaLDrrqmpxjQQgMIqo4qg168FnKgGVR/DoUW3JQw==} + peerDependencies: + '@remirror/pm': ^2.0.0 + '@types/react': 18.0.20 + '@types/react-dom': ^16.9.0 || ^17 || ^18 + react: ^16.14.0 || ^17 || ^18 + react-dom: ^16.14.0 || ^17 || ^18 + remirror: ^2.0.9 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/react': 11.10.4(@babel/core@7.18.13)(@types/react@18.0.20)(react@18.2.0) + '@emotion/styled': 11.10.4(@babel/core@7.18.13)(@emotion/react@11.10.4)(@types/react@18.0.20)(react@18.2.0) + '@lingui/core': 3.14.0 + '@mui/material': 5.11.3(@emotion/react@11.10.4)(@emotion/styled@11.10.4)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@popperjs/core': 2.11.7 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text-color': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/i18n': 2.0.1 + '@remirror/icons': 2.0.0 + '@remirror/messages': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/react-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/react-hooks': 2.0.9(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/react-utils': 2.0.0(@remirror/pm@2.0.0)(@types/react@18.0.20)(react@18.2.0) + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + '@seznam/compose-react-refs': 1.0.6 + '@types/react': 18.0.20 + '@types/react-color': 3.0.6 + '@types/react-dom': 18.0.6 + create-context-state: 2.0.0(@types/react@18.0.20)(react@18.2.0) + match-sorter: 6.3.1 + multishift: 2.0.1(@remirror/pm@2.0.0)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-color: 2.19.3(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) + remirror: 2.0.9(@remirror/pm@2.0.0)(@types/node@18.11.9)(prettier@2.8.4)(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2) + transitivePeerDependencies: + - '@babel/core' + - '@types/node' + - jsdom + dev: false - /@pmmmwh/react-refresh-webpack-plugin/0.5.6_a3gyllrqvxpec3fpybsrposvju: - resolution: {integrity: sha512-IIWxofIYt/AbMwoeBgj+O2aAXLrlCQVg+A4a2zfpXFNHgP8o8rvi3v+oe5t787Lj+KXlKOh8BAiUp9bhuELXhg==} - engines: {node: '>= 10.13'} + /@remirror/react-core@2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FScylKU8XY+mIKo1wzz/GnxVdERYn/3srpu/YDizjcpR88Ezr0cgqGCXkCL3nFJEVURkZo20ErGyflOaslIy4g==} peerDependencies: - '@types/webpack': 4.x || 5.x - react-refresh: '>=0.10.0 <1.0.0' - sockjs-client: ^1.4.0 - type-fest: '>=0.17.0 <3.0.0' - webpack: '>=4.43.0 <6.0.0' - webpack-dev-server: 3.x || 4.x - webpack-hot-middleware: 2.x - webpack-plugin-serve: 0.x || 1.x + '@remirror/pm': ^2.0.0 + '@types/react': 18.0.20 + '@types/react-dom': ^16.9.0 || ^17 || ^18 + react: ^16.14.0 || ^17 || ^18 + react-dom: ^16.14.0 || ^17 || ^18 peerDependenciesMeta: - '@types/webpack': + '@types/react': optional: true - sockjs-client: + '@types/react-dom': optional: true - type-fest: + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-react-component': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/i18n': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/preset-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/preset-react': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/react-renderer': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react@18.0.20)(react@18.2.0) + '@remirror/react-utils': 2.0.0(@remirror/pm@2.0.0)(@types/react@18.0.20)(react@18.2.0) + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + '@seznam/compose-react-refs': 1.0.6 + '@types/react': 18.0.20 + '@types/react-dom': 18.0.6 + create-context-state: 2.0.0(@types/react@18.0.20)(react@18.2.0) + fast-deep-equal: 3.1.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + resize-observer-polyfill: 1.5.1 + tiny-warning: 1.0.3 + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false + + /@remirror/react-hooks@2.0.9(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ItZjp2TpsITYem068HxOpAOTWjzXLs6IBiRcnxouex3sMbKEuLVmg2Z/I6tUyf/y2Hg3LdNaq7dXeHMX09n84g==} + peerDependencies: + '@remirror/pm': ^2.0.0 + '@types/react': 18.0.20 + '@types/react-dom': ^16.9.0 || ^17 || ^18 + react: ^16.14.0 || ^17 || ^18 + react-dom: ^16.14.0 || ^17 || ^18 + peerDependenciesMeta: + '@types/react': optional: true - webpack-dev-server: + '@types/react-dom': optional: true - webpack-hot-middleware: + react: optional: true - webpack-plugin-serve: + react-dom: optional: true dependencies: - ansi-html-community: 0.0.8 - common-path-prefix: 3.0.0 - core-js-pure: 3.22.5 - error-stack-parser: 2.0.7 - find-up: 5.0.0 - html-entities: 2.3.3 - loader-utils: 2.0.2 - react-refresh: 0.11.0 - schema-utils: 3.1.1 - source-map: 0.7.3 - webpack: 4.46.0 - dev: true + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-emoji': 2.0.8(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-history': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-mention': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-mention-atom': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/i18n': 2.0.1 + '@remirror/pm': 2.0.0 + '@remirror/react-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/react-utils': 2.0.0(@remirror/pm@2.0.0)(@types/react@18.0.20)(react@18.2.0) + '@types/react': 18.0.20 + '@types/react-dom': 18.0.6 + multishift: 2.0.1(@remirror/pm@2.0.0)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.20)(react@18.2.0) + use-previous: 1.1.0(@types/react@18.0.20)(react@18.2.0) + transitivePeerDependencies: + - '@types/node' + - jsdom + dev: false - /@polka/url/1.0.0-next.21: - resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} - dev: true + /@remirror/react-renderer@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-z34bb4pkxiemfSXga0haY1VDsIZJraLp9wfx2+ygre+za+4CEEMNLMTMzVRmltpHKqx0dX4XXW3iBC5YoABTgg==} + peerDependencies: + '@types/react': 18.0.20 + react: ^16.14.0 || ^17 || ^18 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@types/react': 18.0.20 + react: 18.2.0 + transitivePeerDependencies: + - '@remirror/pm' + - '@types/node' + - jsdom + dev: false - /@popperjs/core/2.11.5: - resolution: {integrity: sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==} + /@remirror/react-utils@2.0.0(@remirror/pm@2.0.0)(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-/G0EmigoDxkTivsivh03jdPK+/rOiOgKt58LwO8CiC4olTLykwvljJNu8uKm81bNADkKb8y2rfH+5FaP0JAX5g==} + peerDependencies: + '@types/react': 18.0.20 + react: ^16.14.0 || ^17 || ^18 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core-constants': 2.0.0 + '@remirror/core-helpers': 2.0.0 + '@remirror/core-types': 2.0.0(@remirror/pm@2.0.0) + '@types/react': 18.0.20 + react: 18.2.0 + transitivePeerDependencies: + - '@remirror/pm' + dev: false - /@reduxjs/toolkit/1.8.1_bjryulbxll5jujtwpu5a2wm2cy: - resolution: {integrity: sha512-Q6mzbTpO9nOYRnkwpDlFOAbQnd3g7zj7CtHAZWz5SzE5lcV97Tf8f3SzOO8BoPOMYBFgfZaqTUZqgGu+a0+Fng==} + /@remirror/react@2.0.9(@babel/core@7.18.13)(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(remirror@2.0.9): + resolution: {integrity: sha512-rba75RLd9ZS2gkLb1ipylKrqfB7+40VY8Vb4e8xKuIcdKl5CNCp5oE+6FbbCGNZLjpopr+yS/x/stAkTYSq7IA==} peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 - react-redux: ^7.2.1 || ^8.0.0-beta + '@types/react': 18.0.20 + '@types/react-dom': ^16.9.0 || ^17 || ^18 + react: ^16.14.0 || ^17 || ^18 + react-dom: ^16.14.0 || ^17 || ^18 peerDependenciesMeta: - react: + '@types/react': optional: true - react-redux: + '@types/react-dom': optional: true dependencies: - immer: 9.0.13 - react: 17.0.2 - react-redux: 7.2.8_react@17.0.2 - redux: 4.2.0 - redux-thunk: 2.4.1_redux@4.2.0 - reselect: 4.1.5 + '@babel/runtime': 7.21.0 + '@remirror/extension-placeholder': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-react-component': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/extension-react-tables': 2.0.9(@babel/core@7.18.13)(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(remirror@2.0.9) + '@remirror/preset-react': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/react-components': 2.0.9(@babel/core@7.18.13)(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(remirror@2.0.9) + '@remirror/react-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/react-hooks': 2.0.9(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react-dom@18.0.6)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@remirror/react-renderer': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(@types/react@18.0.20)(react@18.2.0) + '@remirror/react-utils': 2.0.0(@remirror/pm@2.0.0)(@types/react@18.0.20)(react@18.2.0) + '@types/react': 18.0.20 + '@types/react-dom': 18.0.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@babel/core' + - '@remirror/pm' + - '@types/node' + - jsdom + - remirror dev: false - /@rollup/plugin-babel/5.3.1_ddp4whfhauf2n5cf6yj7gaerwe: + /@remirror/theme@2.0.0(@remirror/pm@2.0.0): + resolution: {integrity: sha512-/Q9LpLQfHS0DZI0cU9QeByhbcQrKxSwFbCbE4S3Sy5EzpIGjI78b/CdWMJdS7eFsmXpuvedfQy7+egrJkFH9yg==} + dependencies: + '@babel/runtime': 7.21.0 + '@linaria/core': 3.0.0-beta.13 + '@remirror/core-types': 2.0.0(@remirror/pm@2.0.0) + color2k: 2.0.0 + csstype: 3.1.1 + transitivePeerDependencies: + - '@remirror/pm' + dev: false + + /@remirror/types@1.0.0: + resolution: {integrity: sha512-7HQbW7k8VxrAtfzs9FxwO6XSDabn8tSFDi1wwzShOnU+cvaYpfxu0ygyTk3TpXsag1hgFKY3ZIlAfB4WVz2LkQ==} + dependencies: + type-fest: 2.19.0 + dev: false + + /@remix-run/router@1.6.0: + resolution: {integrity: sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==} + engines: {node: '>=14'} + + /@rollup/plugin-babel@5.3.1(@babel/core@7.21.0)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2868,90 +9691,123 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/helper-module-imports': 7.16.7 - '@rollup/pluginutils': 3.1.0_rollup@2.72.1 - rollup: 2.72.1 + '@babel/core': 7.21.0 + '@babel/helper-module-imports': 7.18.6 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 dev: true - /@rollup/plugin-commonjs/19.0.2_rollup@2.72.1: + /@rollup/plugin-commonjs@19.0.2(rollup@2.79.1): resolution: {integrity: sha512-gBjarfqlC7qs0AutpRW/hrFNm+cd2/QKxhwyFa+srbg1oX7rDsEU3l+W7LAUhsAp9mPJMAkXDhLbQaVwEaE8bA==} engines: {node: '>= 8.0.0'} peerDependencies: rollup: ^2.38.3 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.72.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) commondir: 1.0.1 estree-walker: 2.0.2 - glob: 7.2.0 + glob: 7.2.3 is-reference: 1.2.1 magic-string: 0.25.9 - resolve: 1.22.0 - rollup: 2.72.1 - dev: false + resolve: 1.22.1 + rollup: 2.79.1 + + /@rollup/plugin-inject@4.0.4(rollup@2.78.1): + resolution: {integrity: sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.78.1) + estree-walker: 2.0.2 + magic-string: 0.25.9 + rollup: 2.78.1 + dev: true - /@rollup/plugin-json/4.1.0_rollup@2.72.1: + /@rollup/plugin-json@4.1.0(rollup@2.79.1): resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.72.1 - rollup: 2.72.1 - dev: false + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 - /@rollup/plugin-node-resolve/11.2.1_rollup@2.72.1: + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.72.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) '@types/resolve': 1.17.1 - builtin-modules: 3.2.0 - deepmerge: 4.2.2 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.0 - rollup: 2.72.1 + resolve: 1.22.2 + rollup: 2.79.1 dev: true - /@rollup/plugin-node-resolve/13.3.0_rollup@2.72.1: + /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^2.42.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.72.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) '@types/resolve': 1.17.1 - deepmerge: 4.2.2 - is-builtin-module: 3.1.0 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.0 - rollup: 2.72.1 - dev: false + resolve: 1.22.1 + rollup: 2.79.1 - /@rollup/plugin-replace/2.4.2_rollup@2.72.1: + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.72.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) magic-string: 0.25.9 - rollup: 2.72.1 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-replace@5.0.2(rollup@2.79.1): + resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@2.79.1) + magic-string: 0.27.0 + rollup: 2.79.1 dev: true - /@rollup/plugin-url/6.1.0_rollup@2.72.1: + /@rollup/plugin-url@6.1.0(rollup@2.79.1): resolution: {integrity: sha512-FJNWBnBB7nLzbcaGmu1no+U/LlRR67TtgfRFP+VEKSrWlDTE6n9jMns/N4Q/VL6l4x6kTHQX4HQfwTcldaAfHQ==} engines: {node: '>=10.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.72.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) make-dir: 3.1.0 mime: 2.6.0 - rollup: 2.72.1 - dev: false + rollup: 2.79.1 + + /@rollup/pluginutils@3.1.0(rollup@2.78.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.78.1 + dev: true - /@rollup/pluginutils/3.1.0_rollup@2.72.1: + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2960,882 +9816,982 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: 2.72.1 + rollup: 2.79.1 - /@rollup/pluginutils/4.2.1: + /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 + + /@rollup/pluginutils@5.0.2(rollup@2.79.1): + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + + /@seald-io/binary-search-tree@1.0.2: + resolution: {integrity: sha512-+pYGvPFAk7wUR+ONMOlc6A+LUN4kOCFwyPLjyaeS7wVibADPHWYJNYsNtyIAwjF1AXQkuaXElnIc4XjKt55QZA==} + dev: false + + /@seald-io/nedb@3.1.0: + resolution: {integrity: sha512-5G0hCQGJjOelOutvW1l4VD581XMhTPxpj1BUaCWTEM2MPXR9TzIr0MKMnEjnTA5nEKfujPyvVW7iF3etm1/gKQ==} + dependencies: + '@seald-io/binary-search-tree': 1.0.2 + localforage: 1.10.0 + util: 0.12.4 + dev: false + + /@sentry/browser@7.38.0: + resolution: {integrity: sha512-rPJr+2jRYL29PeMYA2JgzYKTZQx6bc3T9evbAdIh0n+popSjpVyOpOMV/3l6A7KZeeix3dpp6eUZUxTJukqriQ==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.38.0 + '@sentry/replay': 7.38.0 + '@sentry/types': 7.38.0 + '@sentry/utils': 7.38.0 + tslib: 1.14.1 + dev: false + + /@sentry/core@6.19.7: + resolution: {integrity: sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.7 + '@sentry/minimal': 6.19.7 + '@sentry/types': 6.19.7 + '@sentry/utils': 6.19.7 + tslib: 1.14.1 + dev: false + + /@sentry/core@7.38.0: + resolution: {integrity: sha512-+hXh/SO3Ie6WC2b+wi01xLhyVREdkRXS5QBmCiv3z2ks2HvYXp7PoKSXJvNKiwCP+pBD+enOnM1YEzM2yEy5yw==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.38.0 + '@sentry/utils': 7.38.0 + tslib: 1.14.1 dev: false - /@sinonjs/commons/1.8.3: - resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} + /@sentry/hub@6.19.7: + resolution: {integrity: sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.7 + '@sentry/utils': 6.19.7 + tslib: 1.14.1 + dev: false + + /@sentry/minimal@6.19.7: + resolution: {integrity: sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.7 + '@sentry/types': 6.19.7 + tslib: 1.14.1 + dev: false + + /@sentry/node@6.19.7: + resolution: {integrity: sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 6.19.7 + '@sentry/hub': 6.19.7 + '@sentry/types': 6.19.7 + '@sentry/utils': 6.19.7 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@sentry/react@7.38.0(react@18.2.0): + resolution: {integrity: sha512-IZpQ0aptV3UPjvDj+xorrgPgnW2xIL6Zcy7B6wAgwTC81OUITE7YaShglGD0sJ8M1ReFuH9duwTysr/uv8AytQ==} + engines: {node: '>=8'} + peerDependencies: + react: 15.x || 16.x || 17.x || 18.x + dependencies: + '@sentry/browser': 7.38.0 + '@sentry/types': 7.38.0 + '@sentry/utils': 7.38.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + tslib: 1.14.1 + dev: false + + /@sentry/replay@7.38.0: + resolution: {integrity: sha512-Ai78/OIYedny605x8uS0n/a5uj7qnuevogGD6agLat9lGc8DFvC07m2iS+EFyGOwtQzyDlRYJvYkHL8peR3crQ==} + engines: {node: '>=12'} + dependencies: + '@sentry/core': 7.38.0 + '@sentry/types': 7.38.0 + '@sentry/utils': 7.38.0 + dev: false + + /@sentry/tracing@7.38.0: + resolution: {integrity: sha512-ejXJp8oOT64MVtBzqdECUUaNzKbpu25St8Klub1i4Sm7xO+ZjDQDI4TIHvWojZvtkwQ3F4jcsCclc8KuyJunyQ==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.38.0 + '@sentry/types': 7.38.0 + '@sentry/utils': 7.38.0 + tslib: 1.14.1 + dev: false + + /@sentry/types@6.19.7: + resolution: {integrity: sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==} + engines: {node: '>=6'} + dev: false + + /@sentry/types@7.20.0: + resolution: {integrity: sha512-x17ddduGWqW95neBFVvxzmInb5WXVw+2PcNASHXpGFhi7v2gz2a7/w2CcIKxsqODNnc+z/k1t0Y+uy9B6aH6ag==} + engines: {node: '>=8'} + dev: false + + /@sentry/types@7.38.0: + resolution: {integrity: sha512-NKOALR6pNUMzUrsk2m+dkPrO8uGNvNh1LD0BCPswKNjC2qHo1h1mDGCgBmF9+EWyii8ZoACTIsxvsda+MBf97Q==} + engines: {node: '>=8'} + dev: false + + /@sentry/utils@6.19.7: + resolution: {integrity: sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.7 + tslib: 1.14.1 + dev: false + + /@sentry/utils@7.38.0: + resolution: {integrity: sha512-MgbI3YmYuyyhUtvcXkgGBqjOW+nuLLNGUdWCK+C4kObf8VbLt3dSE/7SEMT6TSHLYQmxs2BxFgx5Agn97m68kQ==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.38.0 + tslib: 1.14.1 + dev: false + + /@seznam/compose-react-refs@1.0.6: + resolution: {integrity: sha512-izzOXQfeQLonzrIQb8u6LQ8dk+ymz3WXTIXjvOlTXHq6sbzROg3NWU+9TTAOpEoK9Bth24/6F/XrfHJ5yR5n6Q==} + dev: false + + /@sideway/address@4.1.4: + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + dependencies: + '@hapi/hoek': 9.3.0 + + /@sideway/formula@3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + /@sideway/pinpoint@2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + + /@sindresorhus/is@0.15.0: + resolution: {integrity: sha512-lu8BpxjAtRCAo5ifytTpCPCj99LF7o/2Myn+NXyNCBqvPYn7Pjd76AMmUB5l7XF1U6t0hcWrlEM5ESufW7wAeA==} + engines: {node: '>=6'} + dev: false + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/8.1.0: + /@sinonjs/fake-timers@8.1.0: resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} dependencies: - '@sinonjs/commons': 1.8.3 + '@sinonjs/commons': 1.8.6 dev: true - /@socket.io/component-emitter/3.0.0: - resolution: {integrity: sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==} + /@slorber/static-site-generator-webpack-plugin@4.0.7: + resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} + engines: {node: '>=14'} + dependencies: + eval: 0.1.8 + p-map: 4.0.0 + webpack-sources: 3.2.3 dev: false - /@storybook/addon-actions/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-t2w3iLXFul+R/1ekYxIEzUOZZmvEa7EzUAVAuCHP4i6x0jBnTTZ7sAIUVRaxVREPguH5IqI/2OklYhKanty2Yw==} + /@socket.io/admin-ui@0.5.1(socket.io@4.7.2): + resolution: {integrity: sha512-1dlGL2FGm6T+uL1e6iDvbo2eCINwvW7iVbjIblwh5kPPRM1SP8lmZrbFZf4QNJ/cqQ+JLcx49eXGM9WAB4TK7w==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + socket.io: '>=3.1.0' + dependencies: + '@types/bcryptjs': 2.4.2 + bcryptjs: 2.4.3 + debug: 4.3.4(supports-color@9.2.2) + socket.io: 4.7.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@socket.io/component-emitter@3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + + /@socket.io/redis-adapter@8.2.1(socket.io-adapter@2.5.2): + resolution: {integrity: sha512-6Dt7EZgGSBP0qvXeOKGx7NnSr2tPMbVDfDyL97zerZo+v69hMfL99skMCL3RKZlWVqLyRme2T0wcy3udHhtOsg==} + engines: {node: '>=10.0.0'} + peerDependencies: + socket.io-adapter: ^2.4.0 + dependencies: + debug: 4.3.4(supports-color@9.2.2) + notepack.io: 3.0.1 + socket.io-adapter: 2.5.2 + uid2: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@storybook/addon-actions@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vpCnEu81fmtYzOf0QsRYoDuf9wXgVVl2VysE1dWRebRhIUDU0JurrthTnw322e38D4FzaoNGqZE7wnBYBohzZA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - core-js: 3.22.5 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.25.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 polished: 4.2.2 - prop-types: 15.8.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-inspector: 5.1.1_react@17.0.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-inspector: 5.1.1(react@18.2.0) regenerator-runtime: 0.13.9 - telejson: 5.3.3 + telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 uuid-browser: 3.1.0 - transitivePeerDependencies: - - '@types/react' dev: true - /@storybook/addon-backgrounds/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-xQIV1SsjjRXP7P5tUoGKv+pul1EY8lsV7iBXQb5eGbp4AffBj3qoYBSZbX4uiazl21o0MQiQoeIhhaPVaFIIGg==} + /@storybook/addon-backgrounds@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5uzQda3dh891h7BL8e9Ymk7BI+QgkkzDJXuA4mHjOXfIiD3S3efhJI8amXuBC2ZpIr6zmVit0MqZVyoVve46cQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - core-js: 3.22.5 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 global: 4.4.0 memoizerific: 1.11.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' dev: true - /@storybook/addon-controls/6.4.22_oagctitnqx3g7idiuq5vrj5arm: - resolution: {integrity: sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==} + /@storybook/addon-controls@6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4): + resolution: {integrity: sha512-lC2y3XcolmQAJwFurIyGrynAHPWmfNtTCdu3rQBTVGwyxCoNwdOOeC2jV0BRqX2+CW6OHzJr9frNWXPSaZ8c4w==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-common': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/node-logger': 6.4.22 - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - core-js: 3.22.5 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/node-logger': 6.5.10 + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 lodash: 4.17.21 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 transitivePeerDependencies: - - '@types/react' + - '@swc/core' + - esbuild - eslint - supports-color - typescript + - uglify-js - vue-template-compiler - webpack-cli - - webpack-command dev: true - /@storybook/addon-docs/6.4.22_ogx44uabn4hurc23cidv5sleiy: - resolution: {integrity: sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==} + /@storybook/addon-docs@6.5.10(@babel/core@7.18.13)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0): + resolution: {integrity: sha512-1kgjo3f0vL6GN8fTwLL05M/q/kDdzvuqwhxPY/v5hubFb3aQZGr2yk9pRBaLAbs4bez0yG0ASXcwhYnrEZUppg==} peerDependencies: - '@storybook/angular': 6.4.22 - '@storybook/html': 6.4.22 - '@storybook/react': 6.4.22 - '@storybook/vue': 6.4.22 - '@storybook/vue3': 6.4.22 - '@storybook/web-components': 6.4.22 - lit: ^2.0.0 - lit-html: ^1.4.1 || ^2.0.0 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - svelte: ^3.31.2 - sveltedoc-parser: ^4.1.0 - vue: ^2.6.10 || ^3.0.0 - webpack: '*' + '@storybook/mdx2-csf': ^0.0.3 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: - '@storybook/angular': - optional: true - '@storybook/html': - optional: true - '@storybook/react': - optional: true - '@storybook/vue': - optional: true - '@storybook/vue3': - optional: true - '@storybook/web-components': - optional: true - lit: - optional: true - lit-html: - optional: true - react: - optional: true - react-dom: - optional: true - svelte: - optional: true - sveltedoc-parser: + '@storybook/mdx2-csf': optional: true - vue: + react: optional: true - webpack: + react-dom: optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/generator': 7.17.10 - '@babel/parser': 7.17.10 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.10 - '@babel/preset-env': 7.17.10_@babel+core@7.17.10 + '@babel/plugin-transform-react-jsx': 7.18.10(@babel/core@7.18.13) + '@babel/preset-env': 7.20.2(@babel/core@7.18.13) '@jest/transform': 26.6.2 - '@mdx-js/loader': 1.6.22_react@17.0.2 - '@mdx-js/mdx': 1.6.22 - '@mdx-js/react': 1.6.22_react@17.0.2 - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/builder-webpack4': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core': 6.4.22_femxfsv7ntf2nz4bpj36nj6mcm - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/csf-tools': 6.4.22 - '@storybook/node-logger': 6.4.22 - '@storybook/postinstall': 6.4.22 - '@storybook/preview-web': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/react': 6.4.22_utlndcjoixapem4pxrt4hkdn44 - '@storybook/source-loader': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 - acorn-walk: 7.2.0 - core-js: 3.22.5 - doctrine: 3.0.0 - escodegen: 2.0.0 + '@mdx-js/react': 1.6.22(react@18.2.0) + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/docs-tools': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/mdx1-csf': 0.0.1(@babel/core@7.18.13) + '@storybook/node-logger': 6.5.10 + '@storybook/postinstall': 6.5.10 + '@storybook/preview-web': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/source-loader': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + babel-loader: 8.3.0(@babel/core@7.18.13)(webpack@5.75.0) + core-js: 3.28.0 fast-deep-equal: 3.1.3 global: 4.4.0 - html-tags: 3.2.0 - js-string-escape: 1.0.1 - loader-utils: 2.0.2 lodash: 4.17.21 - nanoid: 3.3.4 - p-limit: 3.1.0 - prettier: 2.3.0 - prop-types: 15.8.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-element-to-jsx-string: 14.3.4_sfoxds7t5ydpegc3knd667wn6m - regenerator-runtime: 0.13.9 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 remark-external-links: 8.0.0 remark-slug: 6.1.0 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.72.1 transitivePeerDependencies: - - '@storybook/builder-webpack5' - - '@storybook/manager-webpack5' - - '@types/react' - - bluebird - - bufferutil - - encoding + - '@babel/core' + - '@swc/core' + - esbuild - eslint - supports-color - typescript - - utf-8-validate + - uglify-js - vue-template-compiler + - webpack - webpack-cli - - webpack-command dev: true - /@storybook/addon-essentials/6.4.22_ubrf73fv3gag46ubi26vwtl5ya: - resolution: {integrity: sha512-GTv291fqvWq2wzm7MruBvCGuWaCUiuf7Ca3kzbQ/WqWtve7Y/1PDsqRNQLGZrQxkXU0clXCqY1XtkTrtA3WGFQ==} + /@storybook/addon-essentials@6.5.10(@babel/core@7.18.13)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0): + resolution: {integrity: sha512-PT2aiR4vgAyB0pl3HNBUa4/a7NDRxASxAazz7zt9ZDirkipDKfxwdcLeRoJzwSngVDWEhuz5/paN5x4eNp4Hww==} peerDependencies: '@babel/core': ^7.9.6 - '@storybook/vue': 6.4.22 - '@storybook/web-components': 6.4.22 - babel-loader: ^8.0.0 - lit-html: ^1.4.1 || ^2.0.0-rc.3 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + '@storybook/angular': '*' + '@storybook/builder-manager4': '*' + '@storybook/builder-manager5': '*' + '@storybook/builder-webpack4': '*' + '@storybook/builder-webpack5': '*' + '@storybook/html': '*' + '@storybook/vue': '*' + '@storybook/vue3': '*' + '@storybook/web-components': '*' + lit: '*' + lit-html: '*' + react: '*' + react-dom: '*' + svelte: '*' + sveltedoc-parser: '*' + vue: '*' webpack: '*' peerDependenciesMeta: + '@storybook/angular': + optional: true + '@storybook/builder-manager4': + optional: true + '@storybook/builder-manager5': + optional: true + '@storybook/builder-webpack4': + optional: true + '@storybook/builder-webpack5': + optional: true + '@storybook/html': + optional: true '@storybook/vue': optional: true + '@storybook/vue3': + optional: true '@storybook/web-components': optional: true + lit: + optional: true lit-html: optional: true react: optional: true react-dom: optional: true + svelte: + optional: true + sveltedoc-parser: + optional: true + vue: + optional: true webpack: optional: true dependencies: - '@babel/core': 7.17.10 - '@storybook/addon-actions': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/addon-backgrounds': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/addon-controls': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/addon-docs': 6.4.22_ogx44uabn4hurc23cidv5sleiy - '@storybook/addon-measure': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/addon-outline': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/addon-toolbars': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/addon-viewport': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/node-logger': 6.4.22 - babel-loader: 8.2.5_we4j6ycntotymd3gptdmlkk2fi - core-js: 3.22.5 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/core': 7.18.13 + '@storybook/addon-actions': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-backgrounds': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-controls': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/addon-docs': 6.5.10(@babel/core@7.18.13)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0) + '@storybook/addon-measure': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-outline': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-toolbars': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-viewport': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/node-logger': 6.5.10 + core-js: 3.25.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - webpack: 5.72.1 - transitivePeerDependencies: - - '@storybook/angular' - - '@storybook/builder-webpack5' - - '@storybook/html' - - '@storybook/manager-webpack5' - - '@storybook/react' - - '@storybook/vue3' - - '@types/react' - - bluebird - - bufferutil - - encoding + webpack: 5.75.0(esbuild@0.15.18) + transitivePeerDependencies: + - '@storybook/mdx2-csf' + - '@swc/core' + - esbuild - eslint - - lit - supports-color - - svelte - - sveltedoc-parser - typescript - - utf-8-validate - - vue + - uglify-js - vue-template-compiler - webpack-cli - - webpack-command dev: true - /@storybook/addon-interactions/6.4.22_oagctitnqx3g7idiuq5vrj5arm: - resolution: {integrity: sha512-Po/iQLCw1Fw3jkm+twflX1IzVfOHdMBB3fPT8Hx6LZnMmWZk8wwQ3xKW0vT42qVF6Qt4QmxJBZNhYJ4jwpZQRA==} + /@storybook/addon-interactions@6.5.10(@types/react@18.0.20)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4): + resolution: {integrity: sha512-+O/ZuQjonpFmTdFRqjCimQTx4S4c1+S3dYCn6gD/E4xzqlQn1BQaER3paX/aBUKb3oRaSO9RUQ+uxePM4zBEwA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-common': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/instrumenter': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m + '@devtools-ds/object-inspector': 1.2.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/instrumenter': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.25.0 global: 4.4.0 jest-mock: 27.5.1 polished: 4.2.2 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 transitivePeerDependencies: + - '@swc/core' - '@types/react' + - esbuild - eslint - supports-color - typescript + - uglify-js - vue-template-compiler - webpack-cli - - webpack-command dev: true - /@storybook/addon-links/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-OSOyDnTXnmcplJHlXTYUTMkrfpLqxtHp2R69IXfAyI1e8WNDb79mXflrEXDA/RSNEliLkqYwCyYby7gDMGds5Q==} + /@storybook/addon-links@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-r3WzYIPz7WjHiaPObC2Tg6bHuZRBb/Kt/X+Eitw+jTqBel7ksvkO36tn81q8Eyj61qIdNQmUWAaX/0aewT0kLA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/router': 6.4.22_sfoxds7t5ydpegc3knd667wn6m + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/router': 6.5.10(react-dom@18.2.0)(react@18.2.0) '@types/qs': 6.9.7 - core-js: 3.22.5 + core-js: 3.25.0 global: 4.4.0 - prop-types: 15.8.0 - qs: 6.10.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + prop-types: 15.8.1 + qs: 6.11.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 dev: true - /@storybook/addon-measure/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-CjDXoCNIXxNfXfgyJXPc0McjCcwN1scVNtHa9Ckr+zMjiQ8pPHY7wDZCQsG69KTqcWHiVfxKilI82456bcHYhQ==} + /@storybook/addon-measure@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ss7L1H5K5hXygDIoVwj+QyVXbve5V67x7CofLiLCgQYuJzfO16+sPGjiTGWMpTb4ijox2uKWnTkpilt5bCjXgw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - core-js: 3.22.5 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + core-js: 3.28.0 global: 4.4.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - transitivePeerDependencies: - - '@types/react' + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/addon-outline/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-VIMEzvBBRbNnupGU7NV0ahpFFb6nKVRGYWGREjtABdFn2fdKr1YicOHFe/3U7hRGjb5gd+VazSvyUvhaKX9T7Q==} + /@storybook/addon-outline@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-AjdaeQ+/iBKmGrAqRW4niwMB6AkgGnYmSzVs5Cf6F/Sb4Dp+vzgLNOwLABD9qs8Ri8dvHl5J4QpVwQKUhYZaOQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - core-js: 3.22.5 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + core-js: 3.28.0 global: 4.4.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' dev: true - /@storybook/addon-toolbars/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-FFyj6XDYpBBjcUu6Eyng7R805LUbVclEfydZjNiByAoDVyCde9Hb4sngFxn/T4fKAfBz/32HKVXd5iq4AHYtLg==} + /@storybook/addon-toolbars@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S0Ljc6Wv+bPbx2e0iTveJ6bBDqjsemu+FZD4qDLsHreoI7DAcqyrF5Def1l8xNohixIVpx8dQpYXRtyzNlXekg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - core-js: 3.22.5 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 - transitivePeerDependencies: - - '@types/react' + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 dev: true - /@storybook/addon-viewport/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-6jk0z49LemeTblez5u2bYXYr6U+xIdLbywe3G283+PZCBbEDE6eNYy2d2HDL+LbCLbezJBLYPHPalElphjJIcw==} + /@storybook/addon-viewport@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-RFMd+4kZljyuJjR9OJ2bFXHrSG7VTi5FDZYWEU+4W1sBxzC+JhnVnUP+HJH3gUxEFIRQC5neRzwWRE9RUUoALQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-events': 6.4.22 - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - core-js: 3.22.5 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 6.5.10 + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 global: 4.4.0 memoizerific: 1.11.3 prop-types: 15.8.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 - transitivePeerDependencies: - - '@types/react' + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 dev: true - /@storybook/addons/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==} + /@storybook/addons@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VD4tBCQ23PkSeDoxuHcKy0RfhIs3oMYjBacOZx7d0bvOzK9WjPyvE2ysDAh7r/ceqnwmWHAScIpE+I1RU7gl+g==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/channels': 6.4.22 - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/router': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@types/webpack-env': 1.16.4 - core-js: 3.22.5 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/channels': 6.5.10 + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/router': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@types/webpack-env': 1.18.0 + core-js: 3.28.0 global: 4.4.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 dev: true - /@storybook/api/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==} + /@storybook/api@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-AkmgSPNEGdKp4oZA4KQ+RJsacw7GwfvjsVDnCkcXqS9zmSr/RNL0fhpcd60KKkmx/hGKPTDFpK3ZayxDrJ/h4A==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 6.4.22 - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/router': 6.4.22_sfoxds7t5ydpegc3knd667wn6m + '@storybook/channels': 6.5.10 + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/router': 6.5.10(react-dom@18.2.0)(react@18.2.0) '@storybook/semver': 7.3.2 - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - core-js: 3.22.5 + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 memoizerific: 1.11.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 - store2: 2.13.2 - telejson: 5.3.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 + store2: 2.14.2 + telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 dev: true - /@storybook/builder-webpack4/6.4.22_oagctitnqx3g7idiuq5vrj5arm: - resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} + /@storybook/builder-webpack4@6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4): + resolution: {integrity: sha512-AoKjsCNoQQoZXYwBDxO8s+yVEd5FjBJAaysEuUTHq2fb81jwLrGcEOo6hjw4jqfugZQIzYUEjPazlvubS78zpw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-decorators': 7.17.9_@babel+core@7.17.10 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.10 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.10 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.10 - '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.10 - '@babel/preset-env': 7.17.10_@babel+core@7.17.10 - '@babel/preset-react': 7.16.7_@babel+core@7.17.10 - '@babel/preset-typescript': 7.16.7_@babel+core@7.17.10 - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/channel-postmessage': 6.4.22 - '@storybook/channels': 6.4.22 - '@storybook/client-api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-common': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/core-events': 6.4.22 - '@storybook/node-logger': 6.4.22 - '@storybook/preview-web': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/router': 6.4.22_sfoxds7t5ydpegc3knd667wn6m + '@babel/core': 7.21.0 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/channel-postmessage': 6.5.10 + '@storybook/channels': 6.5.10 + '@storybook/client-api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/core-events': 6.5.10 + '@storybook/node-logger': 6.5.10 + '@storybook/preview-web': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/router': 6.5.10(react-dom@18.2.0)(react@18.2.0) '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@types/node': 14.18.17 + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/ui': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@types/node': 18.11.9 '@types/webpack': 4.41.32 autoprefixer: 9.8.8 - babel-loader: 8.2.5_usdhdj5awexcm2e5jtwd44bofa - babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.10 + babel-loader: 8.3.0(@babel/core@7.21.0)(webpack@5.75.0) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.22.5 - css-loader: 3.6.0_webpack@4.46.0 - file-loader: 6.2.0_webpack@4.46.0 + core-js: 3.28.0 + css-loader: 3.6.0(webpack@5.75.0) + file-loader: 6.2.0(webpack@5.75.0) find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6_u7kjabuvawcog7hjctusduehvm - glob: 7.2.0 - glob-promise: 3.4.0_glob@7.2.0 + fork-ts-checker-webpack-plugin: 4.1.6(eslint@8.34.0)(typescript@4.9.4)(webpack@5.75.0) + glob: 7.2.3 + glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2_webpack@4.46.0 - pnp-webpack-plugin: 1.6.4_typescript@4.6.4 + html-webpack-plugin: 4.5.2(webpack@5.75.0) + pnp-webpack-plugin: 1.6.4(typescript@4.9.4) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0_gzaxsinx64nntyd3vmdqwl7coe - raw-loader: 4.0.2_webpack@4.46.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.75.0) + raw-loader: 4.0.2(webpack@5.75.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0_webpack@4.46.0 - terser-webpack-plugin: 4.2.3_webpack@4.46.0 + style-loader: 1.3.0(webpack@5.75.0) + terser-webpack-plugin: 4.2.3(webpack@5.75.0) ts-dedent: 2.2.0 - typescript: 4.6.4 - url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy + typescript: 4.9.4 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.75.0) util-deprecate: 1.0.2 - webpack: 4.46.0 - webpack-dev-middleware: 3.7.3_webpack@4.46.0 - webpack-filter-warnings-plugin: 1.2.1_webpack@4.46.0 - webpack-hot-middleware: 2.25.1 + webpack: 5.75.0(esbuild@0.15.18) + webpack-dev-middleware: 3.7.3(webpack@5.75.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.75.0) + webpack-hot-middleware: 2.25.2 webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - - '@types/react' + - '@swc/core' - bluebird + - esbuild - eslint - supports-color + - uglify-js - vue-template-compiler - webpack-cli - - webpack-command dev: true - /@storybook/channel-postmessage/6.4.22: - resolution: {integrity: sha512-gt+0VZLszt2XZyQMh8E94TqjHZ8ZFXZ+Lv/Mmzl0Yogsc2H+6VzTTQO4sv0IIx6xLbpgG72g5cr8VHsxW5kuDQ==} + /@storybook/channel-postmessage@6.5.10: + resolution: {integrity: sha512-t9PTA0UzFvYa3IlOfpBOolfrRMPTjUMIeCQ6FNyM0aj5GqLKSvoQzP8NeoRpIrvyf6ljFKKdaMaZ3fiCvh45ag==} dependencies: - '@storybook/channels': 6.4.22 - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - core-js: 3.22.5 + '@storybook/channels': 6.5.10 + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + core-js: 3.28.0 global: 4.4.0 - qs: 6.10.3 - telejson: 5.3.3 + qs: 6.11.1 + telejson: 6.0.8 dev: true - /@storybook/channel-websocket/6.4.22: - resolution: {integrity: sha512-Bm/FcZ4Su4SAK5DmhyKKfHkr7HiHBui6PNutmFkASJInrL9wBduBfN8YQYaV7ztr8ezoHqnYRx8sj28jpwa6NA==} + /@storybook/channel-websocket@6.5.10: + resolution: {integrity: sha512-RTXMZbMWCS3xU+4GVIdfnUXsKcwg/WTozy88/5OxaKjGw6KgRedqLAQJKJ6Y5XlnwIcWelirkHj/COwTTXhbPg==} dependencies: - '@storybook/channels': 6.4.22 - '@storybook/client-logger': 6.4.22 - core-js: 3.22.5 + '@storybook/channels': 6.5.10 + '@storybook/client-logger': 6.5.10 + core-js: 3.28.0 global: 4.4.0 - telejson: 5.3.3 + telejson: 6.0.8 dev: true - /@storybook/channels/6.4.22: - resolution: {integrity: sha512-cfR74tu7MLah1A8Rru5sak71I+kH2e/sY6gkpVmlvBj4hEmdZp4Puj9PTeaKcMXh9DgIDPNA5mb8yvQH6VcyxQ==} + /@storybook/channels@6.5.10: + resolution: {integrity: sha512-lo26YZ6kWpHXLhuHJF4P/bICY7jD/rXEZqReKtGOSk1Lv99/xvG6pqmcy3hWLf3v3Dy/8otjRPSR7izFVIIZgQ==} dependencies: - core-js: 3.22.5 + core-js: 3.28.0 ts-dedent: 2.2.0 util-deprecate: 1.0.2 dev: true - /@storybook/client-api/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==} + /@storybook/client-api@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3wBWZl3NvMFgMovgEh+euiARAT2FXzpvTF4Q1gerGMNNDlrGxHnFvSuy4FHg/irtOGLa4yLz43ULFbYtpKw0Lg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/channel-postmessage': 6.4.22 - '@storybook/channels': 6.4.22 - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/channel-postmessage': 6.5.10 + '@storybook/channels': 6.5.10 + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) '@types/qs': 6.9.7 - '@types/webpack-env': 1.16.4 - core-js: 3.22.5 + '@types/webpack-env': 1.18.0 + core-js: 3.28.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 memoizerific: 1.11.3 - qs: 6.10.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 - store2: 2.13.2 + qs: 6.11.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 + store2: 2.14.2 synchronous-promise: 2.0.15 ts-dedent: 2.2.0 util-deprecate: 1.0.2 dev: true - /@storybook/client-logger/6.4.22: - resolution: {integrity: sha512-LXhxh/lcDsdGnK8kimqfhu3C0+D2ylCSPPQNbU0IsLRmTfbpQYMdyl0XBjPdHiRVwlL7Gkw5OMjYemQgJ02zlw==} + /@storybook/client-logger@6.5.10: + resolution: {integrity: sha512-/xA0MHOevXev68hyLMQw8Qo8KczSIdXOxliAgrycMTkDmw5eKeA8TP7B8zP3wGuq/e3MrdD9/8MWhb/IQBNC3w==} dependencies: - core-js: 3.22.5 - global: 4.4.0 - dev: true - - /@storybook/components/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@popperjs/core': 2.11.5 - '@storybook/client-logger': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@types/color-convert': 2.0.0 - '@types/overlayscrollbars': 1.12.1 - '@types/react-syntax-highlighter': 11.0.5 - color-convert: 2.0.1 - core-js: 3.22.5 - fast-deep-equal: 3.1.3 + core-js: 3.28.0 global: 4.4.0 - lodash: 4.17.21 - markdown-to-jsx: 7.1.7_react@17.0.2 - memoizerific: 1.11.3 - overlayscrollbars: 1.13.1 - polished: 4.2.2 - prop-types: 15.8.1 - react: 17.0.2 - react-colorful: 5.5.1_sfoxds7t5ydpegc3knd667wn6m - react-dom: 17.0.2_react@17.0.2 - react-popper-tooltip: 3.1.1_sfoxds7t5ydpegc3knd667wn6m - react-syntax-highlighter: 13.5.3_react@17.0.2 - react-textarea-autosize: 8.3.3_react@17.0.2 - regenerator-runtime: 0.13.9 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' dev: true - /@storybook/core-client/6.4.22_femxfsv7ntf2nz4bpj36nj6mcm: - resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} + /@storybook/components@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9OhgB8YQfGwOKjo/N96N5mrtJ6qDVVoEM1zuhea32tJUd2eYf0aSWpryA9VnOM0V1q/8DAoCg5rPBMYWMBU5uw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - typescript: '*' - webpack: '*' - peerDependenciesMeta: - typescript: - optional: true + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/channel-postmessage': 6.4.22 - '@storybook/channel-websocket': 6.4.22 - '@storybook/client-api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/preview-web': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - airbnb-js-shims: 2.2.1 - ansi-to-html: 0.6.15 - core-js: 3.22.5 - global: 4.4.0 - lodash: 4.17.21 - qs: 6.10.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 - ts-dedent: 2.2.0 - typescript: 4.6.4 - unfetch: 4.2.0 + '@storybook/client-logger': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 + memoizerific: 1.11.3 + qs: 6.11.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 util-deprecate: 1.0.2 - webpack: 5.72.1 - transitivePeerDependencies: - - '@types/react' dev: true - /@storybook/core-client/6.4.22_zp5v2ubrswimphwncdb3wwfdyi: - resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} + /@storybook/core-client@6.5.10(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0): + resolution: {integrity: sha512-THsIjNrOrampTl0Lgfjvfjk1JnktKb4CQLOM80KpQb4cjDqorBjJmErzUkUQ2y3fXvrDmQ/kUREkShET4XEdtA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' - webpack: '*' + webpack: 5.75.0 peerDependenciesMeta: typescript: optional: true dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/channel-postmessage': 6.4.22 - '@storybook/channel-websocket': 6.4.22 - '@storybook/client-api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/preview-web': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.22_sfoxds7t5ydpegc3knd667wn6m + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/channel-postmessage': 6.5.10 + '@storybook/channel-websocket': 6.5.10 + '@storybook/client-api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/preview-web': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/ui': 6.5.10(react-dom@18.2.0)(react@18.2.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.22.5 + core-js: 3.28.0 global: 4.4.0 lodash: 4.17.21 - qs: 6.10.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 + qs: 6.11.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 - typescript: 4.6.4 + typescript: 4.9.4 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 4.46.0 - transitivePeerDependencies: - - '@types/react' + webpack: 5.75.0(esbuild@0.15.18) dev: true - /@storybook/core-common/6.4.22_oagctitnqx3g7idiuq5vrj5arm: - resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} + /@storybook/core-common@6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4): + resolution: {integrity: sha512-Bx+VKkfWdrAmD8T51Sjq/mMhRaiapBHcpG4cU5bc3DMbg+LF2/yrgqv/cjVu+m5gHAzYCac5D7gqzBgvG7Myww==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-decorators': 7.17.9_@babel+core@7.17.10 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.10 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.10 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.10 - '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.10 - '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.10 - '@babel/preset-env': 7.17.10_@babel+core@7.17.10 - '@babel/preset-react': 7.16.7_@babel+core@7.17.10 - '@babel/preset-typescript': 7.16.7_@babel+core@7.17.10 - '@babel/register': 7.17.7_@babel+core@7.17.10 - '@storybook/node-logger': 6.4.22 + '@babel/core': 7.21.0 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-decorators': 7.18.10(@babel/core@7.21.0) + '@babel/plugin-proposal-export-default-from': 7.18.10(@babel/core@7.21.0) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-transform-destructuring': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.21.0) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.0) + '@babel/preset-env': 7.20.2(@babel/core@7.21.0) + '@babel/preset-react': 7.18.6(@babel/core@7.21.0) + '@babel/preset-typescript': 7.21.0(@babel/core@7.21.0) + '@babel/register': 7.18.9(@babel/core@7.21.0) + '@storybook/node-logger': 6.5.10 '@storybook/semver': 7.3.2 - '@types/node': 14.18.17 + '@types/node': 18.11.9 '@types/pretty-hrtime': 1.0.1 - babel-loader: 8.2.5_usdhdj5awexcm2e5jtwd44bofa + babel-loader: 8.3.0(@babel/core@7.21.0)(webpack@5.75.0) babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.10 + babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.21.0) chalk: 4.1.2 - core-js: 3.22.5 - express: 4.18.1 - file-system-cache: 1.0.5 + core-js: 3.28.0 + express: 4.18.2 + file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.2_u7kjabuvawcog7hjctusduehvm + fork-ts-checker-webpack-plugin: 6.5.2(eslint@8.34.0)(typescript@4.9.4)(webpack@5.75.0) fs-extra: 9.1.0 - glob: 7.2.0 + glob: 7.2.3 handlebars: 4.7.7 interpret: 2.2.0 - json5: 2.2.1 + json5: 2.2.3 lazy-universal-dotenv: 3.0.1 picomatch: 2.3.1 pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) resolve-from: 5.0.0 slash: 3.0.0 - telejson: 5.3.3 + telejson: 6.0.8 ts-dedent: 2.2.0 - typescript: 4.6.4 + typescript: 4.9.4 util-deprecate: 1.0.2 - webpack: 4.46.0 + webpack: 5.75.0(esbuild@0.15.18) transitivePeerDependencies: + - '@swc/core' + - esbuild - eslint - supports-color + - uglify-js - vue-template-compiler - webpack-cli - - webpack-command dev: true - /@storybook/core-events/6.4.22: - resolution: {integrity: sha512-5GYY5+1gd58Gxjqex27RVaX6qbfIQmJxcbzbNpXGNSqwqAuIIepcV1rdCVm6I4C3Yb7/AQ3cN5dVbf33QxRIwA==} + /@storybook/core-events@6.5.10: + resolution: {integrity: sha512-EVb1gO1172klVIAABLOoigFMx0V88uctY0K/qVCO8n6v+wd2+0Ccn63kl+gTxsAC3WZ8XhXh9q2w5ImHklVECw==} dependencies: - core-js: 3.22.5 + core-js: 3.28.0 dev: true - /@storybook/core-server/6.4.22_oagctitnqx3g7idiuq5vrj5arm: - resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} + /@storybook/core-server@6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4): + resolution: {integrity: sha512-jqwpA0ccA8X5ck4esWBid04+cEIVqirdAcqJeNb9IZAD+bRreO4Im8ilzr7jc5AmQ9fkqHs2NByFKh9TITp8NQ==} peerDependencies: - '@storybook/builder-webpack5': 6.4.22 - '@storybook/manager-webpack5': 6.4.22 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + '@storybook/builder-webpack5': '*' + '@storybook/manager-webpack5': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: '@storybook/builder-webpack5': @@ -3846,426 +10802,477 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/core-client': 6.4.22_zp5v2ubrswimphwncdb3wwfdyi - '@storybook/core-common': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/csf-tools': 6.4.22 - '@storybook/manager-webpack4': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/node-logger': 6.4.22 + '@storybook/builder-webpack4': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/core-client': 6.5.10(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0) + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/csf-tools': 6.5.10 + '@storybook/manager-webpack4': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/node-logger': 6.5.10 '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@types/node': 14.18.17 - '@types/node-fetch': 2.6.1 + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/telemetry': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@types/node': 18.11.9 + '@types/node-fetch': 2.6.2 '@types/pretty-hrtime': 1.0.1 '@types/webpack': 4.41.32 better-opn: 2.1.1 boxen: 5.1.2 chalk: 4.1.2 - cli-table3: 0.6.2 + cli-table3: 0.6.3 commander: 6.2.1 compression: 1.7.4 - core-js: 3.22.5 + core-js: 3.28.0 cpy: 8.1.2 - detect-port: 1.3.0 - express: 4.18.1 - file-system-cache: 1.0.5 + detect-port: 1.5.1 + express: 4.18.2 fs-extra: 9.1.0 + global: 4.4.0 globby: 11.1.0 - ip: 1.1.8 + ip: 2.0.0 lodash: 4.17.21 - node-fetch: 2.6.7 + node-fetch: 2.6.9 + open: 8.4.2 pretty-hrtime: 1.0.3 prompts: 2.4.2 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 serve-favicon: 2.5.0 slash: 3.0.0 - telejson: 5.3.3 + telejson: 6.0.8 ts-dedent: 2.2.0 - typescript: 4.6.4 + typescript: 4.9.4 util-deprecate: 1.0.2 - watchpack: 2.3.1 - webpack: 4.46.0 - ws: 8.6.0 + watchpack: 2.4.0 + webpack: 5.75.0(esbuild@0.15.18) + ws: 8.13.0 + x-default-browser: 0.4.0 transitivePeerDependencies: - - '@types/react' + - '@storybook/mdx2-csf' + - '@swc/core' - bluebird - bufferutil - encoding + - esbuild - eslint - supports-color + - uglify-js - utf-8-validate - vue-template-compiler - webpack-cli - - webpack-command dev: true - /@storybook/core/6.4.22_femxfsv7ntf2nz4bpj36nj6mcm: - resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} + /@storybook/core@6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0): + resolution: {integrity: sha512-K86yYa0tYlMxADlwQTculYvPROokQau09SCVqpsLg3wJCTvYFL4+SIqcYoyBSbFmHOdnYbJgPydjN33MYLiOZQ==} peerDependencies: - '@storybook/builder-webpack5': 6.4.22 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + '@storybook/builder-webpack5': '*' + '@storybook/manager-webpack5': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' - webpack: '*' + webpack: 5.75.0 peerDependenciesMeta: '@storybook/builder-webpack5': optional: true + '@storybook/manager-webpack5': + optional: true typescript: optional: true dependencies: - '@storybook/core-client': 6.4.22_femxfsv7ntf2nz4bpj36nj6mcm - '@storybook/core-server': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - typescript: 4.6.4 - webpack: 5.72.1 + '@storybook/core-client': 6.5.10(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0) + '@storybook/core-server': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + typescript: 4.9.4 + webpack: 5.75.0(esbuild@0.15.18) transitivePeerDependencies: - - '@storybook/manager-webpack5' - - '@types/react' + - '@storybook/mdx2-csf' + - '@swc/core' - bluebird - bufferutil - encoding + - esbuild - eslint - supports-color + - uglify-js - utf-8-validate - vue-template-compiler - webpack-cli - - webpack-command dev: true - /@storybook/core/6.4.22_zp5v2ubrswimphwncdb3wwfdyi: - resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} + /@storybook/csf-tools@6.5.10: + resolution: {integrity: sha512-H77kZQEisu7+skzeIbNZwmE09OqLjwJTeFhLN1pcjxKVa30LEI3pBHcNBxVKqgxl+Yg3KkB7W/ArLO2N+i2ohw==} peerDependencies: - '@storybook/builder-webpack5': 6.4.22 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - typescript: '*' - webpack: '*' + '@storybook/mdx2-csf': ^0.0.3 peerDependenciesMeta: - '@storybook/builder-webpack5': - optional: true - typescript: + '@storybook/mdx2-csf': optional: true dependencies: - '@storybook/core-client': 6.4.22_zp5v2ubrswimphwncdb3wwfdyi - '@storybook/core-server': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - typescript: 4.6.4 - webpack: 4.46.0 + '@babel/core': 7.21.0 + '@babel/generator': 7.21.1 + '@babel/parser': 7.21.2 + '@babel/plugin-transform-react-jsx': 7.18.10(@babel/core@7.21.0) + '@babel/preset-env': 7.20.2(@babel/core@7.21.0) + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/mdx1-csf': 0.0.1(@babel/core@7.21.0) + core-js: 3.28.0 + fs-extra: 9.1.0 + global: 4.4.0 + regenerator-runtime: 0.13.11 + ts-dedent: 2.2.0 transitivePeerDependencies: - - '@storybook/manager-webpack5' - - '@types/react' - - bluebird - - bufferutil - - encoding - - eslint - supports-color - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-command dev: true - /@storybook/csf-tools/6.4.22: - resolution: {integrity: sha512-LMu8MZAiQspJAtMBLU2zitsIkqQv7jOwX7ih5JrXlyaDticH7l2j6Q+1mCZNWUOiMTizj0ivulmUsSaYbpToSw==} + /@storybook/csf@0.0.2--canary.4566f4d.1: + resolution: {integrity: sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==} dependencies: - '@babel/core': 7.17.10 - '@babel/generator': 7.17.10 - '@babel/parser': 7.17.10 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.10 - '@babel/preset-env': 7.17.10_@babel+core@7.17.10 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 - '@mdx-js/mdx': 1.6.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - core-js: 3.22.5 - fs-extra: 9.1.0 - global: 4.4.0 - js-string-escape: 1.0.1 lodash: 4.17.21 - prettier: 2.3.0 - regenerator-runtime: 0.13.9 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - supports-color dev: true - /@storybook/csf/0.0.2--canary.87bc651.0: - resolution: {integrity: sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw==} + /@storybook/docs-tools@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/bvYgOO+CxMEcHifkjJg0A60OTGOhcjGxnsB1h0gJuxMrqA/7Qwc108bFmPiX0eiD1BovFkZLJV4O6OY7zP5Vw==} dependencies: + '@babel/core': 7.21.0 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 + doctrine: 3.0.0 lodash: 4.17.21 + regenerator-runtime: 0.13.11 + transitivePeerDependencies: + - react + - react-dom + - supports-color dev: true - /@storybook/instrumenter/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-lPIdS24nZy6Bi733ECAGFKgZV4tkR2jNlJhV1iFwByiH8fBjwRNZYZQXKR7mbvQIt6/P7Yr90Ab38yiDh/22Ow==} + /@storybook/instrumenter@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3yKJW68wTnGYEts2mJQG6M7ZE+fe54fuy5lBBzRtvWnC15uWTxuaiFp2kxH5b+stSCi4m71ws45RNiEafdBgEQ==} dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + core-js: 3.28.0 global: 4.4.0 transitivePeerDependencies: - react - react-dom dev: true - /@storybook/manager-webpack4/6.4.22_oagctitnqx3g7idiuq5vrj5arm: - resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} + /@storybook/manager-webpack4@6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4): + resolution: {integrity: sha512-N/TlNDhuhARuFipR/ZJ/xEVESz23iIbCsZ4VNehLHm8PpiGlQUehk+jMjWmz5XV0bJItwjRclY+CU3GjZKblfQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.10 - '@babel/preset-react': 7.16.7_@babel+core@7.17.10 - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-client': 6.4.22_zp5v2ubrswimphwncdb3wwfdyi - '@storybook/core-common': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/node-logger': 6.4.22 - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@types/node': 14.18.17 + '@babel/core': 7.21.0 + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.0) + '@babel/preset-react': 7.18.6(@babel/core@7.21.0) + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-client': 6.5.10(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0) + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/node-logger': 6.5.10 + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/ui': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@types/node': 18.11.9 '@types/webpack': 4.41.32 - babel-loader: 8.2.5_usdhdj5awexcm2e5jtwd44bofa + babel-loader: 8.3.0(@babel/core@7.21.0)(webpack@5.75.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.22.5 - css-loader: 3.6.0_webpack@4.46.0 - express: 4.18.1 - file-loader: 6.2.0_webpack@4.46.0 - file-system-cache: 1.0.5 + core-js: 3.28.0 + css-loader: 3.6.0(webpack@5.75.0) + express: 4.18.2 + file-loader: 6.2.0(webpack@5.75.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2_webpack@4.46.0 - node-fetch: 2.6.7 - pnp-webpack-plugin: 1.6.4_typescript@4.6.4 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + html-webpack-plugin: 4.5.2(webpack@5.75.0) + node-fetch: 2.6.9 + pnp-webpack-plugin: 1.6.4(typescript@4.9.4) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) read-pkg-up: 7.0.1 - regenerator-runtime: 0.13.9 + regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0_webpack@4.46.0 - telejson: 5.3.3 - terser-webpack-plugin: 4.2.3_webpack@4.46.0 + style-loader: 1.3.0(webpack@5.75.0) + telejson: 6.0.8 + terser-webpack-plugin: 4.2.3(webpack@5.75.0) ts-dedent: 2.2.0 - typescript: 4.6.4 - url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy + typescript: 4.9.4 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.75.0) util-deprecate: 1.0.2 - webpack: 4.46.0 - webpack-dev-middleware: 3.7.3_webpack@4.46.0 + webpack: 5.75.0(esbuild@0.15.18) + webpack-dev-middleware: 3.7.3(webpack@5.75.0) webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - - '@types/react' + - '@swc/core' - bluebird - encoding + - esbuild - eslint - supports-color + - uglify-js - vue-template-compiler - webpack-cli - - webpack-command dev: true - /@storybook/node-logger/6.4.22: - resolution: {integrity: sha512-sUXYFqPxiqM7gGH7gBXvO89YEO42nA4gBicJKZjj9e+W4QQLrftjF9l+mAw2K0mVE10Bn7r4pfs5oEZ0aruyyA==} + /@storybook/mdx1-csf@0.0.1(@babel/core@7.18.13): + resolution: {integrity: sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==} + dependencies: + '@babel/generator': 7.21.1 + '@babel/parser': 7.21.2 + '@babel/preset-env': 7.20.2(@babel/core@7.18.13) + '@babel/types': 7.21.2 + '@mdx-js/mdx': 1.6.22 + '@types/lodash': 4.14.196 + js-string-escape: 1.0.1 + loader-utils: 2.0.4 + lodash: 4.17.21 + prettier: 2.3.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true + + /@storybook/mdx1-csf@0.0.1(@babel/core@7.21.0): + resolution: {integrity: sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==} + dependencies: + '@babel/generator': 7.21.1 + '@babel/parser': 7.21.2 + '@babel/preset-env': 7.20.2(@babel/core@7.21.0) + '@babel/types': 7.21.2 + '@mdx-js/mdx': 1.6.22 + '@types/lodash': 4.14.196 + js-string-escape: 1.0.1 + loader-utils: 2.0.4 + lodash: 4.17.21 + prettier: 2.3.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true + + /@storybook/node-logger@6.5.10: + resolution: {integrity: sha512-bYswXIKV7Stru8vYfkjUMNN8UhF7Qg7NRsUvG5Djt5lLIae1XmUIgnH40mU/nW4X4BSfcR9MKxsSsngvn2WmQg==} dependencies: '@types/npmlog': 4.1.4 chalk: 4.1.2 - core-js: 3.22.5 + core-js: 3.28.0 npmlog: 5.0.1 pretty-hrtime: 1.0.3 dev: true - /@storybook/postinstall/6.4.22: - resolution: {integrity: sha512-LdIvA+l70Mp5FSkawOC16uKocefc+MZLYRHqjTjgr7anubdi6y7W4n9A7/Yw4IstZHoknfL88qDj/uK5N+Ahzw==} + /@storybook/postinstall@6.5.10: + resolution: {integrity: sha512-xqUdpnFHYkn8MgtV+QztvIsRWa6jQUk7QT1Mu17Y0S7PbslNGsuskRPHenHhACXBJF+TM86R+4BaAhnVYTmElw==} dependencies: - core-js: 3.22.5 + core-js: 3.28.0 dev: true - /@storybook/preview-web/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==} + /@storybook/preview-web@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sTC/o5gkvALOtcNgtApGKGN9EavvSxRHBeBh+5BQjV2qQ8ap+26RsfUizNBECAa2Jrn4osaDYn9HRhJLFL69WA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/channel-postmessage': 6.4.22 - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/channel-postmessage': 6.5.10 + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) ansi-to-html: 0.6.15 - core-js: 3.22.5 + core-js: 3.28.0 global: 4.4.0 lodash: 4.17.21 - qs: 6.10.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 + qs: 6.11.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 synchronous-promise: 2.0.15 ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 dev: true - /@storybook/react-docgen-typescript-plugin/1.0.2-canary.253f8c1.0_u7kjabuvawcog7hjctusduehvm: - resolution: {integrity: sha512-mmoRG/rNzAiTbh+vGP8d57dfcR2aP+5/Ll03KKFyfy5FqWFm/Gh7u27ikx1I3LmVMI8n6jh5SdWMkMKon7/tDw==} + /@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.4)(webpack@5.75.0): + resolution: {integrity: sha512-eVg3BxlOm2P+chijHBTByr90IZVUtgRW56qEOLX7xlww2NBuKrcavBlcmn+HH7GIUktquWkMPtvy6e0W0NgA5w==} peerDependencies: - typescript: '>= 3.x' - webpack: '>= 4' + typescript: 4.9.4 + webpack: 5.75.0 dependencies: - debug: 4.3.3 + debug: 4.3.4(supports-color@9.2.2) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.0.4 micromatch: 4.0.5 - react-docgen-typescript: 2.2.2_typescript@4.6.4 - tslib: 2.4.0 - typescript: 4.6.4 - webpack: 4.46.0 + react-docgen-typescript: 2.2.2(typescript@4.9.4) + tslib: 2.5.0 + typescript: 4.9.4 + webpack: 5.75.0(esbuild@0.15.18) transitivePeerDependencies: - supports-color dev: true - /@storybook/react/6.4.22_utlndcjoixapem4pxrt4hkdn44: - resolution: {integrity: sha512-5BFxtiguOcePS5Ty/UoH7C6odmvBYIZutfiy4R3Ua6FYmtxac5vP9r5KjCz1IzZKT8mCf4X+PuK1YvDrPPROgQ==} + /@storybook/react@6.5.10(@babel/core@7.18.13)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(require-from-string@2.0.2)(typescript@4.9.4): + resolution: {integrity: sha512-m8S1qQrwA7pDGwdKEvL6LV3YKvSzVUY297Fq+xcTU3irnAy4sHDuFoLqV6Mi1510mErK1r8+rf+0R5rEXB219g==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: '@babel/core': ^7.11.5 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + '@storybook/builder-webpack4': '*' + '@storybook/builder-webpack5': '*' + '@storybook/manager-webpack4': '*' + '@storybook/manager-webpack5': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + require-from-string: ^2.0.2 typescript: '*' peerDependenciesMeta: '@babel/core': optional: true + '@storybook/builder-webpack4': + optional: true + '@storybook/builder-webpack5': + optional: true + '@storybook/manager-webpack4': + optional: true + '@storybook/manager-webpack5': + optional: true typescript: optional: true dependencies: - '@babel/core': 7.17.10 - '@babel/preset-flow': 7.16.7_@babel+core@7.17.10 - '@babel/preset-react': 7.16.7_@babel+core@7.17.10 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.6_a3gyllrqvxpec3fpybsrposvju - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core': 6.4.22_zp5v2ubrswimphwncdb3wwfdyi - '@storybook/core-common': 6.4.22_oagctitnqx3g7idiuq5vrj5arm - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/node-logger': 6.4.22 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.253f8c1.0_u7kjabuvawcog7hjctusduehvm + '@babel/core': 7.18.13 + '@babel/preset-flow': 7.18.6(@babel/core@7.18.13) + '@babel/preset-react': 7.18.6(@babel/core@7.18.13) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.7(react-refresh@0.11.0)(webpack@5.75.0) + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/core': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4)(webpack@5.75.0) + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + '@storybook/csf': 0.0.2--canary.4566f4d.1 + '@storybook/docs-tools': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 6.5.10 + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.4)(webpack@5.75.0) '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@types/webpack-env': 1.16.4 + '@storybook/store': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@types/estree': 0.0.51 + '@types/node': 18.11.9 + '@types/webpack-env': 1.18.0 + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 - babel-plugin-named-asset-import: 0.3.8_@babel+core@7.17.10 babel-plugin-react-docgen: 4.2.1 - core-js: 3.22.5 + core-js: 3.25.0 + escodegen: 2.0.0 + fs-extra: 9.1.0 global: 4.4.0 + html-tags: 3.2.0 lodash: 4.17.21 - prop-types: 15.8.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-element-to-jsx-string: 14.3.4(react-dom@18.2.0)(react@18.2.0) react-refresh: 0.11.0 read-pkg-up: 7.0.1 regenerator-runtime: 0.13.9 + require-from-string: 2.0.2 ts-dedent: 2.2.0 - typescript: 4.6.4 - webpack: 4.46.0 + typescript: 4.9.4 + util-deprecate: 1.0.2 + webpack: 5.75.0(esbuild@0.15.18) transitivePeerDependencies: - - '@storybook/builder-webpack5' - - '@storybook/manager-webpack5' - - '@types/react' + - '@storybook/mdx2-csf' + - '@swc/core' - '@types/webpack' - bluebird - bufferutil - encoding + - esbuild - eslint - sockjs-client - supports-color - type-fest + - uglify-js - utf-8-validate - vue-template-compiler - webpack-cli - - webpack-command - webpack-dev-server - webpack-hot-middleware - webpack-plugin-serve dev: true - /@storybook/router/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==} + /@storybook/router@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-O+vNW/eEpYFF8eCg5jZjNQ6q2DKQVxqDRPCy9pJdEbvavMDZn6AFYgVK+VJe5F4211WW2yncOu922xObCxXJYg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/client-logger': 6.4.22 - core-js: 3.22.5 - fast-deep-equal: 3.1.3 - global: 4.4.0 - history: 5.0.0 - lodash: 4.17.21 + '@storybook/client-logger': 6.5.10 + core-js: 3.28.0 memoizerific: 1.11.3 - qs: 6.10.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-router: 6.3.0_react@17.0.2 - react-router-dom: 6.3.0_sfoxds7t5ydpegc3knd667wn6m - ts-dedent: 2.2.0 + qs: 6.11.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 dev: true - /@storybook/semver/7.3.2: + /@storybook/semver@7.3.2: resolution: {integrity: sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==} engines: {node: '>=10'} hasBin: true dependencies: - core-js: 3.22.5 + core-js: 3.28.0 find-up: 4.1.0 dev: true - /@storybook/source-loader/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-O4RxqPgRyOgAhssS6q1Rtc8LiOvPBpC1EqhCYWRV3K+D2EjFarfQMpjgPj18hC+QzpUSfzoBZYqsMECewEuLNw==} + /@storybook/source-loader@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1RxxRumpjs8VUUwES9LId+cuNQnixhZAcwCxd6jaKkTZbjiQCtAhXX6DBTjJGV1u/JnCsqEp5b1wB8j/EioNHw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - core-js: 3.22.5 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + core-js: 3.28.0 estraverse: 5.3.0 global: 4.4.0 - loader-utils: 2.0.2 + loader-utils: 2.0.4 lodash: 4.17.21 prettier: 2.3.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 dev: true - /@storybook/store/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==} + /@storybook/store@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-RswrSYh2IiKkytFPxP9AvP+hekjrvHK2ILvyDk2ZgduCN4n5ivsekOb+N3M2t+dq1eLuW9or5n2T4OWwAwjxxQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/client-logger': 6.4.22 - '@storybook/core-events': 6.4.22 - '@storybook/csf': 0.0.2--canary.87bc651.0 - core-js: 3.22.5 + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 6.5.10 + '@storybook/core-events': 6.5.10 + '@storybook/csf': 0.0.2--canary.4566f4d.1 + core-js: 3.28.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 memoizerific: 1.11.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - regenerator-runtime: 0.13.9 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 slash: 3.0.0 stable: 0.1.8 synchronous-promise: 2.0.15 @@ -4273,171 +11280,577 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/testing-library/0.0.11_sfoxds7t5ydpegc3knd667wn6m: + /@storybook/telemetry@6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4): + resolution: {integrity: sha512-+M5HILDFS8nDumLxeSeAwi1MTzIuV6UWzV4yB2wcsEXOBTdplcl9oYqFKtlst78oOIdGtpPYxYfivDlqxC2K4g==} + dependencies: + '@storybook/client-logger': 6.5.10 + '@storybook/core-common': 6.5.10(esbuild@0.15.18)(eslint@8.34.0)(react-dom@18.2.0)(react@18.2.0)(typescript@4.9.4) + chalk: 4.1.2 + core-js: 3.28.0 + detect-package-manager: 2.0.1 + fetch-retry: 5.0.3 + fs-extra: 9.1.0 + global: 4.4.0 + isomorphic-unfetch: 3.1.0 + nanoid: 3.3.6 + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.11 + transitivePeerDependencies: + - '@swc/core' + - encoding + - esbuild + - eslint + - react + - react-dom + - supports-color + - typescript + - uglify-js + - vue-template-compiler + - webpack-cli + dev: true + + /@storybook/testing-library@0.0.11(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-8KbKx3s1e+uF3oWlPdyXRpZa6xtCsCHtXh1nCTisMA6P5YcSDaCg59NXIOVIQCAwKvjRomlqMJH8JL1WyOzeVg==} dependencies: - '@storybook/client-logger': 6.4.22 - '@storybook/instrumenter': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@testing-library/dom': 8.13.0 - '@testing-library/user-event': 13.5.0_tlwynutqiyp5mns3woioasuxnq + '@storybook/client-logger': 6.5.10 + '@storybook/instrumenter': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@testing-library/dom': 8.17.1 + '@testing-library/user-event': 13.5.0(@testing-library/dom@8.17.1) ts-dedent: 2.2.0 transitivePeerDependencies: - react - react-dom dev: true - /@storybook/theming/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==} + /@storybook/theming@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BvTQBBcSEwKKcsVmF+Ol6v0RIQUr+bxP7gb10wtfBd23mZTEFA0C1N5FnZr/dDeiBKG1pvf1UKvoYA731y0BsA==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@emotion/core': 10.3.1_react@17.0.2 - '@emotion/is-prop-valid': 0.8.8 - '@emotion/styled': 10.3.0_gfrer23gq2rp2t523t6qbxrx6m - '@storybook/client-logger': 6.4.22 - core-js: 3.22.5 - deep-object-diff: 1.1.7 - emotion-theming: 10.3.0_gfrer23gq2rp2t523t6qbxrx6m - global: 4.4.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/client-logger': 6.5.10 + core-js: 3.28.0 memoizerific: 1.11.3 - polished: 4.2.2 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - resolve-from: 5.0.0 - ts-dedent: 2.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 dev: true - /@storybook/ui/6.4.22_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==} + /@storybook/ui@6.5.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6iaoaRAiTqB1inTw35vao+5hjcDE0Qa0A3a9ZIeNa6yHvpB1k0lO/N/0PMrRdVvySYpXVD1iry4z4QYdo1rU+w==} peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@emotion/core': 10.3.1_react@17.0.2 - '@storybook/addons': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/api': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/channels': 6.4.22 - '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-events': 6.4.22 - '@storybook/router': 6.4.22_sfoxds7t5ydpegc3knd667wn6m + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/addons': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/api': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/channels': 6.5.10 + '@storybook/client-logger': 6.5.10 + '@storybook/components': 6.5.10(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 6.5.10 + '@storybook/router': 6.5.10(react-dom@18.2.0)(react@18.2.0) '@storybook/semver': 7.3.2 - '@storybook/theming': 6.4.22_sfoxds7t5ydpegc3knd667wn6m - copy-to-clipboard: 3.3.1 - core-js: 3.22.5 - core-js-pure: 3.22.5 - downshift: 6.1.7_react@17.0.2 - emotion-theming: 10.3.0_gfrer23gq2rp2t523t6qbxrx6m - fuse.js: 3.6.1 - global: 4.4.0 - lodash: 4.17.21 - markdown-to-jsx: 7.1.7_react@17.0.2 + '@storybook/theming': 6.5.10(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 memoizerific: 1.11.3 - polished: 4.2.2 - qs: 6.10.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-draggable: 4.4.5_sfoxds7t5ydpegc3knd667wn6m - react-helmet-async: 1.3.0_sfoxds7t5ydpegc3knd667wn6m - react-sizeme: 3.0.2 - regenerator-runtime: 0.13.9 + qs: 6.11.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - store2: 2.13.2 - transitivePeerDependencies: - - '@types/react' dev: true - /@surma/rollup-plugin-off-main-thread/2.2.3: + /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: - ejs: 3.1.8 - json5: 2.2.1 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.7 - dev: true + ejs: 3.1.8 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.8 + dev: true + + /@svgmoji/blob@3.2.0: + resolution: {integrity: sha512-N96WOrH9GxPSPZ/FuvZl6T9Rh54stAEuUcBppIRFh9/WwkU7Hczrjabw4uunwxFLX5TgR+rHlKJl3/jaTnXJrQ==} + dependencies: + '@babel/runtime': 7.21.0 + '@svgmoji/core': 3.2.0 + dev: false + + /@svgmoji/core@3.2.0: + resolution: {integrity: sha512-QsD78Op3S/5kUVsa5ierr4Wu/xwAdYuMI3Zmc/Y2ekYBEMGEUY8QxilXQRSAQ4ku4PnNV4xlB9e7xhD5hy113A==} + dependencies: + '@babel/runtime': 7.21.0 + emojibase: 5.2.0 + emojibase-regex: 5.1.3 + idb-keyval: 5.1.5 + match-sorter: 6.3.1 + type-fest: 1.4.0 + dev: false + + /@svgmoji/noto@3.2.0: + resolution: {integrity: sha512-JgtNciB06hMDI1Pb1N2IgLh44XRMZUUNwBANzjY5jXTPqOCu1A1VA35ENvUsRhEUZOm8I+hbdAEHkwMVqxLeIQ==} + dependencies: + '@babel/runtime': 7.21.0 + '@svgmoji/core': 3.2.0 + dev: false + + /@svgmoji/openmoji@3.2.0: + resolution: {integrity: sha512-USHbG+O80HfmdoNAHbOnlO+2gppXJfHFWKSRFj53Th4aimWEx4/9MB3cFbC3KZ1NOqXaLBq9jDaw4vFuGDVTUQ==} + dependencies: + '@babel/runtime': 7.21.0 + '@svgmoji/core': 3.2.0 + dev: false + + /@svgmoji/twemoji@3.2.0: + resolution: {integrity: sha512-6xqZgh9viFDKf5wvrxw56ImCR3Ni84IqwK45lxojOe1Gc1Mni1GpPfr4gb7WHDKjumfx+K7BHSvX0KXt3Nr3CQ==} + dependencies: + '@babel/runtime': 7.21.0 + '@svgmoji/core': 3.2.0 + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@5.4.0: + resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} + engines: {node: '>=10'} + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.21.0): + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + dev: false + + /@svgr/babel-plugin-remove-jsx-attribute@5.4.0: + resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} + engines: {node: '>=10'} + dev: false + + /@svgr/babel-plugin-remove-jsx-attribute@6.5.0(@babel/core@7.21.0): + resolution: {integrity: sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + dev: false + + /@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1: + resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} + engines: {node: '>=10'} + dev: false + + /@svgr/babel-plugin-remove-jsx-empty-expression@6.5.0(@babel/core@7.21.0): + resolution: {integrity: sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + dev: false + + /@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1: + resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} + engines: {node: '>=10'} + dev: false + + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.21.0): + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + dev: false + + /@svgr/babel-plugin-svg-dynamic-title@5.4.0: + resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} + engines: {node: '>=10'} + dev: false + + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.21.0): + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + dev: false + + /@svgr/babel-plugin-svg-em-dimensions@5.4.0: + resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} + engines: {node: '>=10'} + dev: false + + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.21.0): + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + dev: false + + /@svgr/babel-plugin-transform-react-native-svg@5.4.0: + resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} + engines: {node: '>=10'} + dev: false + + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.21.0): + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + dev: false + + /@svgr/babel-plugin-transform-svg-component@5.5.0: + resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} + engines: {node: '>=10'} + dev: false + + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.21.0): + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + dev: false + + /@svgr/babel-preset@5.5.0: + resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} + engines: {node: '>=10'} + dependencies: + '@svgr/babel-plugin-add-jsx-attribute': 5.4.0 + '@svgr/babel-plugin-remove-jsx-attribute': 5.4.0 + '@svgr/babel-plugin-remove-jsx-empty-expression': 5.0.1 + '@svgr/babel-plugin-replace-jsx-attribute-value': 5.0.1 + '@svgr/babel-plugin-svg-dynamic-title': 5.4.0 + '@svgr/babel-plugin-svg-em-dimensions': 5.4.0 + '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 + '@svgr/babel-plugin-transform-svg-component': 5.5.0 + dev: false + + /@svgr/babel-preset@6.5.1(@babel/core@7.21.0): + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.21.0) + '@svgr/babel-plugin-remove-jsx-attribute': 6.5.0(@babel/core@7.21.0) + '@svgr/babel-plugin-remove-jsx-empty-expression': 6.5.0(@babel/core@7.21.0) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.21.0) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.21.0) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.21.0) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.21.0) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.21.0) + dev: false + + /@svgr/core@5.5.0: + resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} + engines: {node: '>=10'} + dependencies: + '@svgr/plugin-jsx': 5.5.0 + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/core@6.5.1: + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.21.0 + '@svgr/babel-preset': 6.5.1(@babel/core@7.21.0) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/hast-util-to-babel-ast@5.5.0: + resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.21.2 + dev: false + + /@svgr/hast-util-to-babel-ast@6.5.1: + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.21.2 + entities: 4.4.0 + dev: false + + /@svgr/plugin-jsx@5.5.0: + resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.21.0 + '@svgr/babel-preset': 5.5.0 + '@svgr/hast-util-to-babel-ast': 5.5.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + dependencies: + '@babel/core': 7.21.0 + '@svgr/babel-preset': 6.5.1(@babel/core@7.21.0) + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/plugin-svgo@5.5.0: + resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} + engines: {node: '>=10'} + dependencies: + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 1.3.2 + dev: false + + /@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 6.5.1 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 2.8.0 + dev: false + + /@svgr/webpack@5.5.0: + resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.21.0 + '@babel/plugin-transform-react-constant-elements': 7.20.2(@babel/core@7.21.0) + '@babel/preset-env': 7.20.2(@babel/core@7.21.0) + '@babel/preset-react': 7.18.6(@babel/core@7.21.0) + '@svgr/core': 5.5.0 + '@svgr/plugin-jsx': 5.5.0 + '@svgr/plugin-svgo': 5.5.0 + loader-utils: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/webpack@6.5.1: + resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.21.0 + '@babel/plugin-transform-react-constant-elements': 7.20.2(@babel/core@7.21.0) + '@babel/preset-env': 7.20.2(@babel/core@7.21.0) + '@babel/preset-react': 7.18.6(@babel/core@7.21.0) + '@babel/preset-typescript': 7.21.0(@babel/core@7.21.0) + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) + transitivePeerDependencies: + - supports-color + dev: false + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + + /@tanstack/match-sorter-utils@8.7.6: + resolution: {integrity: sha512-2AMpRiA6QivHOUiBpQAVxjiHAA68Ei23ZUMNaRJrN6omWiSFLoYrxGcT6BXtuzp0Jw4h6HZCmGGIM/gbwebO2A==} + engines: {node: '>=12'} + dependencies: + remove-accents: 0.4.2 + dev: false + + /@tanstack/query-async-storage-persister@4.32.6: + resolution: {integrity: sha512-wfuLBfsRi9fT5iKnwCc3HSyCArvQpKTjKeIskzn4n8Dp2wJj3vsI3GCyJJ+nk9evfX345+jaueBo3dPDXMd8Rg==} + dependencies: + '@tanstack/query-persist-client-core': 4.32.6 + dev: false + + /@tanstack/query-core@4.32.6: + resolution: {integrity: sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA==} + dev: false + + /@tanstack/query-core@4.33.0: + resolution: {integrity: sha512-qYu73ptvnzRh6se2nyBIDHGBQvPY1XXl3yR769B7B6mIDD7s+EZhdlWHQ67JI6UOTFRaI7wupnTnwJ3gE0Mr/g==} + dev: false + + /@tanstack/query-persist-client-core@4.32.6: + resolution: {integrity: sha512-MJJ7CldvT5HOel50h/3wOZZwVlIcroFD5Vxn8vPsfo2C0qQ208ilmN/81JWutm/lWy4n2BjnCrrWv6HvVI7S0w==} + dependencies: + '@tanstack/query-core': 4.32.6 + dev: false + + /@tanstack/query-persist-client-core@4.33.0: + resolution: {integrity: sha512-3P16+2JjcUU5CHi10jJuwd0ZQYvQtSuzLvCUCjVuAnj3GZjfSso1v8t6WAObAr9RPuIC6vDXeOQ3mr07EF/NxQ==} + dependencies: + '@tanstack/query-core': 4.33.0 + dev: false + + /@tanstack/react-query-devtools@4.33.0(@tanstack/react-query@4.33.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6gegkuDmOoiY5e6ZKj1id48vlCXchjfE/6tIpYO8dFlVMQ7t1bYna/Ce6qQJ69+kfEHbYiTTn2lj+FDjIBH7Hg==} + peerDependencies: + '@tanstack/react-query': 4.33.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/match-sorter-utils': 8.7.6 + '@tanstack/react-query': 4.33.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + superjson: 1.12.2 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /@tanstack/react-query-persist-client@4.33.0(@tanstack/react-query@4.33.0): + resolution: {integrity: sha512-B3q0r1tqTTSkd9vctyqFj28xdGZJ+Dnr/7H05Ta1JF1w7EauVQl8ILrmXADecwvILnr1xoZO6lvi2W+mZxMinw==} + peerDependencies: + '@tanstack/react-query': 4.33.0 + dependencies: + '@tanstack/query-persist-client-core': 4.33.0 + '@tanstack/react-query': 4.33.0(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@tanstack/react-query@4.33.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-97nGbmDK0/m0B86BdiXzx3EW9RcDYKpnyL2+WwyuLHEgpfThYAnXFaMMmnTDuAO4bQJXEhflumIEUfKmP7ESGA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.33.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false - /@testing-library/dom/8.13.0: - resolution: {integrity: sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==} + /@testing-library/dom@8.17.1: + resolution: {integrity: sha512-KnH2MnJUzmFNPW6RIKfd+zf2Wue8mEKX0M3cpX6aKl5ZXrJM1/c/Pc8c2xDNYQCnJO48Sm5ITbMXgqTr3h4jxQ==} engines: {node: '>=12'} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/runtime': 7.17.9 + '@babel/code-frame': 7.18.6 + '@babel/runtime': 7.21.0 '@types/aria-query': 4.2.2 - aria-query: 5.0.0 + aria-query: 5.0.2 chalk: 4.1.2 dom-accessibility-api: 0.5.14 lz-string: 1.4.4 pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom/5.16.4: - resolution: {integrity: sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==} + /@testing-library/dom@8.20.0: + resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==} + engines: {node: '>=12'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/runtime': 7.21.0 + '@types/aria-query': 5.0.1 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.4.4 + pretty-format: 27.5.1 + dev: true + + /@testing-library/jest-dom@5.16.5: + resolution: {integrity: sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} dependencies: - '@babel/runtime': 7.17.9 - '@types/testing-library__jest-dom': 5.14.3 - aria-query: 5.0.0 + '@adobe/css-tools': 4.2.0 + '@babel/runtime': 7.21.0 + '@types/testing-library__jest-dom': 5.14.5 + aria-query: 5.1.3 chalk: 3.0.0 - css: 3.0.0 css.escape: 1.5.1 - dom-accessibility-api: 0.5.14 + dom-accessibility-api: 0.5.16 lodash: 4.17.21 redent: 3.0.0 dev: true - /@testing-library/react-hooks/7.0.2_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==} + /@testing-library/react-hooks@8.0.1(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} engines: {node: '>=12'} peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - react-test-renderer: '>=16.9.0' + '@types/react': 18.0.20 + react: ^16.9.0 || ^17.0.0 + react-dom: ^16.9.0 || ^17.0.0 + react-test-renderer: ^16.9.0 || ^17.0.0 peerDependenciesMeta: + '@types/react': + optional: true react-dom: optional: true react-test-renderer: optional: true dependencies: - '@babel/runtime': 7.17.9 - '@types/react': 17.0.44 - '@types/react-dom': 17.0.16 - '@types/react-test-renderer': 18.0.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-error-boundary: 3.1.4_react@17.0.2 + '@babel/runtime': 7.21.0 + '@types/react': 18.0.20 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-error-boundary: 3.1.4(react@18.2.0) dev: true - /@testing-library/react/12.1.5_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==} + /@testing-library/react@13.4.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} engines: {node: '>=12'} peerDependencies: - react: <18.0.0 - react-dom: <18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.17.9 - '@testing-library/dom': 8.13.0 - '@types/react-dom': 17.0.16 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + '@testing-library/dom': 8.20.0 + '@types/react-dom': 18.0.11 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event/13.5.0_tlwynutqiyp5mns3woioasuxnq: + /@testing-library/user-event@13.5.0(@testing-library/dom@8.17.1): resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} engines: {node: '>=10', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@babel/runtime': 7.17.9 - '@testing-library/dom': 8.13.0 + '@babel/runtime': 7.21.0 + '@testing-library/dom': 8.17.1 + dev: true + + /@tokenizer/token@0.3.0: + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} dev: true - /@tootallnate/once/1.1.2: + /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} dev: true - /@trpgengine/react-native-storage/1.0.1: + /@trpgengine/react-native-storage@1.0.1: resolution: {integrity: sha512-w5/L9PcJd3lgw2fSAiv3hkZWESvVUGkbnAzC4UgkMsm8r/IFGVMelz3DhldSVK3k/UqLWjVxhOnqu0vBTyqONA==} requiresBuild: true dependencies: @@ -4445,97 +11858,188 @@ packages: opencollective-postinstall: 2.0.3 dev: false - /@tsconfig/node10/1.0.8: - resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + /@ts-morph/common@0.17.0: + resolution: {integrity: sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==} + dependencies: + fast-glob: 3.2.12 + minimatch: 5.1.6 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + dev: false + + /@tsconfig/docusaurus@1.0.6: + resolution: {integrity: sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==} + dev: true + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - /@tsconfig/node12/1.0.9: - resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - /@tsconfig/node14/1.0.1: - resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + /@tsconfig/node16@1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + + /@typegoose/typegoose@9.3.1(mongoose@6.1.1): + resolution: {integrity: sha512-sdH1lpqZRIQYioffUq/EMhZlZsTP+8SNhmEaoULiFsRd0Go0QxuiUzy1DFHHMA8+k8h2XDIs1EGzqChih91jhw==} + engines: {node: '>=12.22.0'} + peerDependencies: + mongoose: 6.1.1 + dependencies: + lodash: 4.17.21 + loglevel: 1.8.0 + mongoose: 6.1.1 + reflect-metadata: 0.1.13 + semver: 7.5.4 + tslib: 2.5.0 + dev: false - /@tsconfig/node16/1.0.2: - resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + /@types/accepts@1.3.5: + resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} + dependencies: + '@types/node': 18.11.9 + dev: true - /@types/aria-query/4.2.2: + /@types/aria-query@4.2.2: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true - /@types/babel__core/7.1.19: - resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} + /@types/aria-query@5.0.1: + resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} + dev: true + + /@types/babel__core@7.20.0: + resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.17.10 - '@babel/types': 7.17.10 + '@babel/parser': 7.21.2 + '@babel/types': 7.21.2 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.17.1 + '@types/babel__traverse': 7.18.3 dev: true - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.17.10 + '@babel/types': 7.21.2 dev: true - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.17.10 - '@babel/types': 7.17.10 + '@babel/parser': 7.21.2 + '@babel/types': 7.21.2 dev: true - /@types/babel__traverse/7.17.1: - resolution: {integrity: sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==} + /@types/babel__traverse@7.18.3: + resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: - '@babel/types': 7.17.10 + '@babel/types': 7.21.2 dev: true - /@types/bluebird/3.5.36: + /@types/bcryptjs@2.4.2: + resolution: {integrity: sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==} + + /@types/blessed@0.1.19: + resolution: {integrity: sha512-r4qnseYWBsi/kxo5AAlCS22EnTXFbGpnvuXUubJikVeRnYB3e5HwV3NtcwJ0Sk5KOGaLvo9Rtwb8hzxfbqbQPg==} + dependencies: + '@types/node': 18.11.9 + dev: false + + /@types/bluebird@3.5.36: resolution: {integrity: sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==} + dev: false + + /@types/bluebird@3.5.38: + resolution: {integrity: sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==} dev: true - /@types/body-parser/1.19.2: + /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 17.0.4 - dev: true + '@types/node': 18.11.9 - /@types/bonjour/3.5.10: + /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 17.0.4 - dev: true + '@types/node': 18.11.9 + + /@types/btoa-lite@1.0.0: + resolution: {integrity: sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==} + dev: false + + /@types/cacheable-request@6.0.2: + resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} + dependencies: + '@types/http-cache-semantics': 4.0.1 + '@types/keyv': 3.1.4 + '@types/node': 18.11.9 + '@types/responselike': 1.0.0 + + /@types/codemirror@5.60.5: + resolution: {integrity: sha512-TiECZmm8St5YxjFUp64LK0c8WU5bxMDt9YaAek1UqUb9swrSCoJhh92fWu1p3mTEqlHjhB5sY7OFBhWroJXZVg==} + dependencies: + '@types/tern': 0.23.4 + dev: false - /@types/color-convert/2.0.0: - resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} + /@types/codemirror@5.60.7: + resolution: {integrity: sha512-QXIC+RPzt/1BGSuD6iFn6UMC9TDp+9hkOANYNPVsjjrDdzKphfRkwQDKGp2YaC54Yhz0g6P5uYTCCibZZEiMAA==} dependencies: - '@types/color-name': 1.1.1 + '@types/tern': 0.23.4 + dev: false + + /@types/compression@1.7.2: + resolution: {integrity: sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==} + dependencies: + '@types/express': 4.17.17 dev: true - /@types/color-name/1.1.1: - resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} + /@types/configstore@6.0.0: + resolution: {integrity: sha512-GUvNiia85zTDDIx0iPrtF3pI8dwrQkfuokEqxqPDE55qxH0U5SZz4awVZjiJLWN2ZZRkXCUqgsMUbygXY+kytA==} dev: true - /@types/connect-history-api-fallback/1.3.5: + /@types/connect-history-api-fallback@1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: - '@types/express-serve-static-core': 4.17.28 - '@types/node': 17.0.4 - dev: true + '@types/express-serve-static-core': 4.17.33 + '@types/node': 18.11.9 - /@types/connect/3.4.35: + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 + + /@types/content-disposition@0.5.5: + resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} + dev: true + + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + dev: false + + /@types/cookies@0.7.7: + resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} + dependencies: + '@types/connect': 3.4.35 + '@types/express': 4.17.17 + '@types/keygrip': 1.0.2 + '@types/node': 18.11.9 dev: true - /@types/copy-webpack-plugin/8.0.1_webpack-cli@4.9.2: + /@types/copy-webpack-plugin@8.0.1(esbuild@0.12.29)(webpack-cli@4.10.0): resolution: {integrity: sha512-TwEeGse0/wq+t3SFW0DEwroMS/cDkwVZT+vj7tMAYTp7llt/yz6NuW2n04X2M5P/kSfBQOORhrHAN2mqZdmybg==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 tapable: 2.2.1 - webpack: 5.73.0_webpack-cli@4.9.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -4543,185 +12047,443 @@ packages: - webpack-cli dev: true - /@types/crc/3.4.0: - resolution: {integrity: sha512-/CcqxpwpatLHMLDY/S/82iR//FuYjLoOwJNn5RdWy8RnCU62nM2caAHWaDQ5oAXsuaFKXD/R0hTXRj2Feh+5qg==} + /@types/cors@2.8.12: + resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} + dev: false + + /@types/crc@3.8.0: + resolution: {integrity: sha512-m7woGxgPGlPSJ/4ae/7xf95QW4pDpEiaxlQgGyt+6JInQeKyEdZJybfjZueA84X9Lk8vckPyUnXdvU0nVs4r9w==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 dev: true - /@types/cssnano/4.0.1: + /@types/cssnano@4.0.1: resolution: {integrity: sha512-hGOroxRTBkYl5gSBRJOffhV4+io+Y2bFX1VP7LgKEVHJt/LPPJaWUIuDAz74Vlp7l7hCDZfaDi7iPxwNwuVA4Q==} dependencies: postcss: 7.0.39 + + /@types/d3-array@3.0.5: + resolution: {integrity: sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==} + dev: false + + /@types/d3-color@3.1.0: + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + dev: false + + /@types/d3-ease@3.0.0: + resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} + dev: false + + /@types/d3-interpolate@3.0.1: + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} + dependencies: + '@types/d3-color': 3.1.0 + dev: false + + /@types/d3-path@3.0.0: + resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} + dev: false + + /@types/d3-scale@4.0.3: + resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + dependencies: + '@types/d3-time': 3.0.0 + dev: false + + /@types/d3-shape@3.1.1: + resolution: {integrity: sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==} + dependencies: + '@types/d3-path': 3.0.0 + dev: false + + /@types/d3-time@3.0.0: + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + dev: false + + /@types/d3-timer@3.0.0: + resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} + dev: false + + /@types/debug@4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + dependencies: + '@types/ms': 0.7.31 dev: false - /@types/dts-generator/2.1.7: + /@types/direction@1.0.0: + resolution: {integrity: sha512-et1wmqXm/5smJ8lTJfBnwD12/2Y7eVJLKbuaRT0h2xaKAoo1h8Dz2Io22GObDLFwxY1ddXRTLH3Gq5v44Fl/2w==} + dev: false + + /@types/docker-modem@3.0.2: + resolution: {integrity: sha512-qC7prjoEYR2QEe6SmCVfB1x3rfcQtUr1n4x89+3e0wSTMQ/KYCyf+/RAA9n2tllkkNc6//JMUZePdFRiGIWfaQ==} + dependencies: + '@types/node': 18.11.9 + '@types/ssh2': 1.11.6 + dev: false + + /@types/dockerode@3.3.10: + resolution: {integrity: sha512-5qqlsNfhm4bIrwLKwN7s9r3hbg1AUeUQCosETnhgYCt5kCNbD1gkrIopVrcl27DXAsiLUH4fw9ZGwSluTZPG0A==} + dependencies: + '@types/docker-modem': 3.0.2 + '@types/node': 18.11.9 + dev: false + + /@types/dts-generator@2.1.7: resolution: {integrity: sha512-YSLRnAS62iP/vcjHTMbsYtW9RJ7LIMVgp3SwTa8/fV4sE8hjCYQee5LPI4JFbx2oIF5Mw9E1ekkWJu9pHCccrA==} dependencies: - '@types/bluebird': 3.5.36 - typescript: 4.6.4 + '@types/bluebird': 3.5.38 + typescript: 4.9.4 dev: true - /@types/emoji-mart/3.0.9: - resolution: {integrity: sha512-qdBo/2Y8MXaJ/2spKjDZocuq79GpnOhkwMHnK2GnVFa8WYFgfA+ei6sil3aeWQPCreOKIx9ogPpR5+7MaOqYAA==} - dependencies: - '@types/react': 17.0.44 + /@types/ejs@3.1.1: + resolution: {integrity: sha512-RQul5wEfY7BjWm0sYY86cmUN/pcXWGyVxWX93DFFJvcrxax5zKlieLwA3T77xJGwNcZW0YW6CYG70p1m8xPFmA==} dev: true - /@types/eslint-scope/3.7.3: - resolution: {integrity: sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==} + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.4.2 - '@types/estree': 0.0.51 - dev: true + '@types/eslint': 8.21.1 + '@types/estree': 1.0.0 - /@types/eslint/8.4.2: - resolution: {integrity: sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==} + /@types/eslint@8.21.1: + resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} dependencies: - '@types/estree': 0.0.51 + '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 - dev: true - /@types/estree/0.0.39: + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - /@types/estree/0.0.51: + /@types/estree@0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - /@types/express-serve-static-core/4.17.28: - resolution: {integrity: sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==} + /@types/estree@1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + + /@types/events@3.0.0: + resolution: {integrity: sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==} + dev: false + + /@types/express-serve-static-core@4.17.31: + resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true - /@types/express/4.17.13: - resolution: {integrity: sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==} + /@types/express-serve-static-core@4.17.33: + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + dependencies: + '@types/node': 18.11.9 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + + /@types/express@4.17.15: + resolution: {integrity: sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==} dependencies: '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.28 + '@types/express-serve-static-core': 4.17.31 '@types/qs': 6.9.7 - '@types/serve-static': 1.13.10 + '@types/serve-static': 1.15.0 dev: true - /@types/fs-extra/8.1.2: + /@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 + + /@types/fined@1.1.3: + resolution: {integrity: sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==} + dev: false + + /@types/fs-extra@8.1.2: resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 dev: true - /@types/fs-extra/9.0.13: + /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 + dev: true + + /@types/generate-json-webpack-plugin@0.3.4: + resolution: {integrity: sha512-MubuE9xfB/NYIDGsmDs6O5nw6SDRmiUMAIWEfDHng1gQoI6w0/Zaa0CPTWIQ3OoiE9Z988q4R4Vsog4r6gXFvg==} + dependencies: + '@types/webpack': 4.41.33 dev: true - /@types/glob/7.2.0: + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 17.0.4 + '@types/node': 18.11.9 + + /@types/glob@8.0.0: + resolution: {integrity: sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==} + dependencies: + '@types/minimatch': 3.0.5 + '@types/node': 18.11.9 dev: true - /@types/graceful-fs/4.1.5: - resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} + /@types/glob@8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: - '@types/node': 17.0.4 + '@types/minimatch': 5.1.2 + '@types/node': 18.11.9 + + /@types/graceful-fs@4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 18.11.9 dev: true - /@types/hast/2.3.4: + /@types/hast@2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 3.0.0 + + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.0 + dev: false - /@types/history/4.7.11: + /@types/history@4.7.11: resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} - dev: true - /@types/hoist-non-react-statics/3.3.1: + /@types/hoist-non-react-statics@3.3.1: resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} dependencies: - '@types/react': 17.0.44 + '@types/react': 18.0.20 hoist-non-react-statics: 3.3.2 - /@types/html-minifier-terser/5.1.2: + /@types/html-minifier-terser@5.1.2: resolution: {integrity: sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==} dev: true - /@types/html-minifier-terser/6.1.0: + /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + /@types/http-assert@1.5.3: + resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} dev: true - /@types/http-proxy/1.17.9: - resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} + /@types/http-cache-semantics@4.0.1: + resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + + /@types/http-errors@1.8.2: + resolution: {integrity: sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==} + dev: true + + /@types/http-proxy@1.17.10: + resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} + dependencies: + '@types/node': 18.11.9 + + /@types/i18next-fs-backend@1.1.2: + resolution: {integrity: sha512-ZzTRXA5B0x0oGhzKNp08IsYjZpli4LjRZpg3q4j0XFxN5lKG2MVLnR4yHX8PPExBk4sj9Yfk1z9O6CjPrAlmIQ==} dependencies: - '@types/node': 17.0.4 + i18next: 21.9.1 dev: true - /@types/is-function/1.0.1: + /@types/inquirer@6.5.0: + resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} + dependencies: + '@types/through': 0.0.30 + rxjs: 6.6.7 + dev: false + + /@types/inquirer@8.2.3: + resolution: {integrity: sha512-ZlBqD+8WIVNy3KIVkl+Qne6bGLW2erwN0GJXY9Ri/9EMbyupee3xw3H0Mmv5kJoLyNpfd/oHlwKxO0DUDH7yWA==} + dependencies: + '@types/through': 0.0.30 + + /@types/ioredis@4.28.10: + resolution: {integrity: sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==} + dependencies: + '@types/node': 18.11.9 + + /@types/is-base64@1.1.1: + resolution: {integrity: sha512-JgnGhP+MeSHEQmvxcobcwPEP4Ew56voiq9/0hmP/41lyQ/3gBw/ZCIRy2v+QkEOdeCl58lRcrf6+Y6WMlJGETA==} + dev: false + + /@types/is-function@1.0.1: resolution: {integrity: sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==} dev: true - /@types/is-hotkey/0.1.7: + /@types/is-hotkey@0.1.7: resolution: {integrity: sha512-yB5C7zcOM7idwYZZ1wKQ3pTfjA9BbvFqRWvKB46GFddxnJtHwi/b9y84ykQtxQPg5qhdpg4Q/kWU3EGoCTmLzQ==} dev: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 - dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 + + /@types/jest@26.0.24: + resolution: {integrity: sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==} + dependencies: + jest-diff: 26.6.2 + pretty-format: 26.6.2 dev: true - /@types/jest/27.5.1: - resolution: {integrity: sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ==} + /@types/jest@27.5.2: + resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==} dependencies: jest-matcher-utils: 27.5.1 pretty-format: 27.5.1 dev: true - /@types/json-schema/7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/jest@29.4.0: + resolution: {integrity: sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==} + dependencies: + expect: 29.4.3 + pretty-format: 29.4.3 dev: true - /@types/json5/0.0.29: + /@types/jest@29.5.1: + resolution: {integrity: sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==} + dependencies: + expect: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /@types/js-cookie@2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: false + + /@types/js-yaml@4.0.5: + resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} + dev: false + + /@types/json-schema@7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/loadable__component/5.13.4: + /@types/jsonexport@3.0.2: + resolution: {integrity: sha512-VrWj30OihopTEE7jDiXO1IbrCF+iNiKi9eLtz03RsazWQCyp1rsMlap1W0V1xjT6ULiilKZP4qXYoWFADnMn8A==} + dependencies: + '@types/node': 18.11.9 + dev: false + + /@types/jsonwebtoken@8.5.9: + resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} + dependencies: + '@types/node': 18.11.9 + + /@types/keygrip@1.0.2: + resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 18.11.9 + + /@types/koa-compose@3.2.5: + resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} + dependencies: + '@types/koa': 2.13.5 + dev: true + + /@types/koa@2.13.5: + resolution: {integrity: sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==} + dependencies: + '@types/accepts': 1.3.5 + '@types/content-disposition': 0.5.5 + '@types/cookies': 0.7.7 + '@types/http-assert': 1.5.3 + '@types/http-errors': 1.8.2 + '@types/keygrip': 1.0.2 + '@types/koa-compose': 3.2.5 + '@types/node': 18.11.9 + dev: true + + /@types/liftoff@4.0.0: + resolution: {integrity: sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==} + dependencies: + '@types/fined': 1.1.3 + '@types/node': 18.11.9 + dev: false + + /@types/loadable__component@5.13.4: resolution: {integrity: sha512-YhoCCxyuvP2XeZNbHbi8Wb9EMaUJuA2VGHxJffcQYrJKIKSkymJrhbzsf9y4zpTmr5pExAAEh5hbF628PAZ8Dg==} dependencies: - '@types/react': 17.0.44 + '@types/react': 18.0.20 + dev: true + + /@types/lodash-es@4.17.7: + resolution: {integrity: sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==} + dependencies: + '@types/lodash': 4.14.196 + dev: false + + /@types/lodash@4.14.184: + resolution: {integrity: sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==} dev: true - /@types/lodash/4.14.178: - resolution: {integrity: sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==} + /@types/lodash@4.14.191: + resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} + dev: true + + /@types/lodash@4.14.196: + resolution: {integrity: sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==} + + /@types/lru-cache@5.1.1: + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + dev: false + + /@types/marked@4.0.7: + resolution: {integrity: sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==} + dev: false + + /@types/md5@2.3.2: + resolution: {integrity: sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==} + dev: true - /@types/mdast/3.0.10: - resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + /@types/mdast@3.0.11: + resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 3.0.0 - /@types/mime/1.3.2: + /@types/mime@1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} dev: true - /@types/mini-css-extract-plugin/1.4.3_webpack-cli@4.9.2: + /@types/mime@2.0.3: + resolution: {integrity: sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==} + + /@types/mime@3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: true + + /@types/min-document@2.19.0: + resolution: {integrity: sha512-lsYeSW1zfNqHTL1RuaOgfAhoiOWV1RAQDKT0BZ26z4Faz8llVIj1r1ablUo5QY6yzHMketuvu4+N0sv0eZpXTg==} + dev: false + + /@types/mini-css-extract-plugin@1.4.3(esbuild@0.12.29)(webpack-cli@4.10.0): resolution: {integrity: sha512-jyOSVaF4ie2jUGr1uohqeyDrp7ktRthdFxDKzTgbPZtl0QI5geEopW7UKD/DEfn0XgV1KEq/RnZlUmnrEAWbmg==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 tapable: 2.2.1 - webpack: 5.73.0_webpack-cli@4.9.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -4729,238 +12491,431 @@ packages: - webpack-cli dev: true - /@types/minimatch/3.0.5: + /@types/minimatch@3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - dev: true - /@types/minimist/1.2.2: + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/mkdirp/1.0.2: + /@types/minio@7.0.13: + resolution: {integrity: sha512-Warrx6uN4KEpBCAWiTh7ngrPoaNIckawtBXqWbFzaatG/NPRZToAv/fa9yAPA7a2FHAGhe154KqaVIqacIn2pQ==} + dependencies: + '@types/node': 18.11.9 + dev: true + + /@types/mkdirp@1.0.2: resolution: {integrity: sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 dev: true - /@types/node-fetch/2.6.1: - resolution: {integrity: sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==} + /@types/mongoose@5.11.97: + resolution: {integrity: sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==} + deprecated: Mongoose publishes its own types, so you do not need to install this package. dependencies: - '@types/node': 17.0.4 - form-data: 3.0.1 + mongoose: 6.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@types/morgan@1.9.4: + resolution: {integrity: sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==} + dependencies: + '@types/node': 18.11.9 dev: true - /@types/node/14.18.17: - resolution: {integrity: sha512-oajWz4kOajqpKJMPgnCvBajPq8QAvl2xIWoFjlAJPKGu6n7pjov5SxGE45a+0RxHDoo4ycOMoZw1SCOWtDERbw==} + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false + + /@types/node-fetch@2.6.2: + resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + dependencies: + '@types/node': 18.11.9 + form-data: 3.0.1 dev: true - /@types/node/15.14.9: - resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + /@types/node@18.11.9: + resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} - /@types/node/17.0.4: - resolution: {integrity: sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==} + /@types/nodemailer@6.4.5: + resolution: {integrity: sha512-zuP3nBRQHI6M2PkXnGGy1Ww4VB+MyYHGgnfV2T+JR9KLkeWqPJuyVUgLpKXuFnA/b7pZaIDFh2sV4759B7jK1g==} + dependencies: + '@types/node': 18.11.9 + dev: true - /@types/normalize-package-data/2.4.1: + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/npmlog/4.1.4: + /@types/npmlog@4.1.4: resolution: {integrity: sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==} dev: true - /@types/overlayscrollbars/1.12.1: - resolution: {integrity: sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ==} + /@types/object.omit@3.0.0: + resolution: {integrity: sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==} + dev: false + + /@types/object.pick@1.3.2: + resolution: {integrity: sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg==} + dev: false + + /@types/oidc-provider@7.11.1: + resolution: {integrity: sha512-qimKqQ5HmQE2HKzhTvkLC0CQcOrQZv9+VAWEBb4EL+zqIZjE4X0PiCL0177eo6kitWrIjTQhhiLc2R3luA1AlQ==} + dependencies: + '@types/koa': 2.13.5 dev: true - /@types/parse-json/4.0.0: + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - /@types/parse5/5.0.3: + /@types/parse5@5.0.3: resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} - dev: true - /@types/prettier/2.6.0: - resolution: {integrity: sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==} + /@types/parse5@6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + dev: false + + /@types/pidusage@2.0.2: + resolution: {integrity: sha512-lHgpGZjXDfjggZDLkgp4zQTYkvXq4S7RxjBjrDcPe1MBU72hESWxubutx8+AM4QkJdRxAhrQyxSA6pzHKJKlsQ==} + dev: false + + /@types/pino-http@5.8.1: + resolution: {integrity: sha512-A9MW6VCnx5ii7s+Fs5aFIw+aSZcBCpsZ/atpxamu8tTsvWFacxSf2Hrn1Ohn1jkVRB/LiPGOapRXcFawDBnDnA==} + dependencies: + '@types/pino': 6.3.12 + dev: false + + /@types/pino-pretty@4.7.5: + resolution: {integrity: sha512-rfHe6VIknk14DymxGqc9maGsRe8/HQSvM2u46EAz2XrS92qsAJnW16dpdFejBuZKD8cRJX6Aw6uVZqIQctMpAg==} + dependencies: + '@types/node': 18.11.9 + '@types/pino': 6.3.12 + dev: false + + /@types/pino-std-serializers@2.4.1: + resolution: {integrity: sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==} + dependencies: + '@types/node': 18.11.9 + dev: false + + /@types/pino@6.3.12: + resolution: {integrity: sha512-dsLRTq8/4UtVSpJgl9aeqHvbh6pzdmjYD3C092SYgLD2TyoCqHpTJk6vp8DvCTGGc7iowZ2MoiYiVUUCcu7muw==} + dependencies: + '@types/node': 18.11.9 + '@types/pino-pretty': 4.7.5 + '@types/pino-std-serializers': 2.4.1 + sonic-boom: 2.8.0 + dev: false + + /@types/prettier@2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true - /@types/pretty-hrtime/1.0.1: + /@types/pretty-hrtime@1.0.1: resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} dev: true - /@types/prop-types/15.7.4: - resolution: {integrity: sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==} + /@types/prismjs@1.26.0: + resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==} + dev: false + + /@types/promise-retry@1.1.3: + resolution: {integrity: sha512-LxIlEpEX6frE3co3vCO2EUJfHIta1IOmhDlcAsR4GMMv9hev1iTI9VwberVGkePJAuLZs5rMucrV8CziCfuJMw==} + dependencies: + '@types/retry': 0.12.0 + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/q/1.5.5: + /@types/q@1.5.5: resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} - dev: false - /@types/qs/6.9.7: + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - dev: true - /@types/range-parser/1.2.4: + /@types/querystringify@2.0.0: + resolution: {integrity: sha512-9WgEGTevECrXJC2LSWPqiPYWq8BRmeaOyZn47js/3V6UF0PWtcVfvvR43YjeO8BzBsthTz98jMczujOwTw+WYg==} + dev: false + + /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + + /@types/react-canvas-draw@1.2.0: + resolution: {integrity: sha512-ZrGtORZSsF5ErpRiWw2/Yqwkf7CyCgcNfLnABb6kjCTsx8AjcepO3pkKOOYS7MqGyLHALB6GLuSALl1PtEpRhA==} + dependencies: + '@types/react': 18.0.20 dev: true - /@types/react-canvas-draw/1.2.0: - resolution: {integrity: sha512-ZrGtORZSsF5ErpRiWw2/Yqwkf7CyCgcNfLnABb6kjCTsx8AjcepO3pkKOOYS7MqGyLHALB6GLuSALl1PtEpRhA==} + /@types/react-color@3.0.6: + resolution: {integrity: sha512-OzPIO5AyRmLA7PlOyISlgabpYUa3En74LP8mTMa0veCA719SvYQov4WLMsHvCgXP+L+KI9yGhYnqZafVGG0P4w==} + dependencies: + '@types/react': 18.0.20 + '@types/reactcss': 1.2.6 + dev: false + + /@types/react-dom@18.0.11: + resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} dependencies: - '@types/react': 17.0.44 - dev: true + '@types/react': 18.0.20 - /@types/react-dom/17.0.16: - resolution: {integrity: sha512-DWcXf8EbMrO/gWnQU7Z88Ws/p16qxGpPyjTKTpmBSFKeE+HveVubqGO1CVK7FrwlWD5MuOcvh8gtd0/XO38NdQ==} + /@types/react-dom@18.0.6: + resolution: {integrity: sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==} dependencies: - '@types/react': 17.0.44 - dev: true + '@types/react': 18.0.20 - /@types/react-helmet/6.1.5: - resolution: {integrity: sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==} + /@types/react-helmet@6.1.6: + resolution: {integrity: sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==} dependencies: - '@types/react': 17.0.44 - dev: true + '@types/react': 18.0.20 - /@types/react-highlight/0.12.5: + /@types/react-highlight@0.12.5: resolution: {integrity: sha512-P8+mTxltxDdQ+99l+pjn40clziSbNrZy5d5zmvG+j3jKzokAhCoCZlIRmmnFgETTYubuqwKjvXSlvesBZcTfvQ==} dependencies: - '@types/react': 17.0.44 + '@types/react': 18.0.20 dev: true - /@types/react-mentions/4.1.6: - resolution: {integrity: sha512-f4/BdnjlMxT47q+WqlcYYwFABbBMVQrDoFFeMeljtFC5nnR9/x8TOFmN18BJKgNuWMgivy9uE5EKtsjlay751w==} + /@types/react-is@17.0.3: + resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==} + dependencies: + '@types/react': 18.0.20 + dev: false + + /@types/react-mentions@4.1.8: + resolution: {integrity: sha512-Go86ozdnh0FTNbiGiDPAcNqYqtab9iGzLOgZPYUKrnhI4539jGzfJtP6rFHcXgi9Koe58yhkeyKYib6Ucul/sQ==} dependencies: - '@types/react': 17.0.44 + '@types/react': 18.0.20 dev: true - /@types/react-redux/7.1.24: - resolution: {integrity: sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==} + /@types/react-router-config@5.0.6: + resolution: {integrity: sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==} dependencies: - '@types/hoist-non-react-statics': 3.3.1 - '@types/react': 17.0.44 - hoist-non-react-statics: 3.3.2 - redux: 4.2.0 + '@types/history': 4.7.11 + '@types/react': 18.0.20 + '@types/react-router': 5.1.20 - /@types/react-router-dom/5.3.3: + /@types/react-router-dom@5.3.3: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 17.0.44 - '@types/react-router': 5.1.18 - dev: true + '@types/react': 18.0.20 + '@types/react-router': 5.1.20 - /@types/react-router/5.1.18: + /@types/react-router@5.1.18: resolution: {integrity: sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==} dependencies: '@types/history': 4.7.11 - '@types/react': 17.0.44 + '@types/react': 18.0.20 dev: true - /@types/react-syntax-highlighter/11.0.5: - resolution: {integrity: sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==} + /@types/react-router@5.1.20: + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: - '@types/react': 17.0.44 - dev: true - - /@types/react-test-renderer/18.0.0: - resolution: {integrity: sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ==} - dependencies: - '@types/react': 17.0.44 - dev: true + '@types/history': 4.7.11 + '@types/react': 18.0.20 - /@types/react-transition-group/4.4.4: - resolution: {integrity: sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==} + /@types/react-transition-group@4.4.5: + resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==} dependencies: - '@types/react': 17.0.44 - dev: true + '@types/react': 18.0.20 - /@types/react-virtualized-auto-sizer/1.0.1: + /@types/react-virtualized-auto-sizer@1.0.1: resolution: {integrity: sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==} dependencies: - '@types/react': 17.0.44 + '@types/react': 18.0.20 dev: true - /@types/react-virtualized/9.21.21: + /@types/react-virtualized@9.21.21: resolution: {integrity: sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA==} dependencies: - '@types/prop-types': 15.7.4 - '@types/react': 17.0.44 + '@types/prop-types': 15.7.5 + '@types/react': 18.0.20 dev: true - /@types/react/17.0.44: - resolution: {integrity: sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==} + /@types/react@18.0.20: + resolution: {integrity: sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==} dependencies: - '@types/prop-types': 15.7.4 + '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 - csstype: 3.0.10 + csstype: 3.1.1 + + /@types/reactcss@1.2.6: + resolution: {integrity: sha512-qaIzpCuXNWomGR1Xq8SCFTtF4v8V27Y6f+b9+bzHiv087MylI/nTCqqdChNeWS7tslgROmYB7yeiruWX7WnqNg==} + dependencies: + '@types/react': 18.0.20 + dev: false + + /@types/refractor@3.0.2: + resolution: {integrity: sha512-2HMXuwGuOqzUG+KUTm9GDJCHl0LCBKsB5cg28ujEmVi/0qgTb6jOmkVSO5K48qXksyl2Fr3C0Q2VrgD4zbwyXg==} + dependencies: + '@types/prismjs': 1.26.0 + dev: false - /@types/resolve/1.17.1: + /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 - /@types/retry/0.12.0: + /@types/responselike@1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 18.11.9 + + /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true - /@types/scheduler/0.16.2: + /@types/sax@1.2.4: + resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} + dependencies: + '@types/node': 18.11.9 + dev: false + + /@types/scheduler@0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - /@types/serve-index/1.9.1: - resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} - dependencies: - '@types/express': 4.17.13 + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@types/serve-static/1.13.10: - resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} + /@types/send@0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 17.0.4 + '@types/node': 18.11.9 dev: true - /@types/sockjs/0.3.33: - resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} + /@types/serve-index@1.9.1: + resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} + dependencies: + '@types/express': 4.17.17 + + /@types/serve-static@1.15.0: + resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: - '@types/node': 17.0.4 + '@types/mime': 3.0.1 + '@types/node': 18.11.9 dev: true - /@types/source-list-map/0.1.2: + /@types/serve-static@1.15.1: + resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + dependencies: + '@types/mime': 2.0.3 + '@types/node': 18.11.9 + + /@types/sockjs@0.3.33: + resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} + dependencies: + '@types/node': 18.11.9 + + /@types/source-list-map@0.1.2: resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} dev: true - /@types/stack-utils/2.0.1: + /@types/spinnies@0.5.0: + resolution: {integrity: sha512-wJjKMQG3jbi7tYAnqMi0L1CiPFzuG3cBgxACnpQBsZTRDyKrBlYdVvrCss1KHhVv0n7Balzd6MkVGp8DjTL8cw==} + dev: true + + /@types/ssh2@1.11.6: + resolution: {integrity: sha512-8Mf6bhzYYBLEB/G6COux7DS/F5bCWwojv/qFo2yH/e4cLzAavJnxvFXrYW59iKfXdhG6OmzJcXDasgOb/s0rxw==} + dependencies: + '@types/node': 18.11.9 + dev: false + + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/tapable/1.0.8: + /@types/styled-components@5.1.26: + resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} + dependencies: + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.0.20 + csstype: 3.1.1 + + /@types/swagger-jsdoc@6.0.1: + resolution: {integrity: sha512-+MUpcbyxD528dECUBCEVm6abNuORdbuGjbrUdHDeAQ+rkPuo2a+L4N02WJHF3bonSSE6SJ3dUJwF2V6+cHnf0w==} + dev: true + + /@types/tapable@1.0.8: resolution: {integrity: sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==} dev: true - /@types/testing-library__jest-dom/5.14.3: - resolution: {integrity: sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw==} + /@types/tern@0.23.4: + resolution: {integrity: sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==} + dependencies: + '@types/estree': 1.0.0 + dev: false + + /@types/testing-library__jest-dom@5.14.5: + resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==} + dependencies: + '@types/jest': 29.5.1 + dev: true + + /@types/throttle-debounce@2.1.0: + resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} + dev: false + + /@types/through@0.0.30: + resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/jest': 27.5.1 + '@types/node': 18.11.9 + + /@types/tinycon@0.6.3: + resolution: {integrity: sha512-TC42m8KAyp3AqyZKRXVkk5Qy+oIU8zo2U3362i16Qan0JgZNzLawO7oYnin4BJOy8FSZfOadYYvUWQnpaXoZwg==} dev: true - /@types/trusted-types/2.0.2: - resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} + /@types/trusted-types@2.0.3: + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + dev: true + + /@types/turndown@5.0.1: + resolution: {integrity: sha512-N8Ad4e3oJxh9n9BiZx9cbe/0M3kqDpOTm2wzj13wdDUxDPjfjloWIJaquZzWE1cYTAHpjOH3rcTnXQdpEfS/SQ==} + dev: false + + /@types/uglify-js@3.17.0: + resolution: {integrity: sha512-3HO6rm0y+/cqvOyA8xcYLweF0TKXlAxmQASjbOi49Co51A1N4nR4bEwBgRoD9kNM+rqFGArjKr654SLp2CoGmQ==} + dependencies: + source-map: 0.6.1 dev: true - /@types/uglify-js/3.13.2: - resolution: {integrity: sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==} + /@types/uglify-js@3.17.1: + resolution: {integrity: sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==} dependencies: source-map: 0.6.1 dev: true - /@types/unist/2.0.6: + /@types/unist@2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - /@types/webpack-bundle-analyzer/4.4.1_webpack-cli@4.9.2: - resolution: {integrity: sha512-yQAj3l7bIYL+QRRlNJt6gyP+zrXZOlgaR4wsX0WY4yzZIbv41ZibREfZvuYjxY0iVtvQQlbhx0AeokkCuqUAQg==} + /@types/unist@3.0.0: + resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} + + /@types/update-notifier@6.0.1: + resolution: {integrity: sha512-J6x9qtPDKgJGLdTjiswhhiL5QJoZv7eQb44t90mWb4Cf3tnuDRMvg8je9PoxDJZiGog0bfoFVcVHBq4RcItRZg==} + dependencies: + '@types/configstore': 6.0.0 + boxen: 7.0.0 + dev: true + + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false + + /@types/webidl-conversions@6.1.1: + resolution: {integrity: sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==} + + /@types/webpack-bundle-analyzer@4.6.0(esbuild@0.12.29)(webpack-cli@4.10.0): + resolution: {integrity: sha512-XeQmQCCXdZdap+A/60UKmxW5Mz31Vp9uieGlHB3T4z/o2OLVLtTI3bvTuS6A2OWd/rbAAQiGGWIEFQACu16szA==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 tapable: 2.2.1 - webpack: 5.73.0_webpack-cli@4.9.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -4968,11 +12923,11 @@ packages: - webpack-cli dev: true - /@types/webpack-dev-server/4.7.2_gkh3o7gdsall36kyfdv2sybo54: + /@types/webpack-dev-server@4.7.2(webpack-cli@4.10.0)(webpack@5.75.0): resolution: {integrity: sha512-Y3p0Fmfvp0MHBDoCzo+xFJaWTw0/z37mWIo6P15j+OtmUDLvznJWdZNeD7Q004R+MpQlys12oXbXsrXRmxwg4Q==} deprecated: This is a stub types definition. webpack-dev-server provides its own type definitions, so you do not need this installed. dependencies: - webpack-dev-server: 4.9.0_gkh3o7gdsall36kyfdv2sybo54 + webpack-dev-server: 4.11.1(webpack-cli@4.10.0)(webpack@5.75.0) transitivePeerDependencies: - bufferutil - debug @@ -4982,48 +12937,46 @@ packages: - webpack-cli dev: true - /@types/webpack-env/1.16.4: - resolution: {integrity: sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw==} + /@types/webpack-env@1.18.0: + resolution: {integrity: sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==} dev: true - /@types/webpack-sources/3.2.0: + /@types/webpack-sources@3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 '@types/source-list-map': 0.1.2 - source-map: 0.7.3 + source-map: 0.7.4 dev: true - /@types/webpack/4.41.32: + /@types/webpack@4.41.32: resolution: {integrity: sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 '@types/tapable': 1.0.8 - '@types/uglify-js': 3.13.2 + '@types/uglify-js': 3.17.0 '@types/webpack-sources': 3.2.0 - anymatch: 3.1.2 + anymatch: 3.1.3 source-map: 0.6.1 dev: true - /@types/webpack/5.28.0: - resolution: {integrity: sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==} + /@types/webpack@4.41.33: + resolution: {integrity: sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==} dependencies: - '@types/node': 17.0.4 - tapable: 2.2.1 - webpack: 5.72.1 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli + '@types/node': 18.11.9 + '@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 - /@types/webpack/5.28.0_webpack-cli@4.9.2: + /@types/webpack@5.28.0(esbuild@0.12.29)(webpack-cli@4.10.0): resolution: {integrity: sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 tapable: 2.2.1 - webpack: 5.72.1_webpack-cli@4.9.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -5031,270 +12984,257 @@ packages: - webpack-cli dev: true - /@types/ws/8.5.3: - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + /@types/whatwg-url@8.2.2: + resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} dependencies: - '@types/node': 17.0.4 - dev: true + '@types/node': 18.11.9 + '@types/webidl-conversions': 6.1.1 - /@types/yargs-parser/21.0.0: + /@types/ws@8.5.4: + resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + dependencies: + '@types/node': 18.11.9 + + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - /@types/yargs/15.0.14: + /@types/yargs@15.0.14: resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@types/yargs/16.0.4: - resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} + /@types/yargs@16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/4.33.0_lzzr7k3tjtqil7aczuhmzzwame: - resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} - engines: {node: ^10.12.0 || >=12.0.0} + /@types/yargs@17.0.12: + resolution: {integrity: sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@types/yargs@17.0.22: + resolution: {integrity: sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==} + dependencies: + '@types/yargs-parser': 21.0.0 + + /@types/yoga-layout@1.9.2: + resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==} + dev: false + + /@typescript-eslint/eslint-plugin@5.53.0(@typescript-eslint/parser@5.53.0)(eslint@8.34.0)(typescript@4.9.4): + resolution: {integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@typescript-eslint/parser': ^4.0.0 - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.33.0_e4zyhrvfnqudwdx5bevnvkluy4 - '@typescript-eslint/parser': 4.33.0_e4zyhrvfnqudwdx5bevnvkluy4 - '@typescript-eslint/scope-manager': 4.33.0 - debug: 4.3.3 - eslint: 7.32.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.0 + '@typescript-eslint/parser': 5.53.0(eslint@8.34.0)(typescript@4.9.4) + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/type-utils': 5.53.0(eslint@8.34.0)(typescript@4.9.4) + '@typescript-eslint/utils': 5.53.0(eslint@8.34.0)(typescript@4.9.4) + debug: 4.3.4(supports-color@9.2.2) + eslint: 8.34.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 regexpp: 3.2.0 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.6.4 - typescript: 4.6.4 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.4) + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils/4.33.0_e4zyhrvfnqudwdx5bevnvkluy4: - resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} - engines: {node: ^10.12.0 || >=12.0.0} + /@typescript-eslint/parser@5.53.0(eslint@8.34.0)(typescript@4.9.4): + resolution: {integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: '*' + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 4.33.0 - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.6.4 - eslint: 7.32.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@7.32.0 + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@4.9.4) + debug: 4.3.4(supports-color@9.2.2) + eslint: 8.34.0 + typescript: 4.9.4 transitivePeerDependencies: - supports-color - - typescript dev: true - /@typescript-eslint/parser/4.33.0_e4zyhrvfnqudwdx5bevnvkluy4: - resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} - engines: {node: ^10.12.0 || >=12.0.0} + /@typescript-eslint/scope-manager@5.53.0: + resolution: {integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + dev: true + + /@typescript-eslint/type-utils@5.53.0(eslint@8.34.0)(typescript@4.9.4): + resolution: {integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: '*' typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 4.33.0 - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.6.4 - debug: 4.3.3 - eslint: 7.32.0 - typescript: 4.6.4 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@4.9.4) + '@typescript-eslint/utils': 5.53.0(eslint@8.34.0)(typescript@4.9.4) + debug: 4.3.4(supports-color@9.2.2) + eslint: 8.34.0 + tsutils: 3.21.0(typescript@4.9.4) + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/4.33.0: - resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - dependencies: - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/visitor-keys': 4.33.0 - dev: true - - /@typescript-eslint/types/4.33.0: - resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + /@typescript-eslint/types@5.53.0: + resolution: {integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/4.33.0_typescript@4.6.4: - resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} - engines: {node: ^10.12.0 || >=12.0.0} + /@typescript-eslint/typescript-estree@5.53.0(typescript@4.9.4): + resolution: {integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/visitor-keys': 4.33.0 - debug: 4.3.3 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + debug: 4.3.4(supports-color@9.2.2) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.6.4 - typescript: 4.6.4 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.4) + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/visitor-keys/4.33.0: - resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + /@typescript-eslint/utils@5.53.0(eslint@8.34.0)(typescript@4.9.4): + resolution: {integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/types': 4.33.0 - eslint-visitor-keys: 2.1.0 + '@types/json-schema': 7.0.11 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0(typescript@4.9.4) + eslint: 8.34.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@8.34.0) + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript dev: true - /@virtuoso.dev/react-urx/0.2.13_react@17.0.2: - resolution: {integrity: sha512-MY0ugBDjFb5Xt8v2HY7MKcRGqw/3gTpMlLXId2EwQvYJoC8sP7nnXjAxcBtTB50KTZhO0SbzsFimaZ7pSdApwA==} - engines: {node: '>=10'} - peerDependencies: - react: '>=16' + /@typescript-eslint/visitor-keys@5.53.0: + resolution: {integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@virtuoso.dev/urx': 0.2.13 - react: 17.0.2 + '@typescript-eslint/types': 5.53.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@ungap/structured-clone@1.2.1: + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} dev: false - /@virtuoso.dev/urx/0.2.13: - resolution: {integrity: sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw==} + /@use-gesture/core@10.2.24: + resolution: {integrity: sha512-ZL7F9mgOn3Qlnp6QLI9jaOfcvqrx6JPE/BkdVSd8imveaFTm/a3udoO6f5Us/1XtqnL4347PsIiK6AtCvMHk2Q==} dev: false - /@webassemblyjs/ast/1.11.1: - resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + /@use-gesture/react@10.2.24(react@18.2.0): + resolution: {integrity: sha512-rAZ8Nnpu1g4eFzqCPlaq+TppJpMy0dTpYOQx5KpfoBF4P3aWnCqwj7eKxcmdIb1NJKpIJj50DPugUH4mq5cpBg==} + peerDependencies: + react: '>= 16.8.0' dependencies: - '@webassemblyjs/helper-numbers': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - dev: true + '@use-gesture/core': 10.2.24 + react: 18.2.0 + dev: false - /@webassemblyjs/ast/1.9.0: - resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} + /@vitejs/plugin-react@3.1.0(vite@4.2.0): + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 dependencies: - '@webassemblyjs/helper-module-context': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/wast-parser': 1.9.0 + '@babel/core': 7.21.0 + '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.21.0) + '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.21.0) + magic-string: 0.27.0 + react-refresh: 0.14.0 + vite: 4.2.0(@types/node@18.11.9) + transitivePeerDependencies: + - supports-color dev: true - /@webassemblyjs/floating-point-hex-parser/1.11.1: - resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} - dev: true + /@webassemblyjs/ast@1.11.1: + resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - /@webassemblyjs/floating-point-hex-parser/1.9.0: - resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} - dev: true + /@webassemblyjs/floating-point-hex-parser@1.11.1: + resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} - /@webassemblyjs/helper-api-error/1.11.1: + /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} - dev: true - - /@webassemblyjs/helper-api-error/1.9.0: - resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} - dev: true - /@webassemblyjs/helper-buffer/1.11.1: + /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} - 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-numbers/1.11.1: + /@webassemblyjs/helper-numbers@1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.1 '@webassemblyjs/helper-api-error': 1.11.1 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode/1.11.1: + /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} - dev: true - - /@webassemblyjs/helper-wasm-bytecode/1.9.0: - resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} - dev: true - /@webassemblyjs/helper-wasm-section/1.11.1: + /@webassemblyjs/helper-wasm-section@1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/helper-buffer': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 '@webassemblyjs/wasm-gen': 1.11.1 - 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.11.1: + /@webassemblyjs/ieee754@1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.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.11.1: + /@webassemblyjs/leb128@1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/leb128/1.9.0: - resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/utf8/1.11.1: + /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} - dev: true - - /@webassemblyjs/utf8/1.9.0: - resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} - dev: true - /@webassemblyjs/wasm-edit/1.11.1: + /@webassemblyjs/wasm-edit@1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -5305,22 +13245,8 @@ packages: '@webassemblyjs/wasm-opt': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 '@webassemblyjs/wast-printer': 1.11.1 - 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.11.1: + /@webassemblyjs/wasm-gen@1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -5328,37 +13254,16 @@ packages: '@webassemblyjs/ieee754': 1.11.1 '@webassemblyjs/leb128': 1.11.1 '@webassemblyjs/utf8': 1.11.1 - 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.11.1: + /@webassemblyjs/wasm-opt@1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} dependencies: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/helper-buffer': 1.11.1 '@webassemblyjs/wasm-gen': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - 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.11.1: + /@webassemblyjs/wasm-parser@1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -5367,66 +13272,32 @@ packages: '@webassemblyjs/ieee754': 1.11.1 '@webassemblyjs/leb128': 1.11.1 '@webassemblyjs/utf8': 1.11.1 - 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.11.1: + /@webassemblyjs/wast-printer@1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@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 - /@webpack-cli/configtest/1.1.1_gkh3o7gdsall36kyfdv2sybo54: - resolution: {integrity: sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==} + /@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.75.0): + resolution: {integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==} peerDependencies: - webpack: 4.x.x || 5.x.x + webpack: 5.75.0 webpack-cli: 4.x.x dependencies: - webpack: 5.73.0_webpack-cli@4.9.2 - webpack-cli: 4.9.2_w5nksobufzg2ereh4ivwj2odyu - dev: true + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-bundle-analyzer@4.8.0)(webpack-dev-server@4.11.1)(webpack@5.75.0) - /@webpack-cli/info/1.4.1_webpack-cli@4.9.2: - resolution: {integrity: sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==} + /@webpack-cli/info@1.5.0(webpack-cli@4.10.0): + resolution: {integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==} peerDependencies: webpack-cli: 4.x.x dependencies: envinfo: 7.8.1 - webpack-cli: 4.9.2_w5nksobufzg2ereh4ivwj2odyu - dev: true + webpack-cli: 4.10.0(webpack-bundle-analyzer@4.8.0)(webpack-dev-server@4.11.1)(webpack@5.75.0) - /@webpack-cli/serve/1.6.1_efhxflzxrvzsrtpw5o3zelaodm: - resolution: {integrity: sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==} + /@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@4.11.1): + resolution: {integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==} peerDependencies: webpack-cli: 4.x.x webpack-dev-server: '*' @@ -5434,19 +13305,26 @@ packages: webpack-dev-server: optional: true dependencies: - webpack-cli: 4.9.2_w5nksobufzg2ereh4ivwj2odyu - webpack-dev-server: 4.9.0_gkh3o7gdsall36kyfdv2sybo54 - dev: true + webpack-cli: 4.10.0(webpack-bundle-analyzer@4.8.0)(webpack-dev-server@4.11.1)(webpack@5.75.0) + webpack-dev-server: 4.11.1(webpack-cli@4.10.0)(webpack@5.75.0) + + /@xobotyi/scrollbar-width@1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + dev: false - /@xtuc/ieee754/1.2.0: + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - /@xtuc/long/4.2.2: + /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - /JSONStream/1.3.5: + /@zxing/text-encoding@0.9.0: + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + requiresBuild: true + dev: false + optional: true + + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true dependencies: @@ -5454,19 +13332,44 @@ packages: through: 2.3.8 dev: true - /abab/2.0.6: + /a11y-status@2.0.0: + resolution: {integrity: sha512-Iy+OM+mJJHL0z3AT4O3EMlXqcT7FA96vSukndOM6SFKC4+q+KuO6juSN9Avwhn6s1P3oABZiljOdr5pF+0r9VA==} + dependencies: + '@babel/runtime': 7.21.0 + '@types/throttle-debounce': 2.1.0 + throttle-debounce: 3.0.1 + dev: false + + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /accepts/1.3.8: + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /accept-language@3.0.18: + resolution: {integrity: sha512-sUofgqBPzgfcF20sPoBYGQ1IhQLt2LSkxTnlQSuLF3n5gPEqd5AimbvOvHEi0T1kLMiGVqPWzI5a9OteBRth3A==} + dependencies: + bcp47: 1.1.2 + stable: 0.1.8 + dev: false + + /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-class-fields/0.3.7_acorn@8.7.1: + /acorn-class-fields@0.3.7(acorn@8.8.2): resolution: {integrity: sha512-jdUWSFce0fuADUljmExz4TWpPkxmRW/ZCPRqeeUzbGf0vFUcpQYbyq52l75qGd0oSwwtAepeL6hgb/naRgvcKQ==} engines: {node: '>=4.8.2'} peerDependencies: @@ -5475,29 +13378,30 @@ packages: acorn: optional: true dependencies: - acorn: 8.7.1 - acorn-private-class-elements: 0.2.7_acorn@8.7.1 + acorn: 8.8.2 + acorn-private-class-elements: 0.2.7(acorn@8.8.2) dev: true - /acorn-dynamic-import/4.0.0_acorn@8.7.1: + /acorn-dynamic-import@4.0.0(acorn@8.8.2): resolution: {integrity: sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==} + deprecated: This is probably built in to whatever tool you're using. If you still need it... idk peerDependencies: acorn: ^6.0.0 peerDependenciesMeta: acorn: optional: true dependencies: - acorn: 8.7.1 + acorn: 8.8.2 dev: true - /acorn-globals/6.0.0: + /acorn-globals@6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 dev: true - /acorn-import-assertions/1.8.0_acorn@8.7.1: + /acorn-import-assertions@1.8.0(acorn@8.8.2): resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 @@ -5505,10 +13409,9 @@ packages: acorn: optional: true dependencies: - acorn: 8.7.1 - dev: true + acorn: 8.8.2 - /acorn-jsx/5.3.2_acorn@7.4.1: + /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 @@ -5519,7 +13422,7 @@ packages: acorn: 7.4.1 dev: true - /acorn-jsx/5.3.2_acorn@8.7.1: + /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -5527,10 +13430,9 @@ packages: acorn: optional: true dependencies: - acorn: 8.7.1 - dev: true + acorn: 8.8.2 - /acorn-node/1.8.2: + /acorn-node@1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} dependencies: acorn: 7.4.1 @@ -5538,7 +13440,7 @@ packages: xtend: 4.0.2 dev: false - /acorn-private-class-elements/0.2.7_acorn@8.7.1: + /acorn-private-class-elements@0.2.7(acorn@8.8.2): resolution: {integrity: sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA==} engines: {node: '>=4.8.2'} peerDependencies: @@ -5547,10 +13449,10 @@ packages: acorn: optional: true dependencies: - acorn: 8.7.1 + acorn: 8.8.2 dev: true - /acorn-private-methods/0.3.3_acorn@8.7.1: + /acorn-private-methods@0.3.3(acorn@8.8.2): resolution: {integrity: sha512-46oeEol3YFvLSah5m9hGMlNpxDBCEkdceJgf01AjqKYTK9r6HexKs2rgSbLK81pYjZZMonhftuUReGMlbbv05w==} engines: {node: '>=4.8.2'} peerDependencies: @@ -5559,11 +13461,11 @@ packages: acorn: optional: true dependencies: - acorn: 8.7.1 - acorn-private-class-elements: 0.2.7_acorn@8.7.1 + acorn: 8.8.2 + acorn-private-class-elements: 0.2.7(acorn@8.8.2) dev: true - /acorn-stage3/4.0.0_acorn@8.7.1: + /acorn-stage3@4.0.0(acorn@8.8.2): resolution: {integrity: sha512-BR+LaADtA6GTB5prkNqWmlmCLYmkyW0whvSxdHhbupTaro2qBJ95fJDEiRLPUmiACGHPaYyeH9xmNJWdGfXRQw==} engines: {node: '>=4.8.2'} peerDependencies: @@ -5572,13 +13474,13 @@ packages: acorn: optional: true dependencies: - acorn: 8.7.1 - acorn-class-fields: 0.3.7_acorn@8.7.1 - acorn-private-methods: 0.3.3_acorn@8.7.1 - acorn-static-class-features: 0.2.4_acorn@8.7.1 + acorn: 8.8.2 + acorn-class-fields: 0.3.7(acorn@8.8.2) + acorn-private-methods: 0.3.3(acorn@8.8.2) + acorn-static-class-features: 0.2.4(acorn@8.8.2) dev: true - /acorn-static-class-features/0.2.4_acorn@8.7.1: + /acorn-static-class-features@0.2.4(acorn@8.8.2): resolution: {integrity: sha512-5X4mpYq5J3pdndLmIB0+WtFd/mKWnNYpuTlTzj32wUu/PMmEGOiayQ5UrqgwdBNiaZBtDDh5kddpP7Yg2QaQYA==} engines: {node: '>=4.8.2'} peerDependencies: @@ -5587,203 +13489,283 @@ packages: acorn: optional: true dependencies: - acorn: 8.7.1 - acorn-private-class-elements: 0.2.7_acorn@8.7.1 + acorn: 8.8.2 + acorn-private-class-elements: 0.2.7(acorn@8.8.2) dev: true - /acorn-walk/7.2.0: + /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - /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: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true - /acorn/8.7.1: - resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true - /address/1.2.0: - resolution: {integrity: sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==} - engines: {node: '>= 10.0.0'} + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} dev: true - /agent-base/6.0.2: + /address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.3 - transitivePeerDependencies: - - supports-color - dev: true + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + /agora-rtc-react@1.1.3(react@18.2.0): + resolution: {integrity: sha512-AgmDoeLoL3xC7u60lTehHi1GvHsP8l09CX3bn+NyHx6E0Dmbbxdtqkn+YrlakWa4IYOAn0d/9oKvuGrNtUiOpA==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + agora-rtc-sdk-ng: 4.15.1 + react: 18.2.0 + dev: false + + /agora-rtc-sdk-ng@4.15.1: + resolution: {integrity: sha512-U1I1jOjs9NJSDPAsFuRUgiFgKRx8/J5rH12zNaAGyyXt3A+MPfYAccgfvlJIEhWn02ey97xXDklvufGercJcvw==} + dependencies: + agora-rte-extension: 1.2.3 + dev: false - /aggregate-error/3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + /agora-rte-extension@1.2.3: + resolution: {integrity: sha512-k3yNrYVyzJRoQJjaJUktKUI1XRtf8J1XsW8OzYKFqGlS8WQRMsES1+Phj2rfuEriiLObfuyuCimG6KHQCt5tiw==} + dev: false + + /ahooks-v3-count@1.0.0: + resolution: {integrity: sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ==} + dev: false + + /ahooks@3.7.4(react@18.2.0): + resolution: {integrity: sha512-hvgdqzPUKXn95mK3cGlDCi/ZZqv+FRibCUCFT8zW3hCwLGvixVfnHrIW2/2lgzPdLo8mLjp/XOdIJvcPvE2lgQ==} + engines: {node: '>=8.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true + '@types/js-cookie': 2.2.7 + ahooks-v3-count: 1.0.0 + dayjs: 1.11.7 + intersection-observer: 0.12.2 + js-cookie: 2.2.1 + lodash: 4.17.21 + react: 18.2.0 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.5.0 + dev: false - /airbnb-js-shims/2.2.1: + /airbnb-js-shims@2.2.1: resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} dependencies: - array-includes: 3.1.5 + array-includes: 3.1.6 array.prototype.flat: 1.3.0 - array.prototype.flatmap: 1.3.0 + array.prototype.flatmap: 1.3.1 es5-shim: 4.6.7 es6-shim: 0.35.6 function.prototype.name: 1.1.5 globalthis: 1.0.3 - object.entries: 1.1.5 - object.fromentries: 2.0.5 - object.getownpropertydescriptors: 2.1.3 - object.values: 1.1.5 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.getownpropertydescriptors: 2.1.5 + object.values: 1.1.6 promise.allsettled: 1.0.5 promise.prototype.finally: 3.1.3 - string.prototype.matchall: 4.0.7 + string.prototype.matchall: 4.0.8 string.prototype.padend: 3.1.3 string.prototype.padstart: 3.1.3 symbol.prototype.description: 1.0.5 dev: true - /ajv-errors/1.0.1_ajv@6.12.6: - resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} + /ajv-draft-04@1.0.0(ajv@8.12.0): + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: - ajv: '>=5.0.0' + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true dependencies: - ajv: 6.12.6 - dev: true + ajv: 8.12.0 + dev: false - /ajv-formats/2.1.1: + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true dependencies: - ajv: 8.11.0 - dev: true + ajv: 8.12.0 - /ajv-keywords/3.5.2_ajv@6.12.6: + /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-keywords/5.1.0_ajv@8.11.0: + /ajv-keywords@5.1.0(ajv@8.12.0): resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 dependencies: - ajv: 8.11.0 + ajv: 8.12.0 fast-deep-equal: 3.1.3 - dev: true - /ajv/6.12.6: + /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 - /ajv/8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /alphanum-sort/1.0.2: - resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} + /algoliasearch-helper@3.11.3(algoliasearch@4.14.3): + resolution: {integrity: sha512-TbaEvLwiuGygHQIB8y+OsJKQQ40+JKUua5B91X66tMUHyyhbNHvqyr0lqd3wCoyKx7WybyQrC0WJvzoIeh24Aw==} + peerDependencies: + algoliasearch: '>= 3.1 < 6' + dependencies: + '@algolia/events': 4.0.1 + algoliasearch: 4.14.3 + dev: false + + /algoliasearch@4.14.3: + resolution: {integrity: sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==} + dependencies: + '@algolia/cache-browser-local-storage': 4.14.3 + '@algolia/cache-common': 4.14.3 + '@algolia/cache-in-memory': 4.14.3 + '@algolia/client-account': 4.14.3 + '@algolia/client-analytics': 4.14.3 + '@algolia/client-common': 4.14.3 + '@algolia/client-personalization': 4.14.3 + '@algolia/client-search': 4.14.3 + '@algolia/logger-common': 4.14.3 + '@algolia/logger-console': 4.14.3 + '@algolia/requester-browser-xhr': 4.14.3 + '@algolia/requester-common': 4.14.3 + '@algolia/requester-node-http': 4.14.3 + '@algolia/transporter': 4.14.3 dev: false - /ansi-align/3.0.1: + /alphanum-sort@1.0.2: + resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} + + /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: string-width: 4.2.3 - dev: true - /ansi-colors/3.2.4: + /ansi-colors@3.2.4: resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} engines: {node: '>=6'} dev: true - /ansi-colors/4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes/1.4.0: + /ansi-escapes@1.4.0: resolution: {integrity: sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==} engines: {node: '>=0.10.0'} dev: false - /ansi-escapes/4.3.2: + /ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - /ansi-html-community/0.0.8: + /ansi-escapes@6.0.0: + resolution: {integrity: sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.6.0 + 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: + /ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} - /ansi-regex/3.0.1: + /ansi-regex@3.0.1: resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} engines: {node: '>=4'} dev: false - /ansi-regex/5.0.1: + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-styles/2.2.1: + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} dev: false - /ansi-styles/3.2.1: + /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: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /ansi-to-html/0.6.15: + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /ansi-to-html@0.6.15: resolution: {integrity: sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==} engines: {node: '>=8.0.0'} hasBin: true @@ -5791,61 +13773,64 @@ packages: entities: 2.2.0 dev: true - /antd/4.20.4_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-xtaMNuRvumMXQLsoAwiQRY5rEJVRtJGumby3aPIJdWXwBtZ7eDDuXbT/Uo8xT8rTND0cK5rRQlxMyisCJrZD9Q==} + /antd@4.24.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-N2odRsbomseCE3U845Whf+RdgmQbiWbKvWS6ggH/xHjXojHx951rmZXW4nMqAeSoUp66sQOASGtrP/SUsdA2oQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: '@ant-design/colors': 6.0.0 - '@ant-design/icons': 4.7.0_sfoxds7t5ydpegc3knd667wn6m - '@ant-design/react-slick': 0.28.4_react@17.0.2 - '@babel/runtime': 7.17.9 - '@ctrl/tinycolor': 3.4.1 - classnames: 2.3.1 - copy-to-clipboard: 3.3.1 + '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0) + '@ant-design/react-slick': 1.0.2(react@18.2.0) + '@babel/runtime': 7.21.0 + '@ctrl/tinycolor': 3.6.0 + classnames: 2.3.2 + copy-to-clipboard: 3.3.3 lodash: 4.17.21 - memoize-one: 6.0.0 - moment: 2.29.3 - rc-cascader: 3.5.0_sfoxds7t5ydpegc3knd667wn6m - rc-checkbox: 2.3.2_sfoxds7t5ydpegc3knd667wn6m - rc-collapse: 3.1.4_sfoxds7t5ydpegc3knd667wn6m - rc-dialog: 8.8.1_sfoxds7t5ydpegc3knd667wn6m - rc-drawer: 4.4.3_sfoxds7t5ydpegc3knd667wn6m - rc-dropdown: 3.5.2_sfoxds7t5ydpegc3knd667wn6m - rc-field-form: 1.26.4_sfoxds7t5ydpegc3knd667wn6m - rc-image: 5.6.2_sfoxds7t5ydpegc3knd667wn6m - rc-input: 0.0.1-alpha.7_sfoxds7t5ydpegc3knd667wn6m - rc-input-number: 7.3.4_sfoxds7t5ydpegc3knd667wn6m - rc-mentions: 1.7.1_sfoxds7t5ydpegc3knd667wn6m - rc-menu: 9.5.5_sfoxds7t5ydpegc3knd667wn6m - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-notification: 4.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-pagination: 3.1.16_sfoxds7t5ydpegc3knd667wn6m - rc-picker: 2.6.9_sfoxds7t5ydpegc3knd667wn6m - rc-progress: 3.2.4_sfoxds7t5ydpegc3knd667wn6m - rc-rate: 2.9.1_sfoxds7t5ydpegc3knd667wn6m - rc-resize-observer: 1.2.0_sfoxds7t5ydpegc3knd667wn6m - rc-segmented: 2.1.0_sfoxds7t5ydpegc3knd667wn6m - rc-select: 14.1.2_sfoxds7t5ydpegc3knd667wn6m - rc-slider: 10.0.0_sfoxds7t5ydpegc3knd667wn6m - rc-steps: 4.1.4_sfoxds7t5ydpegc3knd667wn6m - rc-switch: 3.2.2_sfoxds7t5ydpegc3knd667wn6m - rc-table: 7.24.1_sfoxds7t5ydpegc3knd667wn6m - rc-tabs: 11.13.0_sfoxds7t5ydpegc3knd667wn6m - rc-textarea: 0.3.7_sfoxds7t5ydpegc3knd667wn6m - rc-tooltip: 5.1.1_sfoxds7t5ydpegc3knd667wn6m - rc-tree: 5.5.0_sfoxds7t5ydpegc3knd667wn6m - rc-tree-select: 5.3.0_sfoxds7t5ydpegc3knd667wn6m - rc-trigger: 5.2.18_sfoxds7t5ydpegc3knd667wn6m - rc-upload: 4.3.3_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - scroll-into-view-if-needed: 2.2.29 - dev: false - - /anymatch/2.0.0: + moment: 2.29.4 + rc-cascader: 3.7.0(react-dom@18.2.0)(react@18.2.0) + rc-checkbox: 3.0.1(react-dom@18.2.0)(react@18.2.0) + rc-collapse: 3.4.2(react-dom@18.2.0)(react@18.2.0) + rc-dialog: 9.0.2(react-dom@18.2.0)(react@18.2.0) + rc-drawer: 6.3.0(react-dom@18.2.0)(react@18.2.0) + rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0) + rc-field-form: 1.34.2(react-dom@18.2.0)(react@18.2.0) + rc-image: 5.13.0(react-dom@18.2.0)(react@18.2.0) + rc-input: 0.1.4(react-dom@18.2.0)(react@18.2.0) + rc-input-number: 7.3.11(react-dom@18.2.0)(react@18.2.0) + rc-mentions: 1.13.1(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-notification: 4.6.1(react-dom@18.2.0)(react@18.2.0) + rc-pagination: 3.2.0(react-dom@18.2.0)(react@18.2.0) + rc-picker: 2.7.0(react-dom@18.2.0)(react@18.2.0) + rc-progress: 3.4.1(react-dom@18.2.0)(react@18.2.0) + rc-rate: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-segmented: 2.1.2(react-dom@18.2.0)(react@18.2.0) + rc-select: 14.1.18(react-dom@18.2.0)(react@18.2.0) + rc-slider: 10.0.1(react-dom@18.2.0)(react@18.2.0) + rc-steps: 5.0.0(react-dom@18.2.0)(react@18.2.0) + rc-switch: 3.2.2(react-dom@18.2.0)(react@18.2.0) + rc-table: 7.26.0(react-dom@18.2.0)(react@18.2.0) + rc-tabs: 12.5.7(react-dom@18.2.0)(react@18.2.0) + rc-textarea: 0.4.7(react-dom@18.2.0)(react@18.2.0) + rc-tooltip: 5.2.2(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.2(react-dom@18.2.0)(react@18.2.0) + rc-tree-select: 5.5.5(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-upload: 4.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + scroll-into-view-if-needed: 2.2.31 + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@2.0.0: resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} dependencies: micromatch: 3.1.10 @@ -5854,243 +13839,353 @@ packages: - supports-color dev: true - /anymatch/3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + /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 - /app-root-dir/1.0.2: + /app-root-dir@1.0.2: resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} dev: true - /append-buffer/1.0.2: + /append-buffer@1.0.2: resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} engines: {node: '>=0.10.0'} dependencies: - buffer-equal: 1.0.0 + buffer-equal: 1.0.1 dev: true - /aproba/1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: true - /aproba/2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + /archive-type@4.0.0: + resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==} + engines: {node: '>=4'} + dependencies: + file-type: 4.4.0 dev: true - /are-we-there-yet/2.0.0: + /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} dependencies: delegates: 1.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.1 dev: true - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - /arg/5.0.1: - resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==} + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: false - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - /aria-query/5.0.0: - resolution: {integrity: sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==} + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /args@5.0.3: + resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} + engines: {node: '>= 6.0.0'} + dependencies: + camelcase: 5.0.0 + chalk: 2.4.2 + leven: 2.1.0 + mri: 1.1.4 + + /aria-query@5.0.2: + resolution: {integrity: sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==} engines: {node: '>=6.0'} dev: true - /arr-diff/4.0.0: + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.0 + dev: true + + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: true - /arr-flatten/1.1.0: + /arr-flatten@1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} dev: true - /arr-union/3.1.0: + /arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: true - /array-flatten/1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + /array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} dev: true - /array-flatten/2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + /array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} + dev: false + + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + requiresBuild: true dev: true + optional: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-flatten@2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - /array-ify/1.0.0: + /array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-includes/3.1.5: - resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 - get-intrinsic: 1.1.1 + define-properties: 1.2.0 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 is-string: 1.0.7 dev: true - /array-tree-filter/2.1.0: + /array-move@3.0.1: + resolution: {integrity: sha512-H3Of6NIn2nNU1gsVDqDnYKY/LCdWvCMMOWifNGhKcVQgiZ6nOek39aESOvro6zmueP07exSl93YLvkN4fZOkSg==} + engines: {node: '>=10'} + dev: false + + /array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + dev: false + + /array-tree-filter@2.1.0: resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} dev: false - /array-union/1.0.2: + /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-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true - /array-uniq/1.0.3: + /array-uniq@1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array-unique/0.3.2: + /array-unique@0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.flat/1.3.0: + /array.prototype.flat@1.3.0: resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap/1.3.0: - resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==} + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 es-shim-unscopables: 1.0.0 dev: true - /array.prototype.map/1.0.4: + /array.prototype.map@1.0.4: resolution: {integrity: sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /array.prototype.map@1.0.5: + resolution: {integrity: sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + 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.1 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 + + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.0 dev: true - /arrify/1.0.1: + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /arrify/2.0.1: + /arrify@2.0.1: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} dev: true - /asn1.js/5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - dev: true + printable-characters: 1.0.42 + dev: false + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - /assert/1.5.0: - resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: - object-assign: 4.1.1 - util: 0.10.3 + safer-buffer: 2.1.2 + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} dev: true - /assign-symbols/1.0.0: + /assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: true - /ast-types/0.14.2: + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.5.0 + dev: true + + /ast-types@0.14.2: resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} engines: {node: '>=4'} dependencies: - tslib: 2.4.0 + tslib: 2.5.0 dev: true - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - dev: true - /async-each/1.0.3: - resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} + /async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + dependencies: + retry: 0.13.1 dev: true - optional: true - /async-validator/4.1.1: - resolution: {integrity: sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==} + /async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} dev: false - /async/3.2.3: - resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} - dev: true + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - /atob/2.1.2: + /atob@2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true dev: true - /autoprefixer/10.4.7_postcss@8.4.13: - resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + + /auto-bind@4.0.0: + resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} + engines: {node: '>=8'} + dev: false + + /autoprefixer@10.4.13(postcss@8.4.21): + resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.5 + caniuse-lite: 1.0.30001457 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + + /autoprefixer@10.4.13(postcss@8.4.27): + resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.20.3 - caniuse-lite: 1.0.30001339 + browserslist: 4.21.5 + caniuse-lite: 1.0.30001457 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.13 + postcss: 8.4.27 postcss-value-parser: 4.2.0 + dev: false - /autoprefixer/9.8.8: + /autoprefixer@9.8.8: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} hasBin: true dependencies: - browserslist: 4.20.3 - caniuse-lite: 1.0.30001339 + browserslist: 4.21.5 + caniuse-lite: 1.0.30001457 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -6098,26 +14193,106 @@ packages: postcss-value-parser: 4.2.0 dev: true - /axios/0.21.4: + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /awaitqueue@2.4.0: + resolution: {integrity: sha512-9nTnPxVuxiuKFTHslm9ltnekUECJidOQ5kE6JpZUH77KrKqStQuWUW7JPB2GJZ7rOwWLcbToHiIXle/nJe1VpQ==} + engines: {node: '>=8.0.0'} + dev: false + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4@1.11.0: + resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + dev: true + + /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.14.6 + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: false + + /axios@0.25.0: + resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} + dependencies: + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: false - /babel-jest/27.5.1_@babel+core@7.17.10: + /axios@0.26.1: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: false + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.3.2: + resolution: {integrity: sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.3.3: + resolution: {integrity: sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /b-tween@0.3.3: + resolution: {integrity: sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA==} + dev: false + + /b-validate@1.5.3: + resolution: {integrity: sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA==} + dev: false + + /babel-jest@27.5.1(@babel/core@7.21.0): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.17.10 + '@babel/core': 7.21.0 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/babel__core': 7.1.19 + '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1_@babel+core@7.17.10 + babel-preset-jest: 27.5.1(@babel/core@7.21.0) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -6125,41 +14300,55 @@ packages: - supports-color dev: true - /babel-loader/8.2.5_usdhdj5awexcm2e5jtwd44bofa: + /babel-loader@8.2.5(@babel/core@7.18.13)(webpack@5.75.0): resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 - webpack: '>=2' + webpack: 5.75.0 dependencies: - '@babel/core': 7.17.10 + '@babel/core': 7.18.13 find-cache-dir: 3.3.2 loader-utils: 2.0.2 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 4.46.0 + webpack: 5.75.0(esbuild@0.15.18) dev: true - /babel-loader/8.2.5_we4j6ycntotymd3gptdmlkk2fi: - resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} + /babel-loader@8.3.0(@babel/core@7.18.13)(webpack@5.75.0): + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 - webpack: '>=2' + webpack: 5.75.0 dependencies: - '@babel/core': 7.17.10 + '@babel/core': 7.18.13 find-cache-dir: 3.3.2 - loader-utils: 2.0.2 + loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.72.1 + webpack: 5.75.0(esbuild@0.15.18) dev: true - /babel-plugin-add-react-displayname/0.0.5: + /babel-loader@8.3.0(@babel/core@7.21.0)(webpack@5.75.0): + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: 5.75.0 + dependencies: + '@babel/core': 7.21.0 + find-cache-dir: 3.3.2 + loader-utils: 2.0.4 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 5.75.0(esbuild@0.15.18) + + /babel-plugin-add-react-displayname@0.0.5: resolution: {integrity: sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==} dev: true - /babel-plugin-apply-mdx-type-prop/1.6.22_@babel+core@7.12.9: + /babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} peerDependencies: '@babel/core': ^7.11.6 @@ -6167,146 +14356,168 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.10.4 '@mdx-js/util': 1.6.22 - dev: true - /babel-plugin-dynamic-import-node/2.3.3: + /babel-plugin-dynamic-import-node@2.3.3: resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} dependencies: - object.assign: 4.1.2 - dev: true - - /babel-plugin-emotion/10.2.2: - resolution: {integrity: sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==} - dependencies: - '@babel/helper-module-imports': 7.16.7 - '@emotion/hash': 0.8.0 - '@emotion/memoize': 0.7.4 - '@emotion/serialize': 0.11.16 - babel-plugin-macros: 2.8.0 - babel-plugin-syntax-jsx: 6.18.0 - convert-source-map: 1.8.0 - escape-string-regexp: 1.0.5 - find-root: 1.1.0 - source-map: 0.5.7 - dev: true + object.assign: 4.1.4 + dev: false - /babel-plugin-extract-import-names/1.6.22: + /babel-plugin-extract-import-names@1.6.22: resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==} dependencies: '@babel/helper-plugin-utils': 7.10.4 - dev: true - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-plugin-utils': 7.20.2 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.0 + istanbul-lib-instrument: 5.2.1 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-jest-hoist/27.5.1: + /babel-plugin-jest-hoist@27.5.1: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/template': 7.16.7 - '@babel/types': 7.17.10 - '@types/babel__core': 7.1.19 - '@types/babel__traverse': 7.17.1 - dev: true - - /babel-plugin-macros/2.8.0: - resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} - dependencies: - '@babel/runtime': 7.17.9 - cosmiconfig: 6.0.0 - resolve: 1.22.0 + '@babel/template': 7.20.7 + '@babel/types': 7.21.2 + '@types/babel__core': 7.20.0 + '@types/babel__traverse': 7.18.3 dev: true - /babel-plugin-macros/3.1.0: + /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.17.9 - cosmiconfig: 7.0.1 - resolve: 1.22.0 - dev: true + '@babel/runtime': 7.21.0 + cosmiconfig: 7.1.0 + resolve: 1.22.2 - /babel-plugin-named-asset-import/0.3.8_@babel+core@7.17.10: - resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.18.13): + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: - '@babel/core': ^7.1.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.10 + '@babel/compat-data': 7.21.0 + '@babel/core': 7.18.13 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.18.13) + semver: 6.3.0 + transitivePeerDependencies: + - supports-color dev: true - /babel-plugin-polyfill-corejs2/0.3.1_@babel+core@7.17.10: - resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.0): + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.10 - '@babel/core': 7.17.10 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.17.10 + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.0) semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.17.10: + /babel-plugin-polyfill-corejs3@0.1.7(@babel/core@7.21.0): resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.10 - '@babel/helper-define-polyfill-provider': 0.1.5_@babel+core@7.17.10 - core-js-compat: 3.22.5 + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.1.5(@babel/core@7.21.0) + core-js-compat: 3.28.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.5.2_@babel+core@7.17.10: - resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==} + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.18.13): + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.10 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.17.10 - core-js-compat: 3.22.5 + '@babel/core': 7.18.13 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.18.13) + core-js-compat: 3.28.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.17.10: - resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.0): + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.0) + core-js-compat: 3.28.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.18.13): + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.10 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.17.10 + '@babel/core': 7.18.13 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.18.13) transitivePeerDependencies: - supports-color dev: true - /babel-plugin-react-docgen/4.2.1: + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.0): + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.0) + transitivePeerDependencies: + - supports-color + + /babel-plugin-react-docgen@4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} dependencies: ast-types: 0.14.2 lodash: 4.17.21 - react-docgen: 5.4.0 + react-docgen: 5.4.3 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-syntax-jsx/6.18.0: + /babel-plugin-styled-components@2.0.7(styled-components@5.3.10): + resolution: {integrity: sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + babel-plugin-syntax-jsx: 6.18.0 + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.10(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + /babel-plugin-styled-components@2.0.7(styled-components@5.3.6): + resolution: {integrity: sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + babel-plugin-syntax-jsx: 6.18.0 + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + + /babel-plugin-syntax-jsx@6.18.0: resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} - dev: true - /babel-polyfill/6.23.0: + /babel-polyfill@6.23.0: resolution: {integrity: sha512-0l7mVU+LrQ2X/ZTUq63T5i3VyR2aTgcRTFmBcD6djQ/Fek6q1A9t5u0F4jZVYHzp78jwWAzGfLpAY1b4/I3lfg==} dependencies: babel-runtime: 6.26.0 @@ -6314,55 +14525,73 @@ packages: regenerator-runtime: 0.10.5 dev: false - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.17.10: + /babel-polyfill@6.26.0: + resolution: {integrity: sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==} + dependencies: + babel-runtime: 6.26.0 + core-js: 2.6.12 + regenerator-runtime: 0.10.5 + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.0): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.10 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.10 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.10 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.17.10 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.10 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.10 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.10 - dev: true - - /babel-preset-jest/27.5.1_@babel+core@7.17.10: + '@babel/core': 7.21.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.0) + dev: true + + /babel-preset-jest@27.5.1(@babel/core@7.21.0): resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.10 + '@babel/core': 7.21.0 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.10 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.0) dev: true - /babel-runtime/6.26.0: + /babel-runtime@6.26.0: resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} dependencies: core-js: 2.6.12 regenerator-runtime: 0.11.1 + + /bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false - /backo2/1.0.2: - resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} dev: false - /bail/1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: false - /base/0.11.2: + /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} dependencies: @@ -6375,113 +14604,140 @@ packages: pascalcase: 0.1.1 dev: true - /base64-arraybuffer/1.0.1: - resolution: {integrity: sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==} - engines: {node: '>= 0.6.0'} + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + /bcp47@1.1.2: + resolution: {integrity: sha512-JnkkL4GUpOvvanH9AZPX38CxhiLsXMBicBY2IAtqiVN8YulGDQybUydWA4W6yAMtw6iShtw+8HEF6cfrTHU+UQ==} + engines: {node: '>=0.10'} dev: false - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 - /batch-processor/1.0.0: - resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} - dev: true + /bcryptjs@2.4.3: + resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + dev: false - /batch/0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: true + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - /better-opn/2.1.1: + /better-opn@2.1.1: resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} engines: {node: '>8.0.0'} dependencies: open: 7.4.2 dev: true - /big-integer/1.6.51: + /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} - dev: false - - /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'} + requiresBuild: true dev: true optional: true - /binary-extensions/2.2.0: + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bindings/1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - requiresBuild: true + /bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} dependencies: - file-uri-to-path: 1.0.0 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 dev: true - optional: true - /bl/4.1.0: + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.1 + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.1 + + /block-stream2@2.1.0: + resolution: {integrity: sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==} + dependencies: + readable-stream: 3.6.1 dev: false - /bluebird/3.7.2: + /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true - /blueimp-canvas-to-blob/3.29.0: + /blueimp-canvas-to-blob@3.29.0: resolution: {integrity: sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==} dev: false - /bn.js/4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: true - - /bn.js/5.2.0: - resolution: {integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==} - dev: true - - /body-parser/1.20.0: - resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} + /body-parser@1.20.1: + 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.4 + content-type: 1.0.5 debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.10.3 + qs: 6.11.0 raw-body: 2.5.1 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /bonjour-service/1.0.12: - resolution: {integrity: sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==} + /bonjour-service@1.1.0: + resolution: {integrity: sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==} dependencies: array-flatten: 2.1.2 dns-equal: 1.0.0 fast-deep-equal: 3.1.3 - multicast-dns: 7.2.4 - dev: true + multicast-dns: 7.2.5 - /boolbase/1.0.0: + /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - /boxen/5.1.2: + /bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + dev: false + + /bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + dev: false + + /boxen@4.2.0: + resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==} + engines: {node: '>=8'} + dependencies: + ansi-align: 3.0.1 + camelcase: 5.3.1 + chalk: 3.0.0 + cli-boxes: 2.2.1 + string-width: 4.2.3 + term-size: 2.2.1 + type-fest: 0.8.1 + widest-line: 3.1.0 + dev: true + + /boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} dependencies: @@ -6493,21 +14749,69 @@ packages: type-fest: 0.20.2 widest-line: 3.1.0 wrap-ansi: 7.0.0 + + /boxen@6.2.1: + resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: false + + /boxen@7.0.0: + resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: true + + /boxen@7.0.1: + resolution: {integrity: sha512-8k2eH6SRAK00NDl1iX5q17RJ8rfl53TajdYxE3ssMLehbg487dEVgsad4pIsZb/QqBgYWIl6JOauMTLGX2Kpkw==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: true + + /bplist-parser@0.1.1: + resolution: {integrity: sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==} + requiresBuild: true + dependencies: + big-integer: 1.6.51 dev: true + optional: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true - /braces/2.3.2: + /braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} dependencies: @@ -6525,172 +14829,167 @@ packages: - supports-color dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /broadcast-channel/3.7.0: - resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} - dependencies: - '@babel/runtime': 7.17.9 - detect-node: 2.1.0 - js-sha3: 0.8.0 - microseconds: 0.2.0 - nano-time: 1.0.0 - oblivious-set: 1.0.0 - rimraf: 3.0.2 - unload: 2.2.0 + /browser-or-node@2.1.1: + resolution: {integrity: sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==} dev: false - /brorand/1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: true - - /browser-process-hrtime/1.0.0: + /browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: true - /browserify-aes/1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + /browserslist@4.21.3: + resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true 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 + caniuse-lite: 1.0.30001457 + electron-to-chromium: 1.4.310 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10(browserslist@4.21.3) - /browserify-cipher/1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + /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: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - dev: true + caniuse-lite: 1.0.30001457 + electron-to-chromium: 1.4.310 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10(browserslist@4.21.5) - /browserify-des/1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} dependencies: - cipher-base: 1.0.4 - des.js: 1.0.1 - inherits: 2.0.4 - safe-buffer: 5.2.1 + fast-json-stable-stringify: 2.1.0 dev: true - /browserify-rsa/4.1.0: - resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: - bn.js: 5.2.0 - randombytes: 2.1.0 + node-int64: 0.4.0 dev: true - /browserify-sign/4.2.1: - resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + /bson@4.7.0: + resolution: {integrity: sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==} + engines: {node: '>=6.9.0'} dependencies: - bn.js: 5.2.0 - 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.0 - safe-buffer: 5.2.1 + buffer: 5.7.1 + + /btoa-lite@1.0.0: + resolution: {integrity: sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==} + dev: false + + /buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} dev: true - /browserify-zlib/0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + /buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} dependencies: - pako: 1.0.11 + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 dev: true - /browserslist/4.20.3: - resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001339 - electron-to-chromium: 1.4.137 - escalade: 3.1.1 - node-releases: 2.0.4 - picocolors: 1.0.0 + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - /bs-logger/0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false - /bser/2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 + /buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} dev: true - /buffer-equal/1.0.0: - resolution: {integrity: sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==} - engines: {node: '>=0.4.0'} + /buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} dev: true - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - 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==} + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - isarray: 1.0.0 - dev: true - /buffer/5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + + /buildcheck@0.0.3: + resolution: {integrity: sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==} + engines: {node: '>=10.0.0'} + requiresBuild: true dev: false + optional: true - /builtin-modules/3.2.0: - resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - /builtin-status-codes/3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - dev: true - - /bundle-stats-webpack-plugin/3.3.8_webpack@5.73.0: - resolution: {integrity: sha512-z+IeVieDY749Jg7ai9pvTwFqAylZnTfDYF3/r1B6aFnwDEAjDetC60XuIqSs0F30EWow5v/1mkKBCdyiLWIrQw==} - engines: {node: '>= 12.0'} + /bundle-stats-webpack-plugin@4.2.3(react-dom@18.2.0)(react@18.2.0)(webpack@5.75.0): + resolution: {integrity: sha512-k4YK+Ofn77HDffUThCehdrDc8vLU3xwegYN4XVG1PKY4EKchSaI+rAbofg2kr82JdXzjlOEZ921VBEgQ4Zo9XQ==} + engines: {node: '>= 14.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: - '@bundle-stats/cli-utils': 3.3.8 - '@bundle-stats/utils': 3.3.8_xqc3ywgrobkwiqao2oqbih6pzm - core-js: 3.22.5 + '@bundle-stats/cli-utils': 4.2.3(lodash@4.17.21)(react-dom@18.2.0)(react@18.2.0) + core-js: 3.28.0 lodash: 4.17.21 - webpack: 5.73.0_webpack-cli@4.9.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + transitivePeerDependencies: + - react + - react-dom dev: true - /bytes/3.0.0: + /bytemd@1.21.0: + resolution: {integrity: sha512-6nc658omwzcLdc/lT24w8G2x5pptZXiMyrQPbFuHwhYbmrLnsmKLm+9klsOx2/Lg2cYHYb2WzVh7zKZ9MZCVdg==} + dependencies: + '@popperjs/core': 2.11.7 + '@types/codemirror': 5.60.7 + '@types/hast': 2.3.4 + '@types/lodash-es': 4.17.7 + '@types/mdast': 3.0.11 + codemirror-ssr: 0.65.0(@types/codemirror@5.60.7) + hast-util-sanitize: 4.1.0 + lodash-es: 4.17.21 + rehype-raw: 6.1.1 + rehype-sanitize: 5.0.1 + rehype-stringify: 9.0.3 + remark-parse: 10.0.1 + remark-rehype: 10.1.0 + select-files: 1.0.1 + tippy.js: 6.3.7 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + word-count: 0.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} - dev: true - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - /c8/7.11.2: - resolution: {integrity: sha512-6ahJSrhS6TqSghHm+HnWt/8Y2+z0hM/FQyB1ybKhAR30+NYL9CTQ1uwHxuWw6U7BHlHv6wvhgOrH81I+lfCkxg==} + /c8@7.12.0: + resolution: {integrity: sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==} engines: {node: '>=10.12.0'} hasBin: true dependencies: @@ -6700,35 +14999,15 @@ packages: foreground-child: 2.0.0 istanbul-lib-coverage: 3.2.0 istanbul-lib-report: 3.0.0 - istanbul-reports: 3.1.4 + istanbul-reports: 3.1.5 rimraf: 3.0.2 test-exclude: 6.0.0 - v8-to-istanbul: 9.0.0 + v8-to-istanbul: 9.0.1 yargs: 16.2.0 yargs-parser: 20.2.9 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.0 - graceful-fs: 4.2.10 - 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 - - /cacache/15.3.0: + /cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} dependencies: @@ -6736,10 +15015,10 @@ packages: '@npmcli/move-file': 1.1.2 chownr: 2.0.0 fs-minipass: 2.1.0 - glob: 7.2.0 + glob: 7.2.3 infer-owner: 1.0.4 lru-cache: 6.0.0 - minipass: 3.1.6 + minipass: 3.3.6 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -6748,13 +15027,13 @@ packages: promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 - tar: 6.1.11 + tar: 6.1.13 unique-filename: 1.1.1 transitivePeerDependencies: - bluebird dev: true - /cache-base/1.0.1: + /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} dependencies: @@ -6769,51 +15048,92 @@ packages: unset-value: 1.0.0 dev: true - /call-bind/1.0.2: + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: false + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + /cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + dev: false + + /cacheable-request@7.0.2: + resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.2 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.1.1 + get-intrinsic: 1.2.0 - /call-me-maybe/1.0.1: + /call-me-maybe@1.0.1: resolution: {integrity: sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==} - dev: true - /caller-callsite/2.0.0: + /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} dependencies: callsites: 2.0.0 - dev: false - /caller-path/2.0.0: + /caller-path@2.0.0: resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} engines: {node: '>=4'} dependencies: caller-callsite: 2.0.0 - dev: false - /callsites/2.0.0: + /callsites@2.0.0: resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} - dev: false - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camel-case/4.1.2: + /camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: false + + /camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.4.0 - dev: true + tslib: 2.5.0 - /camelcase-css/2.0.1: + /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /camelcase-keys/6.2.2: + /camelcase-keys@2.1.0: + resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + camelcase: 2.1.1 + map-obj: 1.0.1 + dev: true + optional: true + + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -6822,49 +15142,106 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase/5.3.1: + /camelcase-keys@7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + dependencies: + camelcase: 6.3.0 + map-obj: 4.3.0 + quick-lru: 5.1.1 + type-fest: 1.4.0 + dev: false + + /camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + + /camelcase@5.0.0: + resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} + engines: {node: '>=6'} + + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} dev: true - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} dev: true - /caniuse-api/3.0.0: + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.20.3 - caniuse-lite: 1.0.30001339 + browserslist: 4.21.5 + caniuse-lite: 1.0.30001457 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - dev: false - /caniuse-lite/1.0.30001339: - resolution: {integrity: sha512-Es8PiVqCe+uXdms0Gu5xP5PF2bxLR7OBp3wUzUnuO7OHzhOfCyg3hdiGWVPVxhiuniOzng+hTc1u3fEQ0TlkSQ==} + /caniuse-lite@1.0.30001457: + resolution: {integrity: sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==} + + /capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.0 + upper-case-first: 2.0.2 + dev: false - /capture-exit/2.0.0: + /capture-exit@2.0.0: resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} engines: {node: 6.* || 8.* || >= 10.*} dependencies: rsvp: 4.8.5 dev: true - /case-sensitive-paths-webpack-plugin/2.4.0: + /case-anything@2.1.10: + resolution: {integrity: sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==} + engines: {node: '>=12.13'} + dev: false + + /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} dev: true - /catenary-curve/1.0.1: + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /catenary-curve@1.0.1: resolution: {integrity: sha512-vSHQtYFjItV4wxUH5OkicA3Kmln6thBBWlJLiw2f4apfvkKw4BVe8bTbG6lnbJe60CIr8PyHzjSX27blSJ07Ww==} dev: false - /ccount/1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + /caw@2.0.1: + resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} + engines: {node: '>=4'} + dependencies: + get-proxy: 2.1.0 + isurl: 1.0.0 + tunnel-agent: 0.6.0 + url-to-options: 1.0.1 dev: true - /chalk/1.1.3: + /ccount@1.1.0: + resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} dependencies: @@ -6875,7 +15252,7 @@ packages: supports-color: 2.0.0 dev: false - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -6883,7 +15260,7 @@ packages: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk/3.0.0: + /chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} dependencies: @@ -6891,67 +15268,137 @@ packages: supports-color: 7.2.0 dev: true - /chalk/4.1.2: + /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 - /char-regex/1.0.2: + /chalk@5.1.2: + resolution: {integrity: sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + /change-case@3.1.0: + resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} + dependencies: + camel-case: 3.0.0 + constant-case: 2.0.0 + dot-case: 2.1.1 + header-case: 1.0.1 + is-lower-case: 1.1.3 + is-upper-case: 1.1.2 + lower-case: 1.1.4 + lower-case-first: 1.0.2 + no-case: 2.3.2 + param-case: 2.1.1 + pascal-case: 2.0.1 + path-case: 2.1.1 + sentence-case: 2.1.1 + snake-case: 2.1.0 + swap-case: 1.1.2 + title-case: 2.1.1 + upper-case: 1.1.3 + upper-case-first: 1.1.2 + dev: false + + /change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.5.0 + dev: false + + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /character-entities-legacy/1.1.4: + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - /character-entities/1.2.4: + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@1.2.4: resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - /character-reference-invalid/1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false - /charcodes/0.2.0: - resolution: {integrity: sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==} - engines: {node: '>=6'} - dev: true + /character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - /chardet/0.4.2: + /chardet@0.4.2: resolution: {integrity: sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==} dev: false - /chardet/0.7.0: + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} dev: false - /chokidar/2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} dependencies: - anymatch: 2.0.0 - async-each: 1.0.3 - braces: 2.3.2 - 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 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - dev: true - optional: true + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + dev: false + + /cheerio@1.0.0-rc.11: + resolution: {integrity: sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.0.1 + htmlparser2: 8.0.1 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + tslib: 2.5.0 + dev: false + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.0.1 + htmlparser2: 8.0.1 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: false - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: - anymatch: 3.1.2 + anymatch: 3.1.3 braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 @@ -6961,40 +15408,31 @@ packages: optionalDependencies: fsevents: 2.3.2 - /chownr/1.1.4: + /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true + dev: false - /chownr/2.0.0: + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} dev: true - /chrome-trace-event/1.0.3: + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - dev: true - /ci-info/2.0.0: + /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: true - - /ci-info/3.3.1: - resolution: {integrity: sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==} - 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 + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} - /cjs-module-lexer/1.2.2: + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /class-utils/0.3.6: + /class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} dependencies: @@ -7004,148 +15442,228 @@ packages: static-extend: 0.1.2 dev: true - /classnames/2.3.1: - resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==} + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} dev: false - /clean-css/4.2.4: + /clean-css@4.2.4: resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} engines: {node: '>= 4.0'} dependencies: source-map: 0.6.1 dev: true - /clean-css/5.3.0: - resolution: {integrity: sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==} + /clean-css@5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} engines: {node: '>= 10.0'} dependencies: source-map: 0.6.1 - dev: true - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - dev: true - /cli-boxes/2.2.1: + /cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} - dev: true - /cli-cursor/2.1.0: + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + /cli-color@0.3.2: + resolution: {integrity: sha512-Ys/nDhHNRcxrS4EUI2RS/QCUE+61AMuEOj3sWDX+EIHkJWj+4XkRbOdwdxJteAJKjXYBbeFJMtfaEPd1MBF9pQ==} + dependencies: + d: 0.1.1 + es5-ext: 0.10.62 + memoizee: 0.3.10 + timers-ext: 0.1.7 + + /cli-cursor@2.1.0: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} dependencies: restore-cursor: 2.0.0 - dev: false - /cli-cursor/3.1.0: + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 - /cli-spinners/2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + + /cli-spinners@2.7.0: + resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} engines: {node: '>=6'} - dev: false - /cli-table3/0.6.2: - resolution: {integrity: sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==} + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} engines: {node: 10.* || >= 12.*} dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - dev: true - /cli-truncate/2.1.0: + /cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} dependencies: slice-ansi: 3.0.0 string-width: 4.2.3 + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 dev: true - /cli-width/2.2.1: + /cli-width@2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} - dev: false - /cli-width/3.0.0: + /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - dev: false - /cliui/7.0.4: + /cli-width@4.0.0: + resolution: {integrity: sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==} + engines: {node: '>= 12'} + 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 - /clone-buffer/1.0.0: + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-buffer@1.0.0: resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} engines: {node: '>= 0.10'} dev: true - /clone-deep/4.0.1: + /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true - /clone-stats/1.0.0: + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + + /clone-stats@1.0.0: resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} dev: true - /clone/1.0.4: + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - dev: false - /clone/2.1.2: + /clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} dev: true - /cloneable-readable/1.1.3: + /cloneable-readable@1.1.3: resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} dependencies: inherits: 2.0.4 process-nextick-args: 2.0.1 - readable-stream: 2.3.7 + readable-stream: 2.3.8 + dev: true + + /clsx@1.1.0: + resolution: {integrity: sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==} + engines: {node: '>=6'} dev: true - /clsx/1.1.1: - resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} - /co/4.6.0: + /clui@0.3.6: + resolution: {integrity: sha512-Z4UbgZILlIAjkEkZiDOa2aoYjohKx7fa6DxIh6cE9A6WNWZ61iXfQc6CmdC9SKdS5nO0P0UyQ+WfoXfB65e3HQ==} + dependencies: + cli-color: 0.3.2 + + /cluster-key-slot@1.1.0: + resolution: {integrity: sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==} + engines: {node: '>=0.10.0'} + + /co@3.1.0: + resolution: {integrity: sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==} + dev: true + + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - /coa/2.0.2: + /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 + + /code-block-writer@11.0.3: + resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} + dev: false + + /code-excerpt@3.0.0: + resolution: {integrity: sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==} + engines: {node: '>=10'} + dependencies: + convert-to-spaces: 1.0.2 + dev: false + + /codemirror-ssr@0.65.0(@types/codemirror@5.60.7): + resolution: {integrity: sha512-ofTAfPkQV56SYFfymNMYJ1ELo3+Jnkw3mOLgnIiQjhonwNmNzX1OFvnihAnYRXL0PWl2kT7s0gKrLc2ExshK4g==} + peerDependencies: + '@types/codemirror': ^5.0.0 + dependencies: + '@types/codemirror': 5.60.7 + dev: false + + /codemirror@5.65.9: + resolution: {integrity: sha512-19Jox5sAKpusTDgqgKB5dawPpQcY+ipQK7xoEI+MVucEF9qqFaXpeqY1KaoyGBso/wHQoDa4HMMxMjdsS3Zzzw==} dev: false - /collapse-white-space/1.0.6: + /collapse-white-space@1.0.6: resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} - dev: true - /collect-v8-coverage/1.0.1: + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /collection-visit/1.0.0: + /collection-visit@1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: @@ -7153,43 +15671,45 @@ packages: object-visit: 1.0.1 dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /color-string/1.9.1: + /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: false - /color-support/1.1.3: + /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true dev: true - /color/3.2.1: + /color2k@2.0.0: + resolution: {integrity: sha512-DWX9eXOC4fbJNiuvdH4QSHvvfLWyFo9TuFp7V9OzdsbPAdrWAuYc8qvFP2bIQ/LKh4LrAVnJ6vhiQYPvAHdtTg==} + dev: false + + /color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} dependencies: color-convert: 1.9.3 color-string: 1.9.1 - dev: false - /color/4.2.3: + /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} dependencies: @@ -7197,276 +15717,702 @@ packages: color-string: 1.9.1 dev: false - /colorette/1.4.0: + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + /colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - dev: true - /colorette/2.0.16: - resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==} - dev: true + /colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + /combine-promises@1.1.0: + resolution: {integrity: sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==} + engines: {node: '>=10'} + dev: false - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: true - /comma-separated-tokens/1.0.8: + /comma-separated-tokens@1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - /commander/2.20.3: + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - /commander/4.1.1: + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + /commander@6.2.0: + resolution: {integrity: sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==} + engines: {node: '>= 6'} dev: true - /commander/6.2.1: + /commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} - dev: true - /commander/7.2.0: + /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - dev: true - /commander/8.3.0: + /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - /commitlint/12.1.4: - resolution: {integrity: sha512-SHmNe3eQrVIzxt0x5yyir8AKu6fB0DDf2Vs4Hvij5/T2ckJ22YQsLEpl1vPFKq6YPTmERjNxTgB2Dp2QQ3YTzg==} - engines: {node: '>=v10'} + /commander@9.4.0: + resolution: {integrity: sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==} + engines: {node: ^12.20.0 || >=14} + dev: false + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + requiresBuild: true + dev: true + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /compression@1.7.4: + 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 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /compressorjs@1.1.1: + resolution: {integrity: sha512-SysRuUPfmUNoq+RviE0iMFVUmoX2q/x+7PkEPUmk6NGkd85hDrmvujx0Qtp8UCGA6KMe5kuodsylPQcNaLf60w==} + dependencies: + blueimp-canvas-to-blob: 3.29.0 + is-blob: 2.1.0 + dev: false + + /compute-scroll-into-view@1.0.11: + resolution: {integrity: sha512-uUnglJowSe0IPmWOdDtrlHXof5CTIJitfJEyITHBW6zDVOGu9Pjk5puaLM73SLcwak0L4hEjO7Td88/a6P5i7A==} + dev: false + + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.1 + typedarray: 0.0.6 + dev: true + + /concurrently@7.6.0: + resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} + engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} hasBin: true dependencies: - '@commitlint/cli': 12.1.4 - '@commitlint/types': 12.1.4 - dev: true + chalk: 4.1.2 + date-fns: 2.29.3 + lodash: 4.17.21 + rxjs: 7.8.0 + shell-quote: 1.8.0 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.1 + dev: true + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.10 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + + /configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.10 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + dev: true + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /consolidate@0.15.1(ejs@3.1.8)(handlebars@4.7.7)(lodash@4.17.21): + 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 + ejs: 3.1.8 + handlebars: 4.7.7 + lodash: 4.17.21 + dev: true + + /constant-case@2.0.0: + resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + dependencies: + snake-case: 2.1.0 + upper-case: 1.1.3 + dev: false + + /constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.0 + upper-case: 2.0.2 + dev: false + + /content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + dev: false + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 - /common-path-prefix/3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} - /common-tags/1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 dev: true - /commondir/1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - - /compare-func/2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + /conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 + q: 1.5.1 dev: true - /component-emitter/1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + /conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 dev: true - /compressible/2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + /conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} dependencies: - mime-db: 1.52.0 + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 dev: true - /compression/1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + /conventional-changelog-conventionalcommits@5.0.0: + resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==} + engines: {node: '>=10'} dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 dev: true - /compressorjs/1.1.1: - resolution: {integrity: sha512-SysRuUPfmUNoq+RviE0iMFVUmoX2q/x+7PkEPUmk6NGkd85hDrmvujx0Qtp8UCGA6KMe5kuodsylPQcNaLf60w==} + /conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} dependencies: - blueimp-canvas-to-blob: 3.29.0 - is-blob: 2.1.0 - dev: false - - /compute-scroll-into-view/1.0.17: - resolution: {integrity: sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==} - - /concat-map/0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + dev: true - /concat-stream/1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + /conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.7 - typedarray: 0.0.6 + q: 1.5.1 dev: true - /connect-history-api-fallback/1.6.0: - resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} - engines: {node: '>=0.8'} + /conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 dev: true - /consola/2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + /conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 dev: true - /console-browserify/1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + /conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 dev: true - /console-control-strings/1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + /conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 dev: true - /constants-browserify/1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + /conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} dev: true - /content-disposition/0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + /conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-type/1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} - engines: {node: '>= 0.6'} + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.0 + split: 1.0.1 + through2: 4.0.2 dev: true - /conventional-changelog-angular/5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + /conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} engines: {node: '>=10'} dependencies: - compare-func: 2.0.0 - q: 1.5.1 + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 dev: true - /conventional-changelog-conventionalcommits/4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + /conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} engines: {node: '>=10'} dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 dev: true - /conventional-commits-parser/3.2.4: + /conventional-commits-parser@3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} engines: {node: '>=10'} hasBin: true dependencies: - is-text-path: 1.0.1 JSONStream: 1.3.5 + is-text-path: 1.0.1 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 dev: true - /convert-source-map/1.8.0: + /conventional-recommended-bump@6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 2.3.4 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + git-raw-commits: 2.0.11 + git-semver-tags: 4.1.1 + meow: 8.1.2 + q: 1.5.1 + dev: true + + /convert-source-map@1.8.0: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 - dev: true - /convert-units/3.0.0-beta.4: - resolution: {integrity: sha512-n/hYi+a2bj5PU0PJRn96Nv2wnJozXlWsVCpWTfbc2Yrl3M293u9Z/2NI5LelYpfyWpGTZaouZkOzHpBFGdk/UQ==} - dev: true + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - /cookie-signature/1.0.6: + /convert-to-spaces@1.0.2: + resolution: {integrity: sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==} + engines: {node: '>= 4'} + dev: false + + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true - /cookie/0.5.0: + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + + /cookiejar@2.1.3: + resolution: {integrity: sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==} dev: true - /copy-anything/2.0.6: + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} dependencies: is-what: 3.14.1 - dev: true - /copy-concurrently/1.0.5: - resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} + /copy-anything@3.0.3: + resolution: {integrity: sha512-fpW2W/BqEzqPp29QS+MwwfisHCQZtiduTe/m8idFo0xbti9fIZ2WVhAsCv4ggFVH3AgCkVdpoOCtQC6gBrdhjw==} + engines: {node: '>=12.13'} 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 + is-what: 4.1.8 + dev: false - /copy-descriptor/0.1.1: + /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true - /copy-to-clipboard/3.3.1: - resolution: {integrity: sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==} + /copy-text-to-clipboard@3.0.1: + resolution: {integrity: sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==} + engines: {node: '>=12'} + dev: false + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} dependencies: toggle-selection: 1.0.6 + dev: false - /copy-webpack-plugin/9.1.0_webpack@5.73.0: - resolution: {integrity: sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==} - engines: {node: '>= 12.13.0'} + /copy-webpack-plugin@11.0.0(webpack@5.75.0): + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} peerDependencies: - webpack: ^5.1.0 + webpack: 5.75.0 dependencies: - fast-glob: 3.2.11 + fast-glob: 3.2.12 glob-parent: 6.0.2 - globby: 11.1.0 + globby: 13.1.3 normalize-path: 3.0.0 - schema-utils: 3.1.1 - serialize-javascript: 6.0.0 - webpack: 5.73.0_webpack-cli@4.9.2 - dev: true + schema-utils: 4.0.0 + serialize-javascript: 6.0.1 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) - /core-js-compat/3.22.5: - resolution: {integrity: sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg==} + /core-js-compat@3.28.0: + resolution: {integrity: sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==} dependencies: - browserslist: 4.20.3 - semver: 7.0.0 - dev: true + browserslist: 4.21.5 - /core-js-pure/3.22.5: - resolution: {integrity: sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA==} + /core-js-pure@3.28.0: + resolution: {integrity: sha512-DSOVleA9/v3LNj/vFxAPfUHttKTzrB2RXhAPvR5TPXn4vrra3Z2ssytvRyt8eruJwAfwAiFADEbrjcRdcvPLQQ==} requiresBuild: true - dev: true - /core-js/2.6.12: + /core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.4 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. Please, upgrade your dependencies to the actual version of core-js. + 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.22.5: - resolution: {integrity: sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==} + /core-js@3.25.0: + resolution: {integrity: sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==} + requiresBuild: true + dev: true + + /core-js@3.28.0: + resolution: {integrity: sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==} requiresBuild: true + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: true - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + + /cosmiconfig-typescript-loader@4.3.0(@types/node@18.11.9)(cosmiconfig@8.0.0)(ts-node@10.9.1)(typescript@4.9.4): + resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': 18.11.9 + cosmiconfig: '>=7' + ts-node: 10.9.1 + typescript: 4.9.4 + dependencies: + '@types/node': 18.11.9 + cosmiconfig: 8.0.0 + ts-node: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + typescript: 4.9.4 dev: true - /cosmiconfig/5.2.1: + /cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} dependencies: @@ -7474,9 +16420,8 @@ packages: is-directory: 0.3.1 js-yaml: 3.14.1 parse-json: 4.0.0 - dev: false - /cosmiconfig/6.0.0: + /cosmiconfig@6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} dependencies: @@ -7485,10 +16430,9 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true - /cosmiconfig/7.0.1: - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.0 @@ -7497,7 +16441,17 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cp-file/7.0.0: + /cosmiconfig@8.0.0: + resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /cp-file@7.0.0: resolution: {integrity: sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==} engines: {node: '>=8'} dependencies: @@ -7507,7 +16461,17 @@ packages: p-event: 4.2.0 dev: true - /cpy/8.1.2: + /cpu-features@0.0.4: + resolution: {integrity: sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + buildcheck: 0.0.3 + nan: 2.16.0 + dev: false + optional: true + + /cpy@8.1.2: resolution: {integrity: sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==} engines: {node: '>=8'} dependencies: @@ -7524,44 +16488,30 @@ packages: - supports-color dev: true - /crc/3.8.0: + /crc@3.8.0: resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} dependencies: buffer: 5.7.1 dev: false - /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==} + /create-context-state@2.0.0(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-lJsJ9XTsFLQpeXQkowyT3v2vWdxsYWoUCntUjdUCBzLqhTeGSkuCP4SrBUmkKaDDCzxJEDlmqM4HH2KD+YXVHQ==} + peerDependencies: + '@types/react': 18.0.20 + react: ^16.14.0 || ^17 || ^18 + peerDependenciesMeta: + '@types/react': + optional: true 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 + '@babel/runtime': 7.21.0 + '@types/react': 18.0.20 + react: 18.2.0 + dev: false - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - /cross-env/7.0.3: + /cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true @@ -7569,7 +16519,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-fetch/3.1.5: + /cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: node-fetch: 2.6.7 @@ -7577,7 +16527,7 @@ packages: - encoding dev: false - /cross-spawn/6.0.5: + /cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} dependencies: @@ -7588,53 +16538,85 @@ packages: which: 1.3.1 dev: true - /cross-spawn/7.0.3: + /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 + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false - /crypto-random-string/2.0.0: + /crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + + /crypto-random-string@3.3.1: + resolution: {integrity: sha512-5j88ECEn6h17UePrLi6pn1JcLtAiANa3KExyr9y9Z5vo2mv56Gh3I4Aja/B9P9uyMwyxNHAHWv+nE72f30T5Dg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.8.1 + dev: false + + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 dev: true - /css-color-names/0.0.4: + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + /css-color-names@0.0.4: resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} - dev: false - /css-declaration-sorter/4.0.1: + /css-declaration-sorter@4.0.1: resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} engines: {node: '>4'} dependencies: postcss: 7.0.39 timsort: 0.3.0 + + /css-declaration-sorter@6.3.1(postcss@8.4.21): + resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.21 + dev: false + + /css-declaration-sorter@6.3.1(postcss@8.4.27): + resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.27 + + /css-in-js-utils@2.0.1: + resolution: {integrity: sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==} + dependencies: + hyphenate-style-name: 1.0.4 + isobject: 3.0.1 dev: false - /css-loader/3.6.0_webpack@4.46.0: + /css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + dependencies: + hyphenate-style-name: 1.0.4 + dev: false + + /css-loader@3.6.0(webpack@5.75.0): resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} engines: {node: '>= 8.9.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -7649,99 +16631,208 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.0 - webpack: 4.46.0 + webpack: 5.75.0(esbuild@0.15.18) + dev: true + + /css-loader@5.2.7(webpack@5.75.0): + resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: 5.75.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.21) + loader-utils: 2.0.4 + postcss: 8.4.21 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.21) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.21) + postcss-modules-scope: 3.0.0(postcss@8.4.21) + postcss-modules-values: 4.0.0(postcss@8.4.21) + postcss-value-parser: 4.2.0 + schema-utils: 3.1.1 + semver: 7.5.4 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) dev: true - /css-loader/5.2.7_webpack@5.73.0: - resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} - engines: {node: '>= 10.13.0'} + /css-loader@6.7.3(webpack@5.75.0): + resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: 5.75.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.27) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.27) + postcss-modules-scope: 3.0.0(postcss@8.4.27) + postcss-modules-values: 4.0.0(postcss@8.4.27) + postcss-value-parser: 4.2.0 + semver: 7.5.4 + webpack: 5.75.0(esbuild@0.15.18) + dev: false + + /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(esbuild@0.15.18)(webpack@5.75.0): + resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: 5.75.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + dependencies: + clean-css: 5.3.2 + cssnano: 5.1.15(postcss@8.4.27) + esbuild: 0.15.18 + jest-worker: 29.4.3 + postcss: 8.4.27 + schema-utils: 4.0.0 + serialize-javascript: 6.0.1 + source-map: 0.6.1 + webpack: 5.75.0(esbuild@0.15.18) + dev: false + + /css-minimizer-webpack-plugin@4.2.2(esbuild@0.12.29)(webpack@5.75.0): + resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} + engines: {node: '>= 14.15.0'} peerDependencies: - webpack: ^4.27.0 || ^5.0.0 + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: 5.75.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true dependencies: - icss-utils: 5.1.0_postcss@8.4.13 - loader-utils: 2.0.2 - postcss: 8.4.13 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.13 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.13 - postcss-modules-scope: 3.0.0_postcss@8.4.13 - postcss-modules-values: 4.0.0_postcss@8.4.13 - postcss-value-parser: 4.2.0 - schema-utils: 3.1.1 - semver: 7.3.7 - webpack: 5.73.0_webpack-cli@4.9.2 + cssnano: 5.1.15(postcss@8.4.27) + esbuild: 0.12.29 + jest-worker: 29.4.3 + postcss: 8.4.27 + schema-utils: 4.0.0 + serialize-javascript: 6.0.1 + source-map: 0.6.1 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) dev: true - /css-select-base-adapter/0.1.1: + /css-select-base-adapter@0.1.1: resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} - dev: false - /css-select/2.1.0: + /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: false - /css-select/4.3.0: + /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.0.1 - dev: true + nth-check: 2.1.1 + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.0.1 + nth-check: 2.1.1 + dev: false + + /css-to-react-native@3.0.0: + resolution: {integrity: sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 - /css-tree/1.0.0-alpha.37: + /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: false - /css-tree/1.1.3: + /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: false - /css-unit-converter/1.1.2: + /css-unit-converter@1.1.2: resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} dev: false - /css-what/3.4.2: + /css-what@3.4.2: resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} engines: {node: '>= 6'} - dev: false - /css-what/6.1.0: + /css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} - dev: true - /css.escape/1.5.1: + /css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: true - /css/3.0.0: - resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} - dependencies: - inherits: 2.0.4 - source-map: 0.6.1 - source-map-resolve: 0.6.0 - dev: true - - /cssesc/3.0.0: + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - /cssnano-preset-default/4.0.8: + /cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + dev: false + + /cssnano-preset-advanced@5.3.10(postcss@8.4.27): + resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + autoprefixer: 10.4.13(postcss@8.4.27) + cssnano-preset-default: 5.2.14(postcss@8.4.27) + postcss: 8.4.27 + postcss-discard-unused: 5.1.0(postcss@8.4.27) + postcss-merge-idents: 5.1.1(postcss@8.4.27) + postcss-reduce-idents: 5.2.0(postcss@8.4.27) + postcss-zindex: 5.1.0(postcss@8.4.27) + dev: false + + /cssnano-preset-default@4.0.8: resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} engines: {node: '>=6.9.0'} dependencies: @@ -7775,31 +16866,118 @@ packages: postcss-reduce-transforms: 4.0.2 postcss-svgo: 4.0.3 postcss-unique-selectors: 4.0.1 - dev: false - /cssnano-util-get-arguments/4.0.0: + /cssnano-preset-default@5.2.14(postcss@8.4.21): + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.3.1(postcss@8.4.21) + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-calc: 8.2.4(postcss@8.4.21) + postcss-colormin: 5.3.1(postcss@8.4.21) + postcss-convert-values: 5.1.3(postcss@8.4.21) + postcss-discard-comments: 5.1.2(postcss@8.4.21) + postcss-discard-duplicates: 5.1.0(postcss@8.4.21) + postcss-discard-empty: 5.1.1(postcss@8.4.21) + postcss-discard-overridden: 5.1.0(postcss@8.4.21) + postcss-merge-longhand: 5.1.7(postcss@8.4.21) + postcss-merge-rules: 5.1.4(postcss@8.4.21) + postcss-minify-font-values: 5.1.0(postcss@8.4.21) + postcss-minify-gradients: 5.1.1(postcss@8.4.21) + postcss-minify-params: 5.1.4(postcss@8.4.21) + postcss-minify-selectors: 5.2.1(postcss@8.4.21) + postcss-normalize-charset: 5.1.0(postcss@8.4.21) + postcss-normalize-display-values: 5.1.0(postcss@8.4.21) + postcss-normalize-positions: 5.1.1(postcss@8.4.21) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.21) + postcss-normalize-string: 5.1.0(postcss@8.4.21) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.21) + postcss-normalize-unicode: 5.1.1(postcss@8.4.21) + postcss-normalize-url: 5.1.0(postcss@8.4.21) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.21) + postcss-ordered-values: 5.1.3(postcss@8.4.21) + postcss-reduce-initial: 5.1.2(postcss@8.4.21) + postcss-reduce-transforms: 5.1.0(postcss@8.4.21) + postcss-svgo: 5.1.0(postcss@8.4.21) + postcss-unique-selectors: 5.1.1(postcss@8.4.21) + dev: false + + /cssnano-preset-default@5.2.14(postcss@8.4.27): + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.3.1(postcss@8.4.27) + cssnano-utils: 3.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-calc: 8.2.4(postcss@8.4.27) + postcss-colormin: 5.3.1(postcss@8.4.27) + postcss-convert-values: 5.1.3(postcss@8.4.27) + postcss-discard-comments: 5.1.2(postcss@8.4.27) + postcss-discard-duplicates: 5.1.0(postcss@8.4.27) + postcss-discard-empty: 5.1.1(postcss@8.4.27) + postcss-discard-overridden: 5.1.0(postcss@8.4.27) + postcss-merge-longhand: 5.1.7(postcss@8.4.27) + postcss-merge-rules: 5.1.4(postcss@8.4.27) + postcss-minify-font-values: 5.1.0(postcss@8.4.27) + postcss-minify-gradients: 5.1.1(postcss@8.4.27) + postcss-minify-params: 5.1.4(postcss@8.4.27) + postcss-minify-selectors: 5.2.1(postcss@8.4.27) + postcss-normalize-charset: 5.1.0(postcss@8.4.27) + postcss-normalize-display-values: 5.1.0(postcss@8.4.27) + postcss-normalize-positions: 5.1.1(postcss@8.4.27) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.27) + postcss-normalize-string: 5.1.0(postcss@8.4.27) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.27) + postcss-normalize-unicode: 5.1.1(postcss@8.4.27) + postcss-normalize-url: 5.1.0(postcss@8.4.27) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.27) + postcss-ordered-values: 5.1.3(postcss@8.4.27) + postcss-reduce-initial: 5.1.2(postcss@8.4.27) + postcss-reduce-transforms: 5.1.0(postcss@8.4.27) + postcss-svgo: 5.1.0(postcss@8.4.27) + postcss-unique-selectors: 5.1.1(postcss@8.4.27) + + /cssnano-util-get-arguments@4.0.0: resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} engines: {node: '>=6.9.0'} - dev: false - /cssnano-util-get-match/4.0.0: + /cssnano-util-get-match@4.0.0: resolution: {integrity: sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==} engines: {node: '>=6.9.0'} - dev: false - /cssnano-util-raw-cache/4.0.1: + /cssnano-util-raw-cache@4.0.1: resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} engines: {node: '>=6.9.0'} dependencies: postcss: 7.0.39 - dev: false - /cssnano-util-same-parent/4.0.1: + /cssnano-util-same-parent@4.0.1: resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} engines: {node: '>=6.9.0'} + + /cssnano-utils@3.1.0(postcss@8.4.21): + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 dev: false - /cssnano/4.1.11: + /cssnano-utils@3.1.0(postcss@8.4.27): + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /cssnano@4.1.11: resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} engines: {node: '>=6.9.0'} dependencies: @@ -7807,47 +16985,172 @@ packages: cssnano-preset-default: 4.0.8 is-resolvable: 1.1.0 postcss: 7.0.39 + + /cssnano@5.1.15(postcss@8.4.21): + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.21) + lilconfig: 2.1.0 + postcss: 8.4.21 + yaml: 1.10.2 dev: false - /csso/4.2.0: + /cssnano@5.1.15(postcss@8.4.27): + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.27) + lilconfig: 2.1.0 + postcss: 8.4.27 + yaml: 1.10.2 + + /csso@4.2.0: resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} engines: {node: '>=8.0.0'} dependencies: css-tree: 1.1.3 - dev: false - /cssom/0.3.8: + /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: true - /cssom/0.4.4: + /cssom@0.4.4: resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} dev: true - /cssstyle/2.3.0: + /cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 dev: true - /csstype/2.6.20: - resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} + /csstype@3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + + /currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + array-find-index: 1.0.2 dev: true + optional: true - /csstype/3.0.10: - resolution: {integrity: sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==} + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false - /cyclist/1.0.1: - resolution: {integrity: sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==} - dev: true + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + 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@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + 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@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /d@0.1.1: + resolution: {integrity: sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==} + dependencies: + es5-ext: 0.10.62 + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 - /dargs/7.0.0: + /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} dev: true - /data-urls/2.0.0: + /dash-get@1.0.2: + resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==} + dev: false + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-uri-to-buffer@3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} + dev: true + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: true + + /data-urls@2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} dependencies: @@ -7856,15 +17159,26 @@ packages: whatwg-url: 8.7.0 dev: true - /date-fns/2.28.0: - resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==} + /date-fns@2.29.3: + resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} engines: {node: '>=0.11'} + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: false - /dayjs/1.10.7: - resolution: {integrity: sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==} + /dayjs@1.11.5: + resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==} + dev: false + + /dayjs@1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} - /debug/2.6.9: + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -7873,9 +17187,8 @@ packages: optional: true dependencies: ms: 2.0.0 - dev: true - /debug/3.2.7: + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -7884,10 +17197,10 @@ packages: optional: true dependencies: ms: 2.1.3 - dev: true + supports-color: 5.5.0 - /debug/4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + /debug@4.3.4(supports-color@5.5.0): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -7896,9 +17209,10 @@ packages: optional: true dependencies: ms: 2.1.2 + supports-color: 5.5.0 - /debug/4.3.3_supports-color@8.1.1: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + /debug@4.3.4(supports-color@9.2.2): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -7907,91 +17221,207 @@ packages: optional: true dependencies: ms: 2.1.2 - supports-color: 8.1.1 - dev: true + supports-color: 9.2.2 - /decamelize-keys/1.1.0: - resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: decamelize: 1.2.0 map-obj: 1.0.1 dev: true - /decamelize/1.2.0: + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} dev: true - /decimal.js/10.3.1: - resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /decode-uri-component/0.2.0: - resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} - /dedent/0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 dev: true - /deep-is/0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + /decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + dev: true + + /decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + dev: true + + /decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + dev: true + + /decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.10 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + dev: true + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-object-diff/1.1.7: - resolution: {integrity: sha512-QkgBca0mL08P6HiOjoqvmm6xOAl2W6CT2+34Ljhg0OeFan8cwlcdq8jrLKsBBuUFAZLsN5b6y491KdKEoSo9lg==} + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /deep-equal@2.2.0: + resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} + dependencies: + call-bind: 1.0.2 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.0 + is-arguments: 1.1.1 + is-array-buffer: 3.0.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.9 dev: true - /deepmerge/2.2.1: + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deepmerge@2.2.1: resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} engines: {node: '>=0.10.0'} dev: false - /deepmerge/4.2.2: + /deepmerge@4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} + dev: false + + /deepmerge@4.3.0: + resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} + engines: {node: '>=0.10.0'} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /default-browser-id@1.0.4: + resolution: {integrity: sha512-qPy925qewwul9Hifs+3sx1ZYn14obHxpkX+mPD369w4Rzg+YkJBgi3SOvwUq81nWSjqGUegIgEPwD8u+HUnxlw==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dependencies: + bplist-parser: 0.1.1 + meow: 3.7.0 + untildify: 2.1.0 + dev: true + optional: true - /default-gateway/6.0.3: + /default-gateway@6.0.3: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} dependencies: execa: 5.1.1 - dev: true - /defaults/1.0.3: - resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 - dev: false - /define-lazy-prop/2.0.0: + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - dev: true - /define-properties/1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /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 - /define-property/0.2.5: + /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: + /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: + /define-property@2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} engines: {node: '>=0.10.0'} dependencies: @@ -7999,366 +17429,574 @@ packages: isobject: 3.0.1 dev: true - /defined/1.0.0: - resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} + /defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: false + + /degenerator@3.0.2: + resolution: {integrity: sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==} + engines: {node: '>= 6'} + dependencies: + ast-types: 0.13.4 + escodegen: 1.14.3 + esprima: 4.0.1 + vm2: 3.9.14 + dev: true + + /del@5.1.0: + resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} + engines: {node: '>=8'} + dependencies: + globby: 10.0.1 + graceful-fs: 4.2.10 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 3.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: false + + /del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.10 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 dev: false - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true - /delegates/1.0.0: + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - /depd/1.1.2: + /denque@1.5.1: + resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} + engines: {node: '>=0.10'} + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} - dev: true - /depd/2.0.0: + /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 + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false - /destroy/1.2.0: + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - /detab/2.0.4: + /detab@2.0.4: resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} dependencies: repeat-string: 1.6.1 - dev: true - /detect-newline/3.1.0: + /detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + dev: false + + /detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + dev: false + + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /detect-node/2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - - /detect-port/1.3.0: - resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==} + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + /detect-package-manager@2.0.1: + resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} engines: {node: '>= 4.2.1'} hasBin: true dependencies: - address: 1.2.0 + address: 1.2.2 debug: 2.6.9 transitivePeerDependencies: - supports-color - dev: true + dev: false + + /detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + dependencies: + address: 1.2.2 + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color - /detective/5.2.0: - resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} + /detective@5.2.1: + resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} engines: {node: '>=0.8.0'} hasBin: true dependencies: acorn-node: 1.8.2 - defined: 1.0.0 - minimist: 1.2.6 + defined: 1.0.1 + minimist: 1.2.8 dev: false - /didyoumean/1.2.2: + /dezalgo@1.0.3: + resolution: {integrity: sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: true + + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: false - /diff-sequences/27.5.1: + /diff-sequences@26.6.2: + resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} + engines: {node: '>= 10.14.2'} + dev: true + + /diff-sequences@27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /diff/4.0.2: + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - /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 + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false - /dir-glob/2.2.2: + /dir-glob@2.2.2: resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} engines: {node: '>=4'} dependencies: path-type: 3.0.0 dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 - dev: true - /dlv/1.1.3: + /direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + dev: false + + /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: false - /dns-equal/1.0.0: + /dnd-core@16.0.1: + resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} + dependencies: + '@react-dnd/asap': 5.0.2 + '@react-dnd/invariant': 4.0.2 + redux: 4.2.1 + dev: false + + /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: true - /dns-packet/5.3.1: - resolution: {integrity: sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==} + /dns-packet@5.4.0: + resolution: {integrity: sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==} engines: {node: '>=6'} dependencies: '@leichtgewicht/ip-codec': 2.0.4 - dev: true - /doctrine/2.1.0: + /docker-modem@3.0.6: + resolution: {integrity: sha512-h0Ow21gclbYsZ3mkHDfsYNDqtRhXS8fXr51bU0qr1dxgTMJj0XufbzX+jhNOvA8KuEEzn6JbvLVhXyv+fny9Uw==} + engines: {node: '>= 8.0'} + dependencies: + debug: 4.3.4(supports-color@9.2.2) + readable-stream: 3.6.1 + split-ca: 1.0.1 + ssh2: 1.11.0 + transitivePeerDependencies: + - supports-color + dev: false + + /dockerode@3.3.4: + resolution: {integrity: sha512-3EUwuXnCU+RUlQEheDjmBE0B7q66PV9Rw5NiH1sXwINq0M9c5ERP9fxgkw36ZHOtzf4AGEEYySnkx/sACC9EgQ==} + engines: {node: '>= 8.0'} + dependencies: + '@balena/dockerignore': 1.0.2 + docker-modem: 3.0.6 + tar-fs: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 - dev: true - /dom-accessibility-api/0.5.14: + /docusaurus-plugin-image-zoom@0.1.1: + resolution: {integrity: sha512-cJXo5TKh9OR1gE4B5iS5ovLWYYDFwatqRm00iXFPOaShZG99l5tgkDKgbQPAwSL9wg4I+wz3aMwkOtDhMIpKDQ==} + dependencies: + medium-zoom: 1.0.8 + dev: false + + /docusaurus-plugin-less@2.0.2(@docusaurus/core@2.4.0)(less-loader@10.2.0)(less@4.1.3): + resolution: {integrity: sha512-ez6WSSvGS8HoJslYHeG5SflyShWvHFXeTTHXPBd3H1T3zgq9wp6wD7scXm+rXyyfhFhP5VNiIqhYB78z4OLjwg==} + peerDependencies: + '@docusaurus/core': '>=2.0.0-beta.9' + less: '>=4.0.0' + less-loader: '>=10.0.0' + dependencies: + '@docusaurus/core': 2.4.0(@docusaurus/types@2.4.0)(esbuild@0.15.18)(eslint@8.34.0)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.4) + less: 4.1.3 + less-loader: 10.2.0(less@4.1.3)(webpack@5.75.0) + dev: false + + /dom-accessibility-api@0.5.14: resolution: {integrity: sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==} dev: true - /dom-align/1.12.3: - resolution: {integrity: sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==} + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: true + + /dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} dev: false - /dom-converter/0.2.0: + /dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} dependencies: utila: 0.4.0 - dev: true - /dom-helpers/5.2.1: + /dom-helpers@3.4.0: + resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} + dependencies: + '@babel/runtime': 7.21.0 + dev: false + + /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.17.9 - csstype: 3.0.10 + '@babel/runtime': 7.21.0 + csstype: 3.1.1 dev: false - /dom-serializer/0.2.2: + /dom-serializer@0.2.2: resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} dependencies: domelementtype: 2.3.0 entities: 2.2.0 - dev: false - /dom-serializer/1.4.1: + /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 entities: 2.2.0 - /dom-walk/0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dev: true + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 - /domain-browser/1.2.0: - resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} - engines: {node: '>=0.4', npm: '>=1.2'} - dev: true + /dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - /domelementtype/1.3.1: + /domelementtype@1.3.1: resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - dev: false - /domelementtype/2.3.0: + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - /domexception/2.0.1: + /domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} dependencies: webidl-conversions: 5.0.0 dev: true - /domhandler/4.3.1: + /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} dependencies: domelementtype: 2.3.0 - /domutils/1.7.0: + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + + /domino@2.1.6: + resolution: {integrity: sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==} + dev: false + + /domutils@1.7.0: resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} dependencies: dom-serializer: 0.2.2 domelementtype: 1.3.1 - dev: false - /domutils/2.8.0: + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 - /dot-case/3.0.4: + /domutils@3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + /dot-case@2.1.1: + resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + dependencies: + no-case: 2.3.2 + dev: false + + /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.4.0 - dev: true + tslib: 2.5.0 - /dot-prop/5.3.0: + /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} dependencies: is-obj: 2.0.0 - /dotenv-expand/5.1.0: + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} dev: true - /dotenv/10.0.0: + /dotenv@10.0.0: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} - dev: true - /dotenv/8.6.0: + /dotenv@16.0.2: + resolution: {integrity: sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==} + engines: {node: '>=12'} + dev: false + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + + /download-git-repo@3.0.2: + resolution: {integrity: sha512-N8hWXD4hXqmEcNoR8TBYFntaOcYvEQ7Bz90mgm3bZRTuteGQqwT32VDMnTyD0KTEvb8BWrMc1tVmzuV9u/WrAg==} + dependencies: + download: 7.1.0 + git-clone: 0.1.0 + rimraf: 3.0.2 dev: true - /downshift/6.1.7_react@17.0.2: - resolution: {integrity: sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==} - peerDependencies: - react: '>=16.12.0' + /download@7.1.0: + resolution: {integrity: sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==} + engines: {node: '>=6'} dependencies: - '@babel/runtime': 7.17.9 - compute-scroll-into-view: 1.0.17 - prop-types: 15.8.1 - react: 17.0.2 - react-is: 17.0.2 - tslib: 2.4.0 + archive-type: 4.0.0 + caw: 2.0.1 + content-disposition: 0.5.4 + decompress: 4.2.1 + ext-name: 5.0.0 + file-type: 8.1.0 + filenamify: 2.1.0 + get-stream: 3.0.0 + got: 11.8.3 + make-dir: 1.3.0 + p-event: 2.3.1 + pify: 3.0.0 dev: true - /dts-generator/3.0.0: + /dts-generator@3.0.0: resolution: {integrity: sha512-IrFP0TUGnBOxr8Lth0hLh/iM9odZTRGYyr4Y46IRxyw1SGO1Vvf30+x4npck9yP4FbaRXbB0Zh7gvmiqUta7mg==} hasBin: true dependencies: - glob: 7.2.0 + glob: 7.2.3 mkdirp: 0.5.6 dev: true - /duplexer/0.1.2: + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - /duplexify/3.7.1: + /duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 stream-shift: 1.0.1 dev: true - /ee-first/1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 dev: true - /ejs/3.1.8: + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /ejs@3.1.8: resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} engines: {node: '>=0.10.0'} hasBin: true dependencies: jake: 10.8.5 - dev: true - /electron-to-chromium/1.4.137: - resolution: {integrity: sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==} - - /element-resize-detector/1.2.4: - resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} - dependencies: - batch-processor: 1.0.0 - dev: true + /electron-to-chromium@1.4.310: + resolution: {integrity: sha512-/xlATgfwkm5uDDwLw5nt/MNEf7c1oazLURMZLy39vOioGYyYzLWIDT8fZMJak6qTiAJ7udFTy7JG7ziyjNutiA==} - /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 + /email-regex@5.0.0: + resolution: {integrity: sha512-he76Cm8JFxb6OGQHabLBPdsiStgPmJeAEhctmw0uhonUh1pCBsHpI6/rB62s2GNzjBb0YlhIcF/1l9Lp5AfH0Q==} + engines: {node: '>=12'} + dev: false - /emittery/0.8.1: + /emittery@0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} engines: {node: '>=10'} dev: true - /emoji-mart/3.0.1_react@17.0.2: - resolution: {integrity: sha512-sxpmMKxqLvcscu6mFn9ITHeZNkGzIvD0BSNFE/LJESPbCA8s1jM6bCDPjWbV31xHq7JXaxgpHxLB54RCbBZSlg==} + /emoji-mart@5.5.2: + resolution: {integrity: sha512-Sqc/nso4cjxhOwWJsp9xkVm8OF5c+mJLZJFoFfzRuKO+yWiN7K8c96xmtughYb0d/fZ8UC6cLIQ/p4BR6Pv3/A==} + dev: false + + /emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /emojibase-data@6.2.0(emojibase@6.1.0): + resolution: {integrity: sha512-SWKaXD2QeQs06IE7qfJftsI5924Dqzp+V9xaa5RzZIEWhmlrG6Jt2iKwfgOPHu+5S8MEtOI7GdpKsXj46chXOw==} peerDependencies: - react: ^0.14.0 || ^15.0.0-0 || ^16.0.0 || ^17.0.0 + emojibase: '*' dependencies: - '@babel/runtime': 7.17.9 - prop-types: 15.8.0 - react: 17.0.2 + emojibase: 6.1.0 dev: false - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /emojibase-regex@5.1.3: + resolution: {integrity: sha512-gT8T9LxLA8VJdI+8KQtyykB9qKzd7WuUL3M2yw6y9tplFeufOUANg3UKVaKUvkMcRNvZsSElWhxcJrx8WPE12g==} + dev: false - /emojis-list/3.0.0: + /emojibase-regex@6.0.1: + resolution: {integrity: sha512-Mj1UT6IIk4j91yMFE0QetpUYcmsr5ZDkkOIMSGafhIgC086mBMaCh2Keaykx8YEllmV7hmx5zdANDzCYBYAVDw==} + dev: false + + /emojibase@5.2.0: + resolution: {integrity: sha512-5T02oTJaWpScAtYbukKVc8vQ1367MyfVtFHUMoOVZ9/r1kFcbYqjSktD56TICBAeyW9uc1t+7qQuXEtntM6p5A==} + dev: false + + /emojibase@6.1.0: + resolution: {integrity: sha512-1GkKJPXP6tVkYJHOBSJHoGOr/6uaDxZ9xJ6H7m6PfdGXTmQgbALHLWaVRY4Gi/qf5x/gT/NUXLPuSHYLqtLtrQ==} + dev: false + + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - dev: true - /emotion-theming/10.3.0_gfrer23gq2rp2t523t6qbxrx6m: - resolution: {integrity: sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==} - peerDependencies: - '@emotion/core': ^10.0.27 - react: '>=16.3.0' - dependencies: - '@babel/runtime': 7.17.9 - '@emotion/core': 10.3.1_react@17.0.2 - '@emotion/weak-memoize': 0.2.5 - hoist-non-react-statics: 3.3.2 - react: 17.0.2 - dev: true + /emoticon@3.2.0: + resolution: {integrity: sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==} + dev: false - /encodeurl/1.0.2: + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - dev: true - /encoding/0.1.13: + /encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} dependencies: iconv-lite: 0.6.3 dev: false - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: true - /endent/2.1.0: + /endent@2.1.0: resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==} dependencies: dedent: 0.7.0 @@ -8366,417 +18004,592 @@ packages: objectorarray: 1.0.5 dev: true - /engine.io-client/6.1.1: - resolution: {integrity: sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==} + /engine.io-client@6.2.2: + resolution: {integrity: sha512-8ZQmx0LQGRTYkHuogVZuGSpDqYZtCM/nv8zQ68VZ+JkOpazJ7ICdsSpaO6iXwvaU30oFg5QJOJWj8zWqhbKjkQ==} dependencies: - '@socket.io/component-emitter': 3.0.0 - debug: 4.3.3 - engine.io-parser: 5.0.2 - has-cors: 1.1.0 - parseqs: 0.0.6 - parseuri: 0.0.6 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + engine.io-parser: 5.0.6 ws: 8.2.3 xmlhttprequest-ssl: 2.0.0 - yeast: 0.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /engine.io-client@6.4.0: + resolution: {integrity: sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + engine.io-parser: 5.0.6 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: false - /engine.io-parser/5.0.2: - resolution: {integrity: sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==} - engines: {node: '>=10.0.0'} + /engine.io-client@6.5.1: + resolution: {integrity: sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng==} dependencies: - base64-arraybuffer: 1.0.1 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + engine.io-parser: 5.1.0 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate dev: false - /enhanced-resolve/4.5.0: - resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} - engines: {node: '>=6.9.0'} + /engine.io-parser@5.0.6: + resolution: {integrity: sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==} + engines: {node: '>=10.0.0'} + + /engine.io-parser@5.1.0: + resolution: {integrity: sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==} + engines: {node: '>=10.0.0'} + dev: false + + /engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + dev: false + + /engine.io@6.5.2: + resolution: {integrity: sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==} + engines: {node: '>=10.2.0'} dependencies: - graceful-fs: 4.2.10 - memory-fs: 0.5.0 - tapable: 1.1.3 - dev: true + '@types/cookie': 0.4.1 + '@types/cors': 2.8.12 + '@types/node': 18.11.9 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4(supports-color@9.2.2) + engine.io-parser: 5.2.1 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false - /enhanced-resolve/5.9.3: - resolution: {integrity: sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==} + /enhanced-resolve@5.12.0: + resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.10 tapable: 2.2.1 - dev: true - /enquirer/2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.1 - dev: true - - /ensure-array/1.0.0: + /ensure-array@1.0.0: resolution: {integrity: sha512-A+3Ntl5WS+GjDnHtC67dKIjw+IoGoeFdNvjn3ZfKEmZgWUz0nxBPE4W52QMCbGZsat0VwWskD5T6AEpe3T2d1g==} dev: true - /entities/2.2.0: + /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - /entities/3.0.1: + /entities@3.0.1: resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} engines: {node: '>=0.12'} dev: false - /envinfo/7.8.1: + /entities@4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + + /env-ci@7.3.0: + resolution: {integrity: sha512-L8vK54CSjKB4pwlwx0YaqeBdUSGufaLHl/pEgD+EqnMrYCVUA8HzMjURALSyvOlC57e953yN7KyXS63qDoc3Rg==} + engines: {node: '>=12.20'} + dependencies: + execa: 5.1.1 + fromentries: 1.3.2 + java-properties: 1.0.2 + dev: true + + /envinfo@7.8.1: resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} engines: {node: '>=4'} hasBin: true - dev: true - /eol/0.9.1: + /eol@0.9.1: resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} dev: true - /errno/0.1.8: + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: false + + /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true requiresBuild: true dependencies: prr: 1.0.1 - dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - /error-stack-parser/2.0.7: - resolution: {integrity: sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==} + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: - stackframe: 1.2.1 - dev: true + stackframe: 1.3.4 - /es-abstract/1.20.0: - resolution: {integrity: sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA==} + /es-abstract@1.21.1: + resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} engines: {node: '>= 0.4'} dependencies: + available-typed-arrays: 1.0.5 call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 function-bind: 1.1.1 function.prototype.name: 1.1.5 - get-intrinsic: 1.1.1 + 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.3 - is-callable: 1.2.4 + internal-slot: 1.0.5 + is-array-buffer: 3.0.1 + 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.0 + object-inspect: 1.12.3 object-keys: 1.1.1 - object.assign: 4.1.2 + object.assign: 4.1.4 regexp.prototype.flags: 1.4.3 - string.prototype.trimend: 1.0.5 - string.prototype.trimstart: 1.0.5 + safe-regex-test: 1.0.0 + 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 - /es-array-method-boxes-properly/1.0.0: + /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - /es-get-iterator/1.1.2: - resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==} + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.1 + get-intrinsic: 1.2.0 has-symbols: 1.0.3 is-arguments: 1.1.1 is-map: 2.0.2 is-set: 2.0.2 is-string: 1.0.7 isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 dev: true - /es-module-lexer/0.9.3: + /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - /es-shim-unscopables/1.0.0: + /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 + + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: - is-callable: 1.2.4 + is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - /es5-shim/4.6.7: + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + + /es5-shim@4.6.7: resolution: {integrity: sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==} engines: {node: '>=0.4.0'} dev: true - /es6-shim/0.35.6: + /es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: false + + /es6-iterator@0.1.3: + resolution: {integrity: sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==} + dependencies: + d: 0.1.1 + es5-ext: 0.10.62 + es6-symbol: 2.0.1 + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + + /es6-shim@0.35.6: resolution: {integrity: sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==} dev: true - /esbuild-android-64/0.14.39: - resolution: {integrity: sha512-EJOu04p9WgZk0UoKTqLId9VnIsotmI/Z98EXrKURGb3LPNunkeffqQIkjS2cAvidh+OK5uVrXaIP229zK6GvhQ==} + /es6-symbol@2.0.1: + resolution: {integrity: sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==} + dependencies: + d: 0.1.1 + es5-ext: 0.10.62 + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.6.0 + + /es6-weak-map@0.1.4: + resolution: {integrity: sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==} + dependencies: + d: 0.1.1 + es5-ext: 0.10.62 + es6-iterator: 0.1.3 + es6-symbol: 2.0.1 + + /esbuild-android-64@0.15.18: + resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true - /esbuild-android-arm64/0.14.39: - resolution: {integrity: sha512-+twajJqO7n3MrCz9e+2lVOnFplRsaGRwsq1KL/uOy7xK7QdRSprRQcObGDeDZUZsacD5gUkk6OiHiYp6RzU3CA==} + /esbuild-android-arm64@0.15.18: + resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true - /esbuild-darwin-64/0.14.39: - resolution: {integrity: sha512-ImT6eUw3kcGcHoUxEcdBpi6LfTRWaV6+qf32iYYAfwOeV+XaQ/Xp5XQIBiijLeo+LpGci9M0FVec09nUw41a5g==} + /esbuild-darwin-64@0.15.18: + resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true - /esbuild-darwin-arm64/0.14.39: - resolution: {integrity: sha512-/fcQ5UhE05OiT+bW5v7/up1bDsnvaRZPJxXwzXsMRrr7rZqPa85vayrD723oWMT64dhrgWeA3FIneF8yER0XTw==} + /esbuild-darwin-arm64@0.15.18: + resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true - /esbuild-freebsd-64/0.14.39: - resolution: {integrity: sha512-oMNH8lJI4wtgN5oxuFP7BQ22vgB/e3Tl5Woehcd6i2r6F3TszpCnNl8wo2d/KvyQ4zvLvCWAlRciumhQg88+kQ==} + /esbuild-freebsd-64@0.15.18: + resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true - /esbuild-freebsd-arm64/0.14.39: - resolution: {integrity: sha512-1GHK7kwk57ukY2yI4ILWKJXaxfr+8HcM/r/JKCGCPziIVlL+Wi7RbJ2OzMcTKZ1HpvEqCTBT/J6cO4ZEwW4Ypg==} + /esbuild-freebsd-arm64@0.15.18: + resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true - /esbuild-linux-32/0.14.39: - resolution: {integrity: sha512-g97Sbb6g4zfRLIxHgW2pc393DjnkTRMeq3N1rmjDUABxpx8SjocK4jLen+/mq55G46eE2TA0MkJ4R3SpKMu7dg==} + /esbuild-linux-32@0.15.18: + resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-64/0.14.39: - resolution: {integrity: sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ==} + /esbuild-linux-64@0.15.18: + resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-arm/0.14.39: - resolution: {integrity: sha512-t0Hn1kWVx5UpCzAJkKRfHeYOLyFnXwYynIkK54/h3tbMweGI7dj400D1k0Vvtj2u1P+JTRT9tx3AjtLEMmfVBQ==} + /esbuild-linux-arm64@0.15.18: + resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-arm64/0.14.39: - resolution: {integrity: sha512-23pc8MlD2D6Px1mV8GMglZlKgwgNKAO8gsgsLLcXWSs9lQsCYkIlMo/2Ycfo5JrDIbLdwgP8D2vpfH2KcBqrDQ==} + /esbuild-linux-arm@0.15.18: + resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-mips64le/0.14.39: - resolution: {integrity: sha512-epwlYgVdbmkuRr5n4es3B+yDI0I2e/nxhKejT9H0OLxFAlMkeQZxSpxATpDc9m8NqRci6Kwyb/SfmD1koG2Zuw==} + /esbuild-linux-mips64le@0.15.18: + resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-ppc64le/0.14.39: - resolution: {integrity: sha512-W/5ezaq+rQiQBThIjLMNjsuhPHg+ApVAdTz2LvcuesZFMsJoQAW2hutoyg47XxpWi7aEjJGrkS26qCJKhRn3QQ==} + /esbuild-linux-ppc64le@0.15.18: + resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-riscv64/0.14.39: - resolution: {integrity: sha512-IS48xeokcCTKeQIOke2O0t9t14HPvwnZcy+5baG13Z1wxs9ZrC5ig5ypEQQh4QMKxURD5TpCLHw2W42CLuVZaA==} + /esbuild-linux-riscv64@0.15.18: + resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-s390x/0.14.39: - resolution: {integrity: sha512-zEfunpqR8sMomqXhNTFEKDs+ik7HC01m3M60MsEjZOqaywHu5e5682fMsqOlZbesEAAaO9aAtRBsU7CHnSZWyA==} + /esbuild-linux-s390x@0.15.18: + resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-loader/2.18.0_webpack@5.73.0: - resolution: {integrity: sha512-AKqxM3bI+gvGPV8o6NAhR+cBxVO8+dh+O0OXBHIXXwuSGumckbPWHzZ17subjBGI2YEGyJ1STH7Haj8aCrwL/w==} + /esbuild-loader@2.21.0(webpack@5.75.0): + resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: - webpack: ^4.40.0 || ^5.0.0 + webpack: 5.75.0 dependencies: - esbuild: 0.14.39 + esbuild: 0.16.17 joycon: 3.1.1 - json5: 2.2.1 - loader-utils: 2.0.2 + json5: 2.2.3 + loader-utils: 2.0.4 tapable: 2.2.1 - webpack: 5.73.0_webpack-cli@4.9.2 - webpack-sources: 2.3.1 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + webpack-sources: 1.4.3 dev: true - /esbuild-netbsd-64/0.14.39: - resolution: {integrity: sha512-Uo2suJBSIlrZCe4E0k75VDIFJWfZy+bOV6ih3T4MVMRJh1lHJ2UyGoaX4bOxomYN3t+IakHPyEoln1+qJ1qYaA==} + /esbuild-netbsd-64@0.15.18: + resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true - /esbuild-openbsd-64/0.14.39: - resolution: {integrity: sha512-secQU+EpgUPpYjJe3OecoeGKVvRMLeKUxSMGHnK+aK5uQM3n1FPXNJzyz1LHFOo0WOyw+uoCxBYdM4O10oaCAA==} + /esbuild-openbsd-64@0.15.18: + resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true - /esbuild-sunos-64/0.14.39: - resolution: {integrity: sha512-qHq0t5gePEDm2nqZLb+35p/qkaXVS7oIe32R0ECh2HOdiXXkj/1uQI9IRogGqKkK+QjDG+DhwiUw7QoHur/Rwg==} + /esbuild-sunos-64@0.15.18: + resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true - /esbuild-windows-32/0.14.39: - resolution: {integrity: sha512-XPjwp2OgtEX0JnOlTgT6E5txbRp6Uw54Isorm3CwOtloJazeIWXuiwK0ONJBVb/CGbiCpS7iP2UahGgd2p1x+Q==} + /esbuild-windows-32@0.15.18: + resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-64/0.14.39: - resolution: {integrity: sha512-E2wm+5FwCcLpKsBHRw28bSYQw0Ikxb7zIMxw3OPAkiaQhLVr3dnVO8DofmbWhhf6b97bWzg37iSZ45ZDpLw7Ow==} + /esbuild-windows-64@0.15.18: + resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-arm64/0.14.39: - resolution: {integrity: sha512-sBZQz5D+Gd0EQ09tZRnz/PpVdLwvp/ufMtJ1iDFYddDaPpZXKqPyaxfYBLs3ueiaksQ26GGa7sci0OqFzNs7KA==} + /esbuild-windows-arm64@0.15.18: + resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild/0.12.29: + /esbuild@0.12.29: resolution: {integrity: sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==} hasBin: true requiresBuild: true - - /esbuild/0.14.39: - resolution: {integrity: sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ==} + + /esbuild@0.15.18: + resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.18 + '@esbuild/linux-loong64': 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 + + /esbuild@0.16.17: + resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 + dev: true + + /esbuild@0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-64: 0.14.39 - esbuild-android-arm64: 0.14.39 - esbuild-darwin-64: 0.14.39 - esbuild-darwin-arm64: 0.14.39 - esbuild-freebsd-64: 0.14.39 - esbuild-freebsd-arm64: 0.14.39 - esbuild-linux-32: 0.14.39 - esbuild-linux-64: 0.14.39 - esbuild-linux-arm: 0.14.39 - esbuild-linux-arm64: 0.14.39 - esbuild-linux-mips64le: 0.14.39 - esbuild-linux-ppc64le: 0.14.39 - esbuild-linux-riscv64: 0.14.39 - esbuild-linux-s390x: 0.14.39 - esbuild-netbsd-64: 0.14.39 - esbuild-openbsd-64: 0.14.39 - esbuild-sunos-64: 0.14.39 - esbuild-windows-32: 0.14.39 - esbuild-windows-64: 0.14.39 - esbuild-windows-arm64: 0.14.39 - dev: true - - /escalade/3.1.1: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html/1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + /escape-goat@2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} + engines: {node: '>=8'} + + /escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} dev: true - /escape-string-regexp/1.0.5: + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} - dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + /escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 dev: true - /escodegen/2.0.0: + /escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} hasBin: true @@ -8789,242 +18602,263 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.5.0_eslint@7.32.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + /eslint-config-prettier@8.6.0(eslint@8.34.0): + resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 7.32.0 + eslint: 8.34.0 dev: true - /eslint-plugin-prettier/3.4.1_evcial7aw3q6fcauxv2c7fxuoe: - resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} - engines: {node: '>=6.0.0'} + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.34.0)(prettier@2.8.4): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} peerDependencies: - eslint: '>=5.0.0' + eslint: '>=7.28.0' eslint-config-prettier: '*' - prettier: '>=1.13.0' + prettier: '>=2.0.0' peerDependenciesMeta: eslint-config-prettier: optional: true dependencies: - eslint: 7.32.0 - eslint-config-prettier: 8.5.0_eslint@7.32.0 - prettier: 2.6.2 + eslint: 8.34.0 + eslint-config-prettier: 8.6.0(eslint@8.34.0) + prettier: 2.8.4 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-react/7.29.4_eslint@7.32.0: - resolution: {integrity: sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==} + /eslint-plugin-react@7.32.2(eslint@8.34.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.5 - array.prototype.flatmap: 1.3.0 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 7.32.0 + eslint: 8.34.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.0 + jsx-ast-utils: 3.3.3 minimatch: 3.1.2 - object.entries: 1.1.5 - object.fromentries: 2.0.5 - object.hasown: 1.1.1 - object.values: 1.1.5 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 prop-types: 15.8.1 - resolve: 2.0.0-next.3 + resolve: 2.0.0-next.4 semver: 6.3.0 - string.prototype.matchall: 4.0.7 + string.prototype.matchall: 4.0.8 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: + /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/2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} + /eslint-scope@7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - eslint-visitor-keys: 1.3.0 - dev: true + esrecurse: 4.3.0 + estraverse: 5.3.0 - /eslint-utils/3.0.0_eslint@7.32.0: + /eslint-utils@3.0.0(eslint@8.34.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 7.32.0 + eslint: 8.34.0 eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys/1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true - - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} - dev: true - /eslint/7.32.0: - resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} - engines: {node: ^10.12.0 || >=12.0.0} + /eslint-visitor-keys@3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.34.0: + resolution: {integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@babel/code-frame': 7.12.11 - '@eslint/eslintrc': 0.4.3 - '@humanwhocodes/config-array': 0.5.0 + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.3 + debug: 4.3.4(supports-color@9.2.2) doctrine: 3.0.0 - enquirer: 2.3.6 escape-string-regexp: 4.0.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - eslint-visitor-keys: 2.1.0 - espree: 7.3.1 - esquery: 1.4.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0(eslint@8.34.0) + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.2 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 13.14.0 - ignore: 4.0.6 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 - js-yaml: 3.14.1 + is-path-inside: 3.0.3 + js-sdsl: 4.3.0 + js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.1 - progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.7 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 - table: 6.8.0 text-table: 0.2.0 - v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color - dev: true - /espree/7.3.1: - resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} - engines: {node: ^10.12.0 || >=12.0.0} + /espree@9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 - eslint-visitor-keys: 1.3.0 - dev: true + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + eslint-visitor-keys: 3.3.0 - /esprima-next/5.8.2: - resolution: {integrity: sha512-DGYvXt8ZiJ+vbEeqyt1A/BGPr2+0u8zyKKYlS0EiaaVs4SJgaxyJ2zkc6fZr+Y1NWSZLvoLhqGH+BpcylI6Iwg==} + /esprima-next@5.8.4: + resolution: {integrity: sha512-8nYVZ4ioIH4Msjb/XmhnBdz5WRRBaYqevKa1cv9nGJdCehMbzZCPNEEnqfLCZVetUVrUPEcb5IYyu1GG4hFqgg==} engines: {node: '>=12'} hasBin: true dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - /esquery/1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + /esquery@1.4.2: + resolution: {integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 - dev: true - /esrecurse/4.3.0: + /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: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} - dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true - /estree-to-babel/3.2.1: + /estree-to-babel@3.2.1: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 - c8: 7.11.2 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + c8: 7.12.0 transitivePeerDependencies: - supports-color dev: true - /estree-walker/0.6.1: + /estree-walker@0.2.1: + resolution: {integrity: sha512-6/I1dwNKk0N9iGOU3ydzAAurz4NPo/ttxZNCqgIVbWFvWyzWBSNonRrJ5CpjDuyBfmM7ENN7WCzUi9aT/UPXXQ==} + dev: true + + /estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} dev: true - /estree-walker/1.0.1: + /estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - /estree-walker/2.0.2: + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: false - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true - /etag/1.8.1: + /eta@2.0.0: + resolution: {integrity: sha512-NqE7S2VmVwgMS8yBxsH4VgNQjNjLq1gfGU0u9I6Cjh468nPRMoDfGdK9n1p/3Dvsw3ebklDkZsFAnKJ9sefjBA==} + engines: {node: '>=6.0.0'} + dev: false + + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - dev: true - /eventemitter3/4.0.7: + /eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + dependencies: + '@types/node': 18.11.9 + require-like: 0.1.2 + dev: false + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /eventemitter-strict@1.0.1: + resolution: {integrity: sha512-zbePIHR/HVKUpbKSKGxtAVhHjpuiLNp/s0ZYElSvxujE2jNb505+Wv+uUWbRi/bmsbgjvvFImS8HhhNMVHgJdg==} + dev: false + + /eventemitter2@6.4.7: + resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} + + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - /events/3.3.0: + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - /evp_bytestokey/1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 + /eventsource@1.1.2: + resolution: {integrity: sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA==} + engines: {node: '>=0.12.0'} dev: true - /exec-sh/0.3.6: + /eventsource@2.0.2: + resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} + engines: {node: '>=12.0.0'} + dev: false + + /exec-sh@0.3.6: resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} dev: true - /execa/1.0.0: + /execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} dependencies: @@ -9033,11 +18867,11 @@ packages: is-stream: 1.1.0 npm-run-path: 2.0.2 p-finally: 1.0.0 - signal-exit: 3.0.6 + signal-exit: 3.0.7 strip-eof: 1.0.0 dev: true - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -9048,16 +18882,35 @@ packages: merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 - signal-exit: 3.0.6 + signal-exit: 3.0.7 strip-final-newline: 2.0.0 + + /execa@6.1.0: + resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 3.0.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 dev: true - /exit/0.1.2: + /exeq@3.0.0: + resolution: {integrity: sha512-5H1FyhvvvxOIcpO2QMlYkC/GIx7wfVPBGaOgzNHIrbmpdtg225yZeCnrI4pnvQgsOUmYV1Nn/G02na7N2rrX2A==} + engines: {node: '>= 0.10.0'} + dev: true + + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expand-brackets/2.1.4: + /expand-brackets@2.1.4: resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: @@ -9072,7 +18925,14 @@ packages: - supports-color dev: true - /expect/27.5.1: + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: false + + /expect@27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -9082,15 +18942,46 @@ packages: jest-message-util: 27.5.1 dev: true - /express/4.18.1: - resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} + /expect@29.4.3: + resolution: {integrity: sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.4.3 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.4.3 + jest-message-util: 29.4.3 + jest-util: 29.5.0 + dev: true + + /express-handlebars@6.0.6: + resolution: {integrity: sha512-E4QHYCh+9fyfdBEb8uKJ8p6HD4qq/sUSHBq83lRNlLJp2TQKEg2nFJYbVdC+M3QzaV19dODe43lgjQWVaIpbyQ==} + engines: {node: '>=v12.22.9'} + dependencies: + glob: 8.1.0 + graceful-fs: 4.2.10 + handlebars: 4.7.7 + dev: false + + /express-mongoose-ra-json-server@0.1.0(express@4.18.2)(mongoose@6.1.1): + resolution: {integrity: sha512-y/Z5zb3RWVsCLgof8MMWMmpyAe2ZUEy6sYqczELOqaCr0cChbI9Y1VNr5DcbwEjqWmEIoU9aqcsURoUse8r/gw==} + peerDependencies: + express: ^4.0.0 || ^3.0.0 + mongoose: 6.1.1 + dependencies: + escape-string-regexp: 4.0.0 + express: 4.18.2 + mongoose: 6.1.1 + dev: false + + /express@4.18.2: + 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.0 + body-parser: 1.20.1 content-disposition: 0.5.4 - content-type: 1.0.4 + content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 debug: 2.6.9 @@ -9107,7 +18998,7 @@ packages: parseurl: 1.3.3 path-to-regexp: 0.1.7 proxy-addr: 2.0.7 - qs: 6.10.3 + qs: 6.11.0 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.18.0 @@ -9119,16 +19010,34 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color + + /ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + dependencies: + mime-db: 1.52.0 + dev: true + + /ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 dev: true - /extend-shallow/2.0.1: + /ext@1.6.0: + resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} + dependencies: + type: 2.7.2 + + /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: + /extend-shallow@3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: @@ -9136,10 +19045,10 @@ packages: is-extendable: 1.0.1 dev: true - /extend/3.0.2: + /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - /external-editor/2.2.0: + /external-editor@2.2.0: resolution: {integrity: sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==} engines: {node: '>=0.12'} dependencies: @@ -9148,16 +19057,15 @@ packages: tmp: 0.0.33 dev: false - /external-editor/3.1.0: + /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: false - /extglob/2.0.4: + /extglob@2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} dependencies: @@ -9173,15 +19081,35 @@ packages: - supports-color dev: true - /fast-deep-equal/3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + /extract-domain@2.2.1: + resolution: {integrity: sha512-lOq1adCJha0tFFBci4quxC4XLa6+Rs2WgAwTo9qbO9OsElvJmGgCvOzmHo/yg5CiqeP4+sHjkXYGkrCcIEprMg==} + dev: false + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} dev: true - /fast-diff/1.2.0: + /fake-mediastreamtrack@1.1.6: + resolution: {integrity: sha512-lcoO5oPsW57istAsnjvQxNjBEahi18OdUhWfmEewwfPfzNZnji5OXuodQM+VnUPi/1HnQRJ6gBUjbt1TNXrkjQ==} + dependencies: + event-target-shim: 5.0.1 + uuid: 8.3.2 + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/2.2.7: + /fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + dev: false + + /fast-glob@2.2.7: resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} engines: {node: '>=4.0.0'} dependencies: @@ -9195,8 +19123,8 @@ packages: - supports-color dev: true - /fast-glob/3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -9205,119 +19133,232 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-parse/1.0.3: + /fast-json-parse@1.0.3: resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - /fastest-levenshtein/1.0.12: - resolution: {integrity: sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==} - dev: true + /fast-redact@3.1.2: + resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} + engines: {node: '>=6'} + dev: false + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + /fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + dev: false - /fastq/1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + /fast-url-parser@1.1.3: + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} dependencies: - reusify: 1.0.4 + punycode: 1.4.1 + dev: false - /fault/1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + /fast-xml-parser@4.2.6: + resolution: {integrity: sha512-Xo1qV++h/Y3Ng8dphjahnYe+rGHaaNdsYOBWL9Y9GCPKpNKilJtilvWkLcI9f9X2DoKTLsZsGYAls5+JL5jfLA==} + hasBin: true dependencies: - format: 0.2.2 - dev: true + strnum: 1.0.5 + dev: false + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + /fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + dev: false - /faye-websocket/0.11.4: + /fastest-validator@1.13.0: + resolution: {integrity: sha512-mDFnLPAQ1inK0Ql5xagQPgcdMP9TnUoun/O0lXjK6FJ1GEKI8CKEvcz0xXQmDWviUWHwLsSB1BSRindq1zc6Gw==} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} dependencies: websocket-driver: 0.7.4 - dev: true - /fb-watchman/2.0.1: - resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /figgy-pudding/3.5.2: - resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} + /fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + dependencies: + fbjs: 3.0.4 + transitivePeerDependencies: + - encoding + dev: false + + /fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: false + + /fbjs@3.0.4: + resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==} + dependencies: + cross-fetch: 3.1.5 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 0.7.33 + transitivePeerDependencies: + - encoding + dev: false + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + dependencies: + xml-js: 1.6.11 + dev: false + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: true + + /fetch-retry@5.0.3: + resolution: {integrity: sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw==} dev: true - /figures/2.0.0: + /fflate@0.4.8: + resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} + dev: false + + /figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} dependencies: escape-string-regexp: 1.0.5 dev: false - /figures/3.2.0: + /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - dev: false - /file-entry-cache/6.0.1: + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: true + + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 - dev: true - /file-loader/6.2.0_webpack@4.46.0: + /file-loader@6.2.0(webpack@5.75.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.4 schema-utils: 3.1.1 - webpack: 4.46.0 - dev: true + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) - /file-loader/6.2.0_webpack@5.73.0: - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + /file-system-cache@1.1.0: + resolution: {integrity: sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw==} dependencies: - loader-utils: 2.0.2 - schema-utils: 3.1.1 - webpack: 5.73.0_webpack-cli@4.9.2 + fs-extra: 10.1.0 + ramda: 0.28.0 dev: true - /file-system-cache/1.0.5: - resolution: {integrity: sha512-w9jqeQdOeVaXBCgl4c90XJ6zI8MguJgSiC5LsLdhUu6eSCzcRHPPXUF3lkKMagpzHi+6GnDkjv9BtxMmXdvptA==} + /file-type@16.5.4: + resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} + engines: {node: '>=10'} dependencies: - bluebird: 3.7.2 - fs-extra: 0.30.0 - ramda: 0.21.0 + readable-web-to-node-stream: 3.0.2 + strtok3: 6.3.0 + token-types: 4.2.1 dev: true - /file-uri-to-path/1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - requiresBuild: true + /file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + dev: true + + /file-type@4.4.0: + resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==} + engines: {node: '>=4'} + dev: true + + /file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + dev: true + + /file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + dev: true + + /file-type@8.1.0: + resolution: {integrity: sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==} + engines: {node: '>=6'} dev: true - optional: true - /filelist/1.0.4: + /file-uri-to-path@2.0.0: + resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==} + engines: {node: '>= 6'} + dev: true + + /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: - minimatch: 5.0.1 + minimatch: 5.1.6 + + /filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + dev: true + + /filenamify@2.1.0: + resolution: {integrity: sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==} + engines: {node: '>=4'} + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 dev: true - /filesize/8.0.7: + /filesize@8.0.7: resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} engines: {node: '>= 0.4.0'} dev: false - /fill-range/4.0.0: + /fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: @@ -9327,17 +19368,17 @@ packages: to-regex-range: 2.1.1 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /filter-obj/1.1.0: + /filter-obj@1.1.0: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} - /finalhandler/1.2.0: + /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: @@ -9350,9 +19391,8 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /find-cache-dir/2.1.0: + /find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} dependencies: @@ -9361,62 +19401,158 @@ packages: pkg-dir: 3.0.0 dev: true - /find-cache-dir/3.3.2: + /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-root/1.1.0: + /find-process@1.4.7: + resolution: {integrity: sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==} + hasBin: true + dependencies: + chalk: 4.1.2 + commander: 5.1.0 + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color + dev: false + + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + optional: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 dev: true - /find-up/3.0.0: + /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: + /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 - /find-up/5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /findup-sync@5.0.0: + resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} + engines: {node: '>= 10.13.0'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + dev: false + + /fined@2.0.0: + resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} + engines: {node: '>= 10.13.0'} dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true + expand-tilde: 2.0.2 + is-plain-object: 5.0.0 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + dev: false - /flat-cache/3.0.4: + /flagged-respawn@2.0.0: + resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} + engines: {node: '>= 10.13.0'} + dev: false + + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.5 + flatted: 3.2.7 rimraf: 3.0.2 - dev: true - /flatted/3.2.5: - resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: false + + /flatstr@1.0.12: + resolution: {integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==} + dev: false - /flush-write-stream/1.1.1: + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + /flush-write-stream@1.1.1: resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 + dev: true + + /flux@4.0.3(react@17.0.2): + resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + dependencies: + fbemitter: 3.0.0 + fbjs: 3.0.4 + react: 17.0.2 + transitivePeerDependencies: + - encoding + dev: false + + /flux@4.0.3(react@18.2.0): + resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 + dependencies: + fbemitter: 3.0.0 + fbjs: 3.0.4 + react: 18.2.0 + transitivePeerDependencies: + - encoding + dev: false + + /focus-lock@0.11.6: + resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==} + engines: {node: '>=10'} + dependencies: + tslib: 2.5.0 + dev: false + + /focus-lock@0.8.1: + resolution: {integrity: sha512-/LFZOIo82WDsyyv7h7oc0MJF9ACOvDRdx9rWPZ2pgMfNWu/z8hQDBtOchuB/0BVLmuFOZjV02YwUVzNsWx/EzA==} + engines: {node: '>=10'} + dependencies: + tslib: 1.14.1 dev: true - /follow-redirects/1.14.6: - resolution: {integrity: sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==} + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -9424,78 +19560,111 @@ packages: debug: optional: true - /for-in/1.0.2: + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} - dev: true - /foreground-child/2.0.0: + /for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: false + + /foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} dependencies: cross-spawn: 7.0.3 - signal-exit: 3.0.6 + signal-exit: 3.0.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.0.2 + dev: false + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /fork-ts-checker-webpack-plugin/4.1.6_u7kjabuvawcog7hjctusduehvm: + /fork-ts-checker-webpack-plugin@4.1.6(eslint@8.34.0)(typescript@4.9.4)(webpack@5.75.0): resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} engines: {node: '>=6.11.5', yarn: '>=1.0.0'} peerDependencies: eslint: '>= 6' - typescript: '>= 2.7' + typescript: 4.9.4 vue-template-compiler: '*' - webpack: '>= 4' + webpack: 5.75.0 peerDependenciesMeta: eslint: optional: true vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.18.6 chalk: 2.4.2 + eslint: 8.34.0 micromatch: 3.1.10 minimatch: 3.1.2 semver: 5.7.1 tapable: 1.1.3 - typescript: 4.6.4 - webpack: 4.46.0 + typescript: 4.9.4 + webpack: 5.75.0(esbuild@0.15.18) worker-rpc: 0.1.1 transitivePeerDependencies: - supports-color dev: true - /fork-ts-checker-webpack-plugin/6.5.2_u7kjabuvawcog7hjctusduehvm: + /fork-ts-checker-webpack-plugin@6.5.2(eslint@8.34.0)(typescript@4.9.4)(webpack@5.75.0): resolution: {integrity: sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: eslint: '>= 6' - typescript: '>= 2.7' + typescript: 4.9.4 vue-template-compiler: '*' - webpack: '>= 4' + webpack: 5.75.0 peerDependenciesMeta: eslint: optional: true vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.18.6 '@types/json-schema': 7.0.11 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.2.2 + deepmerge: 4.3.1 + eslint: 8.34.0 fs-extra: 9.1.0 - glob: 7.2.0 - memfs: 3.4.1 + glob: 7.2.3 + memfs: 3.4.13 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.7 + semver: 7.5.4 tapable: 1.1.3 - typescript: 4.6.4 - webpack: 4.46.0 + typescript: 4.9.4 + webpack: 5.75.0(esbuild@0.15.18) + + /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 - /form-data/3.0.1: + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -9504,12 +19673,31 @@ packages: mime-types: 2.1.35 dev: true - /format/0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: true + + /formidable@2.0.1: + resolution: {integrity: sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==} + dependencies: + dezalgo: 1.0.3 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.9.3 dev: true - /formik/2.2.9_react@17.0.2: + /formik@2.2.9(react@18.2.0): resolution: {integrity: sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==} peerDependencies: react: '>=16.8.0' @@ -9518,40 +19706,38 @@ packages: hoist-non-react-statics: 3.3.2 lodash: 4.17.21 lodash-es: 4.17.21 - react: 17.0.2 + react: 18.2.0 react-fast-compare: 2.0.4 tiny-warning: 1.0.3 tslib: 1.14.1 dev: false - /forwarded/0.2.0: + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - dev: true - /fraction.js/4.2.0: + /fraction.js@4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - /fragment-cache/0.2.1: + /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: + /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.7 + /fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} dev: true - /fs-extra/0.30.0: + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + /fs-extra@0.30.0: resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} dependencies: graceful-fs: 4.2.10 @@ -9561,7 +19747,7 @@ packages: rimraf: 2.7.1 dev: true - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -9569,7 +19755,15 @@ packages: jsonfile: 6.1.0 universalify: 2.0.0 - /fs-extra/8.1.0: + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -9578,7 +19772,7 @@ packages: universalify: 0.1.2 dev: true - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -9587,14 +19781,14 @@ packages: jsonfile: 6.1.0 universalify: 2.0.0 - /fs-minipass/2.1.0: + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.6 + minipass: 3.3.6 dev: true - /fs-mkdirp-stream/1.0.0: + /fs-mkdirp-stream@1.0.0: resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} engines: {node: '>= 0.10'} dependencies: @@ -9602,70 +19796,43 @@ packages: through2: 2.0.5 dev: true - /fs-monkey/1.0.3: + /fs-monkey@1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} - dev: true - - /fs-require/1.4.0: - resolution: {integrity: sha512-ZytCzc6QAE0lprblNErZJuDVNoT0JPRSBCUXIMrIB0mLlwcAppbE5fqUyqC8zhgrrR3+whvpKLxOqtk8EnSbeA==} - dev: true - - /fs-write-stream-atomic/1.0.10: - resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} - dependencies: - graceful-fs: 4.2.10 - iferr: 0.1.5 - imurmurhash: 0.1.4 - readable-stream: 2.3.7 - dev: true - /fs.realpath/1.0.0: + /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.15.0 - dev: true - optional: true - - /fsevents/2.3.2: + /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 optional: true - /function-bind/1.1.1: + /ftp@0.3.10: + resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==} + engines: {node: '>=0.8.0'} + dependencies: + readable-stream: 1.1.14 + xregexp: 2.0.0 + dev: true + + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function.prototype.name/1.1.5: + /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.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 functions-have-names: 1.2.3 - /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: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - /fuse.js/3.6.1: - resolution: {integrity: sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==} - engines: {node: '>=6'} - dev: true - - /gauge/3.0.2: + /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} dependencies: @@ -9674,13 +19841,17 @@ packages: console-control-strings: 1.1.0 has-unicode: 2.0.1 object-assign: 4.1.1 - signal-exit: 3.0.6 + signal-exit: 3.0.7 string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 dev: true - /genshin-gacha-kit/1.1.0: + /generate-json-webpack-plugin@2.0.0: + resolution: {integrity: sha512-WVEHXiES7YwjLAjWquC5+IspZM4Pwtx1yHlHTBXHkp38HVjnHJo29PxLniWPSyiB539iDgeAcMNUBStrixx3Jw==} + dev: false + + /genshin-gacha-kit@1.1.0: resolution: {integrity: sha512-xQ2tRLjSzcGD5FA2RTJZ35oDjenuvJr+eBvvet6TN9dkedLDydYqq73hVshRXvaYcVqUKbX543MvxYBAVEhD+A==} dependencies: axios: 0.21.4 @@ -9689,56 +19860,130 @@ packages: - debug dev: false - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic/1.1.1: - resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} + /get-dom-document@0.1.1: + resolution: {integrity: sha512-UW/5ylJ7Tmr+26aYKAkftK4G0wbtY/YyOjrKPzWDkLifVS/Kpsgkmxzf2yRfJDMyUofEmccU8CxmSCsV3AKT4A==} + peerDependencies: + jsdom: '*' + peerDependenciesMeta: + jsdom: + optional: true + dev: false + + /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 - /get-own-enumerable-property-symbols/3.0.2: + /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - dev: true - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-stream/4.1.0: + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-proxy@2.1.0: + resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==} + engines: {node: '>=4'} + dependencies: + npm-conf: 1.1.3 + dev: true + + /get-stdin@4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + + /get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + 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/6.0.1: + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - dev: true - /get-symbol-description/1.0.0: + /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.1.1 + get-intrinsic: 1.2.0 + + /get-uri@3.0.2: + resolution: {integrity: sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + data-uri-to-buffer: 3.0.1 + debug: 4.3.4(supports-color@9.2.2) + file-uri-to-path: 2.0.0 + fs-extra: 8.1.0 + ftp: 0.3.10 + transitivePeerDependencies: + - supports-color + dev: true - /get-value/2.0.6: + /get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: true - /git-raw-commits/2.0.11: + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /git-clone@0.1.0: + resolution: {integrity: sha512-zs9rlfa7HyaJAKG9o+V7C6qfMzyc+tb1IIXdUFcOBcR1U7siKy/uPdauLlrH1mc0vOgUwIv4BF+QxPiiTYz3Rw==} + dev: true + + /git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} hasBin: true @@ -9750,132 +19995,269 @@ packages: through2: 4.0.2 dev: true - /github-slugger/1.4.0: - resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==} + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 6.3.0 + dev: true + + /git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: true + + /git-url-parse@13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + dependencies: + git-up: 7.0.0 + dev: true + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 dev: true - /glob-parent/3.1.0: + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + /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: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 - /glob-promise/3.4.0_glob@7.2.0: + /glob-promise@3.4.0(glob@7.2.3): resolution: {integrity: sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==} engines: {node: '>=4'} peerDependencies: glob: '*' dependencies: - '@types/glob': 7.2.0 - glob: 7.2.0 + '@types/glob': 8.1.0 + glob: 7.2.3 dev: true - /glob-stream/6.1.0: + /glob-stream@6.1.0: resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} engines: {node: '>= 0.10'} dependencies: extend: 3.0.2 - glob: 7.2.0 + glob: 7.2.3 glob-parent: 3.1.0 is-negated-glob: 1.0.0 ordered-read-streams: 1.0.1 pumpify: 1.5.1 - readable-stream: 2.3.7 + readable-stream: 2.3.8 remove-trailing-separator: 1.1.0 to-absolute-glob: 2.0.2 unique-stream: 2.3.1 dev: true - /glob-to-regexp/0.3.0: + /glob-to-regexp@0.3.0: resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} dev: true - /glob-to-regexp/0.4.1: + /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - /glob/7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.2.2 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + dev: false + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + 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 + + /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.0.4 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - /global-dirs/0.1.1: + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.1 + once: 1.4.0 + dev: false + + /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} dependencies: ini: 1.3.8 dev: true - /global/4.4.0: + /global-dirs@2.1.0: + resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} + engines: {node: '>=8'} + dependencies: + ini: 1.3.7 + dev: true + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: false + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: false + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: false + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: false + + /global-tld-list@0.0.1139: + resolution: {integrity: sha512-TCWjAwHPzFV6zbQ5jnJvJTctesHGJr9BppxivRuIxTiIFUzaxy1F0674cxjoJecW5s8V32Q5i35dBFqvAy7eGQ==} + dev: false + + /global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} dependencies: min-document: 2.19.0 process: 0.11.10 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals/13.14.0: - resolution: {integrity: sha512-ERO68sOYwm5UuLvSJTY7w7NP2c8S4UcXs3X1GBX8cwOr+ShOcDBbCY5mH4zxz0jsYCdJ8ve8Mv9n2YGJMB1aeg==} + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - dev: true - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.1.4 - dev: true + define-properties: 1.2.0 - /globby/10.0.1: + /globby@10.0.1: resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} engines: {node: '>=8'} dependencies: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.11 - glob: 7.2.0 - ignore: 5.2.0 + fast-glob: 3.2.12 + glob: 7.2.3 + ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.11 - ignore: 5.2.0 + fast-glob: 3.2.12 + ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 + + /globby@13.1.2: + resolution: {integrity: sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 dev: true - /globby/9.2.0: + /globby@13.1.3: + resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + + /globby@9.2.0: resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} engines: {node: '>=6'} dependencies: @@ -9883,7 +20265,7 @@ packages: array-union: 1.0.2 dir-glob: 2.2.2 fast-glob: 2.2.7 - glob: 7.2.0 + glob: 7.2.3 ignore: 4.0.6 pify: 4.0.1 slash: 2.0.0 @@ -9891,97 +20273,171 @@ packages: - supports-color dev: true - /graceful-fs/4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.0 + + /got@11.8.3: + resolution: {integrity: sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.2 + '@types/responselike': 1.0.0 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.2 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + /growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + dev: true - /gulp-sort/2.0.0: + /gulp-sort@2.0.0: resolution: {integrity: sha512-MyTel3FXOdh1qhw1yKhpimQrAmur9q1X0ZigLmCOxouQD+BD3za9/89O+HfbgBQvvh4igEbp0/PUWO+VqGYG1g==} dependencies: through2: 2.0.5 dev: true - /gzip-size/6.0.0: + /gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} dependencies: duplexer: 0.1.2 - dev: true - /handle-thing/2.0.1: + /h264-profile-level-id@1.0.1(supports-color@9.2.2): + resolution: {integrity: sha512-D3Rln/jKNjKDW5ZTJTK3niSoOGE+pFqPvRHHVgQN3G7umcn/zWGPUo8Q8VpDj16x3hKz++zVviRNRmXu5cpN+Q==} + engines: {node: '>=8.0.0'} + dependencies: + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color + dev: false + + /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: true - /handlebars/4.7.7: + /handlebars@4.7.7: resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} engines: {node: '>=0.4.7'} hasBin: true dependencies: - minimist: 1.2.6 + minimist: 1.2.8 neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.15.5 + uglify-js: 3.17.4 + + /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 - /hard-rejection/2.1.0: + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /harmony-reflect/1.6.2: + /hark@1.2.3: + resolution: {integrity: sha512-u68vz9SCa38ESiFJSDjqK8XbXqWzyot7Cj6Y2b6jk2NJ+II3MY2dIrLMg/kjtIAun4Y1DHF/20hfx4rq1G5GMg==} + dependencies: + wildemitter: 1.2.1 + dev: false + + /harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} dev: true - /has-ansi/2.0.0: + /has-ansi@2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: false - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - /has-cors/1.1.0: - resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} - dev: false - - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-glob/1.0.0: + /has-glob@1.0.0: resolution: {integrity: sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g==} engines: {node: '>=0.10.0'} dependencies: is-glob: 3.1.0 dev: true - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.1.1 + get-intrinsic: 1.2.0 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbol-support-x@1.4.2: + resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==} + dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - /has-tostringtag/1.0.0: + /has-to-string-tag-x@1.4.1: + resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==} + dependencies: + has-symbol-support-x: 1.4.2 + dev: true + + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - /has-unicode/2.0.1: + /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true - /has-value/0.3.1: + /has-value@0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: @@ -9990,7 +20446,7 @@ packages: isobject: 2.1.0 dev: true - /has-value/1.0.0: + /has-value@1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: @@ -9999,12 +20455,12 @@ packages: isobject: 3.0.1 dev: true - /has-values/0.1.4: + /has-values@0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: true - /has-values/1.0.0: + /has-values@1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: @@ -10012,29 +20468,22 @@ packages: 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 + /has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} - /hash-base/3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.0 - safe-buffer: 5.2.1 + /has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /hash.js/1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true + function-bind: 1.1.1 - /hast-to-hyperscript/9.0.1: + /hast-to-hyperscript@9.0.1: resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} dependencies: '@types/unist': 2.0.6 @@ -10044,9 +20493,8 @@ packages: style-to-object: 0.3.0 unist-util-is: 4.1.0 web-namespaces: 1.1.4 - dev: true - /hast-util-from-parse5/6.0.1: + /hast-util-from-parse5@6.0.1: resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} dependencies: '@types/parse5': 5.0.3 @@ -10055,13 +20503,29 @@ packages: vfile: 4.2.1 vfile-location: 3.2.0 web-namespaces: 1.1.4 - dev: true - /hast-util-parse-selector/2.2.5: + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + dependencies: + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + hastscript: 7.2.0 + property-information: 6.2.0 + vfile: 5.3.7 + vfile-location: 4.0.1 + web-namespaces: 2.0.1 + dev: false + + /hast-util-parse-selector@2.2.5: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - dev: true - /hast-util-raw/6.0.1: + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.4 + dev: false + + /hast-util-raw@6.0.1: resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} dependencies: '@types/hast': 2.3.4 @@ -10074,9 +20538,54 @@ packages: web-namespaces: 1.1.4 xtend: 4.0.2 zwitch: 1.0.5 - dev: true - /hast-util-to-parse5/6.0.0: + /hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + dependencies: + '@types/hast': 2.3.4 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-sanitize@4.1.0: + resolution: {integrity: sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw==} + dependencies: + '@types/hast': 2.3.4 + dev: false + + /hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.1 + unist-util-position: 5.0.0 + dev: false + + /hast-util-to-html@8.0.4: + resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + dependencies: + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 7.2.3 + hast-util-whitespace: 2.0.1 + html-void-elements: 2.0.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-parse5@6.0.0: resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==} dependencies: hast-to-hyperscript: 9.0.1 @@ -10084,9 +20593,23 @@ packages: web-namespaces: 1.1.4 xtend: 4.0.2 zwitch: 1.0.5 - dev: true - /hastscript/6.0.0: + /hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 2.0.3 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false + + /hastscript@6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} dependencies: '@types/hast': 2.3.4 @@ -10094,111 +20617,122 @@ packages: hast-util-parse-selector: 2.2.5 property-information: 5.6.0 space-separated-tokens: 1.1.5 - dev: true - /he/1.2.0: + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + dev: false + + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - dev: true - /hex-color-regex/1.1.0: - resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} + /header-case@1.0.1: + resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: false + + /header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + dependencies: + capital-case: 1.0.4 + tslib: 2.5.0 dev: false - /highlight.js/10.7.3: + /hex-color-regex@1.1.0: + resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} + + /hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + dev: true + + /highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false - /highlight.js/11.5.1: - resolution: {integrity: sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==} + /highlight.js@11.6.0: + resolution: {integrity: sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==} engines: {node: '>=12.0.0'} dev: false - /history/4.10.1: + /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 loose-envify: 1.4.0 resolve-pathname: 3.0.0 - tiny-invariant: 1.2.0 + tiny-invariant: 1.3.1 tiny-warning: 1.0.3 value-equal: 1.0.1 dev: false - /history/5.0.0: - resolution: {integrity: sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==} - dependencies: - '@babel/runtime': 7.17.9 - dev: true - - /history/5.3.0: - resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} - dependencies: - '@babel/runtime': 7.17.9 - dev: true - - /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 - - /hoist-non-react-statics/3.3.2: + /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 - /hosted-git-info/2.8.9: + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: false + + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info/4.1.0: + /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true - /hpack.js/2.1.6: + /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: inherits: 2.0.4 obuf: 1.1.2 - readable-stream: 2.3.7 + readable-stream: 2.3.8 wbuf: 1.7.3 - dev: true - /hsl-regex/1.0.0: + /hsl-regex@1.0.0: resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==} - dev: false - /hsla-regex/1.0.0: + /hsla-regex@1.0.0: resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} - dev: false - /html-dom-parser/1.2.0: + /html-dom-parser@1.2.0: resolution: {integrity: sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==} dependencies: domhandler: 4.3.1 htmlparser2: 7.2.0 dev: false - /html-encoding-sniffer/2.0.1: + /html-encoding-sniffer@2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} dependencies: whatwg-encoding: 1.0.5 dev: true - /html-entities/2.3.3: + /html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - dev: true - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true - /html-minifier-terser/5.1.1: + /html-minifier-terser@5.1.1: resolution: {integrity: sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==} engines: {node: '>=6'} hasBin: true @@ -10209,54 +20743,56 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 4.8.0 + terser: 4.8.1 dev: true - /html-minifier-terser/6.1.0: + /html-minifier-terser@6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} engines: {node: '>=12'} hasBin: true dependencies: camel-case: 4.1.2 - clean-css: 5.3.0 + clean-css: 5.3.2 commander: 8.3.0 he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.13.1 - dev: true + terser: 5.16.5 - /html-parse-stringify/3.0.1: + /html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} dependencies: void-elements: 3.1.0 dev: false - /html-react-parser/1.4.12_react@17.0.2: - resolution: {integrity: sha512-nqYQzr4uXh67G9ejAG7djupTHmQvSTgjY83zbXLRfKHJ0F06751jXx6WKSFARDdXxCngo2/7H4Rwtfeowql4gQ==} + /html-react-parser@1.4.14(react@18.2.0): + resolution: {integrity: sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ==} peerDependencies: react: 0.14 || 15 || 16 || 17 || 18 dependencies: domhandler: 4.3.1 html-dom-parser: 1.2.0 - react: 17.0.2 + react: 18.2.0 react-property: 2.0.0 - style-to-js: 1.1.0 + style-to-js: 1.1.1 dev: false - /html-tags/3.2.0: + /html-tags@3.2.0: resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} engines: {node: '>=8'} - /html-void-elements/1.0.5: + /html-void-elements@1.0.5: resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} - dev: true - /html-webpack-plugin/4.5.2_webpack@4.46.0: + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + dev: false + + /html-webpack-plugin@4.5.2(webpack@5.75.0): resolution: {integrity: sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==} engines: {node: '>=6.9'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.8 @@ -10267,33 +20803,31 @@ packages: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 4.46.0 + webpack: 5.75.0(esbuild@0.15.18) dev: true - /html-webpack-plugin/5.5.0_webpack@5.73.0: + /html-webpack-plugin@5.5.0(webpack@5.75.0): resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} peerDependencies: - webpack: ^5.20.0 + webpack: 5.75.0 dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.73.0_webpack-cli@4.9.2 - dev: true + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) - /htmlparser2/6.1.0: + /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 - /htmlparser2/7.2.0: + /htmlparser2@7.2.0: resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} dependencies: domelementtype: 2.3.0 @@ -10302,11 +20836,29 @@ packages: entities: 3.0.1 dev: false - /http-deceiver/1.2.7: + /htmlparser2@8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + /http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: true - /http-errors/1.6.3: + /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} dependencies: @@ -10314,9 +20866,19 @@ packages: inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - dev: true - /http-errors/2.0.0: + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -10325,24 +20887,22 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true - /http-parser-js/0.5.6: - resolution: {integrity: sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==} - dev: true + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - /http-proxy-agent/4.0.1: + /http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.3 + debug: 4.3.4(supports-color@9.2.2) transitivePeerDependencies: - supports-color dev: true - /http-proxy-middleware/2.0.6_@types+express@4.17.13: + /http-proxy-middleware@2.0.6(@types/express@4.17.17): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -10351,79 +20911,106 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.13 - '@types/http-proxy': 1.17.9 + '@types/express': 4.17.17 + '@types/http-proxy': 1.17.10 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.5 transitivePeerDependencies: - debug - dev: true - /http-proxy/1.18.1: + /http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.14.6 + follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: true - /https-browserify/1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + /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-proxy-agent/5.0.1: + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.3 + debug: 4.3.4(supports-color@9.2.2) transitivePeerDependencies: - supports-color - dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + + /human-signals@3.0.1: + resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} + engines: {node: '>=12.20.0'} dev: true - /husky/7.0.4: - resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} - engines: {node: '>=12'} + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} hasBin: true dev: true - /i18next-http-backend/1.4.0: - resolution: {integrity: sha512-wsvx7E/CT1pHmBM99Vu57YLJpsrHbVjxGxf25EIJ/6oTjsvCkZZ6c3SA4TejcK5jIHfv9oLxQX8l+DFKZHZ0Gg==} + /hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + dev: false + + /i18next-browser-languagedetector@7.1.0: + resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==} + dependencies: + '@babel/runtime': 7.21.0 + dev: false + + /i18next-fs-backend@1.1.5: + resolution: {integrity: sha512-raTel3EfshiUXxR0gvmIoqp75jhkj8+7R1LjB006VZKPTFBbXyx6TlUVhb8Z9+7ahgpFbcQg1QWVOdf/iNzI5A==} + dev: false + + /i18next-http-backend@1.4.1: + resolution: {integrity: sha512-s4Q9hK2jS29iyhniMP82z+yYY8riGTrWbnyvsSzi5TaF7Le4E7b5deTmtuaRuab9fdDcYXtcwdBgawZG+JCEjA==} dependencies: cross-fetch: 3.1.5 transitivePeerDependencies: - encoding dev: false - /i18next-scanner/3.1.0: - resolution: {integrity: sha512-dHLXUJIiF1CYJNslCkJFDYJySk5fg+dzdg9O73XXqHcdZwJ2947SWusqq8HdNFB7LpkBi8oTG6TWLZPmqbAh8Q==} + /i18next-scanner@3.3.0: + resolution: {integrity: sha512-wVCv2HCpFWi/KIU/UiWgzUZg3Ih9zO8GLRv0aAQWJ7LUukrLaNkzdtVdkED6b4AiEDfCuM4X1KLcBi+pvL6JzQ==} engines: {node: '>=12'} hasBin: true dependencies: - acorn: 8.7.1 - acorn-dynamic-import: 4.0.0_acorn@8.7.1 - acorn-jsx: 5.3.2_acorn@8.7.1 - acorn-stage3: 4.0.0_acorn@8.7.1 + acorn: 8.8.2 + acorn-dynamic-import: 4.0.0(acorn@8.8.2) + acorn-jsx: 5.3.2(acorn@8.8.2) + acorn-stage3: 4.0.0(acorn@8.8.2) acorn-walk: 8.2.0 chalk: 4.1.2 clone-deep: 4.0.1 commander: 6.2.1 - deepmerge: 4.2.2 + deepmerge: 4.3.0 ensure-array: 1.0.0 eol: 0.9.1 - esprima-next: 5.8.2 + esprima-next: 5.8.4 gulp-sort: 2.0.0 - i18next: 21.8.1 + i18next: 22.4.10 lodash: 4.17.21 parse5: 6.0.1 sortobject: 4.16.0 @@ -10432,153 +21019,288 @@ packages: vinyl-fs: 3.0.3 dev: true - /i18next/20.6.1: + /i18next@20.6.1: resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 + dev: false + + /i18next@21.9.1: + resolution: {integrity: sha512-ITbDrAjbRR73spZAiu6+ex5WNlHRr1mY+acDi2ioTHuUiviJqSz269Le1xHAf0QaQ6GgIHResUhQNcxGwa/PhA==} + dependencies: + '@babel/runtime': 7.21.0 + dev: true + + /i18next@21.9.2: + resolution: {integrity: sha512-00fVrLQOwy45nm3OtC9l1WiLK3nJlIYSljgCt0qzTaAy65aciMdRy9GsuW+a2AtKtdg9/njUGfRH30LRupV7ZQ==} + dependencies: + '@babel/runtime': 7.21.0 dev: false - /i18next/21.8.1: - resolution: {integrity: sha512-uulZBD5kLME7Ucz8pFwpC7jXDjq4BHkio3b6GBw1ykXNHA8rIAk1S2t6zb2Ripf9OMetMkysiDRlPlCVqjvQeg==} + /i18next@22.4.10: + resolution: {integrity: sha512-3EqgGK6fAJRjnGgfkNSStl4mYLCjUoJID338yVyLMj5APT67HUtWoqSayZewiiC5elzMUB1VEUwcmSCoeQcNEA==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 dev: true - /iconv-lite/0.4.24: + /i18next@22.5.1: + resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} + dependencies: + '@babel/runtime': 7.21.0 + dev: false + + /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: + /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: + /icss-utils@4.1.1: resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} engines: {node: '>= 6'} dependencies: postcss: 7.0.39 dev: true - /icss-utils/5.1.0_postcss@8.4.13: + /icss-utils@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.13 + postcss: 8.4.21 - /idb/6.1.5: - resolution: {integrity: sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==} + /icss-utils@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.27 + dev: false + + /idb-keyval@5.1.5: + resolution: {integrity: sha512-J1utxYWQokYjy01LvDQ7WmiAtZCGUSkVi9EIBfUSyLOr/BesnMIxNGASTh9A1LzeISSjSqEPsfFdTss7EE7ofQ==} + dependencies: + safari-14-idb-fix: 1.0.6 + dev: false + + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} dev: true - /identity-obj-proxy/3.0.0: + /identity-obj-proxy@3.0.0: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} dependencies: harmony-reflect: 1.6.2 dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /iferr/0.1.5: - resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: true - /ignore/4.0.6: + /ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} dev: true - /ignore/5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - dev: true - /image-size/0.5.5: + /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 - /immer/9.0.13: - resolution: {integrity: sha512-LufFIoBO2q3CZoUiObiV6ICK7QsrxOIo8ReQHggmYHA7aSbQdsAiZ+mkR3cjRD5ZxC/0P6EMdx2kk6oj1qyFLw==} + /image-size@1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + queue: 6.0.2 + dev: false + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} dev: false - /import-fresh/2.0.0: + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + /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: false - /import-fresh/3.3.0: + /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 - /import-local/3.1.0: + /import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + + /in-publish@2.0.1: + resolution: {integrity: sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==} + hasBin: true + + /indent-string@2.1.0: + resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + repeating: 2.0.1 dev: true + optional: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - dev: true - /indexes-of/1.0.1: + /indexes-of@1.0.1: resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} - dev: false - /infer-owner/1.0.4: + /infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} dev: true - /inflight/1.0.6: + /infima@0.2.0-alpha.43: + resolution: {integrity: sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==} + engines: {node: '>=12'} + dev: false + + /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: + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini/1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + /ini@1.3.7: + resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==} dev: true - /inline-style-parser/0.1.1: + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + /ink-tab@4.2.0(ink@3.2.0)(react@18.2.0): + resolution: {integrity: sha512-KrvNWrebGCXWbGf74QE0XYKYGUCa0dEgHGa3B4VJK3PQh8+wXycQeGnl1s/kq3OokWOmMyfkc/BTPgulxjXspQ==} + peerDependencies: + ink: ^3.0.0 + react: ^16.8.0 + dependencies: + ink: 3.2.0(@types/react@18.0.20)(react@18.2.0) + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /ink-text-input@4.0.3(ink@3.2.0)(react@18.2.0): + resolution: {integrity: sha512-eQD01ik9ltmNoHmkeQ2t8LszYkv2XwuPSUz3ie/85qer6Ll/j0QSlSaLNl6ENHZakBHdCBVZY04iOXcLLXA0PQ==} + engines: {node: '>=10'} + peerDependencies: + ink: ^3.0.0-3 + react: ^16.5.2 || ^17.0.0 + dependencies: + chalk: 4.1.2 + ink: 3.2.0(@types/react@18.0.20)(react@18.2.0) + react: 18.2.0 + type-fest: 0.15.1 + dev: false + + /ink@3.2.0(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': 18.0.20 + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.20 + ansi-escapes: 4.3.2 + auto-bind: 4.0.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + cli-cursor: 3.1.0 + cli-truncate: 2.1.0 + code-excerpt: 3.0.0 + indent-string: 4.0.0 + is-ci: 2.0.0 + lodash: 4.17.21 + patch-console: 1.0.0 + react: 18.2.0 + react-devtools-core: 4.25.0 + react-reconciler: 0.26.2(react@18.2.0) + scheduler: 0.20.2 + signal-exit: 3.0.7 + slice-ansi: 3.0.0 + stack-utils: 2.0.5 + string-width: 4.2.3 + type-fest: 0.12.0 + widest-line: 3.1.0 + wrap-ansi: 6.2.0 + ws: 7.5.9 + yoga-layout-prebuilt: 1.10.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - /inquirer/3.0.6: + /inline-style-prefixer@6.0.1: + resolution: {integrity: sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ==} + dependencies: + css-in-js-utils: 2.0.1 + dev: false + + /inquirer@3.0.6: resolution: {integrity: sha512-thluxTGBXUGb8DuQcvH9/CM/CrcGyB5xUpWc9x6Slqcq1z/hRr2a6KxUpX4ddRfmbe0hg3E4jTvo5833aWz3BA==} dependencies: ansi-escapes: 1.4.0 @@ -10596,7 +21318,43 @@ packages: through: 2.3.8 dev: false - /inquirer/8.2.4: + /inquirer@7.0.0: + resolution: {integrity: sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==} + engines: {node: '>=6.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 2.4.2 + cli-cursor: 3.1.0 + cli-width: 2.2.1 + 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: 5.2.0 + through: 2.3.8 + + /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 + + /inquirer@8.2.4: resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} engines: {node: '>=12.0.0'} dependencies: @@ -10610,164 +21368,240 @@ packages: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.5.5 + rxjs: 7.8.0 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 - dev: false - /internal-slot/1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + /inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.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 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + + /inquirer@9.1.4: + resolution: {integrity: sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 6.0.0 + chalk: 5.1.2 + cli-cursor: 4.0.0 + cli-width: 4.0.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 6.1.2 + run-async: 2.4.1 + rxjs: 7.8.0 + string-width: 5.1.2 + strip-ansi: 7.0.1 + through: 2.3.8 + wrap-ansi: 8.1.0 + dev: true + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.1.1 + get-intrinsic: 1.2.0 has: 1.0.3 side-channel: 1.0.4 - /interpret/2.2.0: + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + /interpret@2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} - dev: true - /invariant/2.2.4: + /intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: false + + /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 - /ip-regex/4.3.0: + /ioredis@4.28.5: + resolution: {integrity: sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==} + engines: {node: '>=6'} + dependencies: + cluster-key-slot: 1.1.0 + debug: 4.3.4(supports-color@9.2.2) + denque: 1.5.1 + lodash.defaults: 4.2.0 + lodash.flatten: 4.4.0 + lodash.isarguments: 3.1.0 + p-map: 2.1.0 + redis-commands: 1.7.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + /ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} dev: false - /ip/1.1.8: + /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: true - /ipaddr.js/1.9.1: + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: true + + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - dev: true - /ipaddr.js/2.0.1: + /ipaddr.js@2.0.1: resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==} engines: {node: '>= 10'} - dev: true - /is-absolute-url/2.1.0: + /is-absolute-url@2.1.0: resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} engines: {node: '>=0.10.0'} - dev: false - /is-absolute-url/3.0.3: + /is-absolute-url@3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} dev: true - /is-absolute/1.0.0: + /is-absolute@1.0.0: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} dependencies: is-relative: 1.0.0 is-windows: 1.0.2 - dev: true - /is-accessor-descriptor/0.1.6: + /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: + /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-alphabetical/1.0.4: + /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - /is-alphanumerical/1.0.4: + /is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - /is-arguments/1.1.1: + /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-arrayish/0.2.1: + /is-array-buffer@3.0.1: + resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /is-arrayish/0.3.2: + /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + /is-base64@1.1.0: + resolution: {integrity: sha512-Nlhg7Z2dVC4/PTvIFkgVVNvPHSO2eR/Yd0XzhGiXCXEvWnptXlXa/clQ8aePPiMuxEGcWfzWbGw2Fe3d+Y3v1g==} + hasBin: true dev: false - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - /is-binary-path/1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - dependencies: - binary-extensions: 1.13.1 - dev: true - optional: true - - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-blob/2.1.0: + /is-blob@2.1.0: resolution: {integrity: sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==} engines: {node: '>=6'} dev: false - /is-boolean-object/1.1.2: + /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 - /is-buffer/1.1.6: + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: true - /is-buffer/2.0.5: + /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - /is-builtin-module/3.1.0: - resolution: {integrity: sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==} + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} dependencies: - builtin-modules: 3.2.0 - dev: false + builtin-modules: 3.3.0 - /is-callable/1.2.4: - resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - /is-ci/2.0.0: + /is-ci@2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true dependencies: ci-info: 2.0.0 + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 dev: true - /is-color-stop/1.1.0: + /is-color-stop@1.1.0: resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} dependencies: css-color-names: 0.0.4 @@ -10776,37 +21610,36 @@ packages: hsla-regex: 1.0.0 rgb-regex: 1.0.1 rgba-regex: 1.0.0 - dev: false - /is-core-module/2.9.0: - resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + /is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 - /is-data-descriptor/0.1.4: + /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: + /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: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - /is-decimal/1.0.4: + /is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - /is-descriptor/0.1.6: + /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} dependencies: @@ -10815,7 +21648,7 @@ packages: kind-of: 5.1.0 dev: true - /is-descriptor/1.0.2: + /is-descriptor@1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} engines: {node: '>=0.10.0'} dependencies: @@ -10824,337 +21657,477 @@ packages: kind-of: 6.0.3 dev: true - /is-directory/0.3.1: + /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} - dev: false - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - dev: true - /is-dom/1.1.0: + /is-dom@1.1.0: resolution: {integrity: sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==} dependencies: is-object: 1.0.2 is-window: 1.0.2 dev: true - /is-extendable/0.1.1: + /is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + dev: false + + /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} - dev: true - /is-extendable/1.0.1: + /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: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-fullwidth-code-point/2.0.0: + /is-finite@1.0.2: + resolution: {integrity: sha512-e+gU0KGrlbqjEcV80SAqg4g7PQYOm3/IrdwAJ+kPwHqGhLKhtuTJGGxGtrsc8RXlHt2A8Vlnv+79Vq2B1GQasg==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: false + + /is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} - dev: false - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-function/1.0.2: + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-function@1.0.2: resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} dev: true - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-glob/3.1.0: + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /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: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-hexadecimal/1.0.4: + /is-hexadecimal@1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - /is-hotkey/0.2.0: + /is-hotkey@0.2.0: resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} dev: false - /is-interactive/1.0.0: + /is-installed-globally@0.3.2: + resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==} + engines: {node: '>=8'} + dependencies: + global-dirs: 2.1.0 + is-path-inside: 3.0.3 + dev: true + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + /is-integer@1.0.7: + resolution: {integrity: sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==} + dependencies: + is-finite: 1.1.0 + dev: false + + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + /is-lower-case@1.1.3: + resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} + dependencies: + lower-case: 1.1.4 dev: false - /is-map/2.0.2: + /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: true - /is-module/1.0.0: + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - /is-negated-glob/1.0.0: + /is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + dev: true + + /is-negated-glob@1.0.0: resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} engines: {node: '>=0.10.0'} dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} - /is-number-object/1.0.7: + /is-npm@4.0.0: + resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==} + engines: {node: '>=8'} + dev: true + + /is-npm@5.0.0: + resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} + engines: {node: '>=10'} + dev: false + + /is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - /is-number/3.0.0: + /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: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj/1.0.1: + /is-obj@1.0.1: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} - dev: true - /is-obj/2.0.0: + /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - /is-object/1.0.2: + /is-object@1.0.2: resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} dev: true - /is-plain-obj/1.1.0: + /is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-plain-obj/2.1.0: + /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - /is-plain-obj/3.0.0: + /is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} - dev: true - /is-plain-object/2.0.4: + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /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-plain-object/3.0.1: + /is-plain-object@3.0.1: resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} engines: {node: '>=0.10.0'} dev: true - /is-plain-object/5.0.0: + /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - dev: true - /is-potential-custom-element-name/1.0.1: + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-reference/1.2.1: + /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: - '@types/estree': 0.0.51 - dev: false + '@types/estree': 1.0.0 - /is-regex/1.1.4: + /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 - /is-regexp/1.0.0: + /is-regexp@1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} engines: {node: '>=0.10.0'} - dev: true - /is-relative/1.0.0: + /is-relative@1.0.0: resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} engines: {node: '>=0.10.0'} dependencies: is-unc-path: 1.0.0 - dev: true - /is-resolvable/1.1.0: + /is-resolvable@1.1.0: resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} + + /is-root@2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} dev: false - /is-set/2.0.2: + /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 - /is-stream/1.1.0: + /is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + dependencies: + protocols: 2.0.1 + dev: true + + /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - /is-text-path/1.0.1: + /is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 dev: true - /is-typedarray/1.0.0: + /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 + + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - /is-unc-path/1.0.0: + /is-unc-path@1.0.0: resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} engines: {node: '>=0.10.0'} dependencies: unc-path-regex: 0.1.2 - dev: true - /is-unicode-supported/0.1.0: + /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + /is-upper-case@1.1.2: + resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + dependencies: + upper-case: 1.1.3 dev: false - /is-utf8/0.2.1: + /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true - /is-valid-glob/1.0.0: + /is-valid-glob@1.0.0: resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} engines: {node: '>=0.10.0'} dev: true - /is-weakref/1.0.2: + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 - /is-what/3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 dev: true - /is-whitespace-character/1.0.4: + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + /is-what@4.1.8: + resolution: {integrity: sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==} + engines: {node: '>=12.13'} + dev: false + + /is-whitespace-character@1.0.4: resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} - dev: true - /is-window/1.0.2: + /is-window@1.0.2: resolution: {integrity: sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==} dev: true - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - dev: true - /is-word-character/1.0.4: + /is-word-character@1.0.4: resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} - dev: true - - /is-wsl/1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - dev: true - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 + + /is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + + /is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} dev: true - /isarray/0.0.1: + /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - /isarray/2.0.5: + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true - /isexe/2.0.0: + /isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + dev: false + + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - /isobject/2.1.0: + /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: + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - dev: true - /isobject/4.0.0: + /isobject@4.0.0: resolution: {integrity: sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==} engines: {node: '>=0.10.0'} dev: true - /istanbul-lib-coverage/3.2.0: + /isomorphic-unfetch@3.1.0: + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} + dependencies: + node-fetch: 2.6.9 + unfetch: 4.2.0 + transitivePeerDependencies: + - encoding + dev: true + + /isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + dev: false + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument/5.2.0: - resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.17.10 - '@babel/parser': 7.17.10 + '@babel/core': 7.21.0 + '@babel/parser': 7.21.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -11162,7 +22135,7 @@ packages: - supports-color dev: true - /istanbul-lib-report/3.0.0: + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -11171,64 +22144,85 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.3 + debug: 4.3.4(supports-color@9.2.2) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports/3.1.4: - resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.0 dev: true - /iterate-iterator/1.0.2: + /isurl@1.0.0: + resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} + engines: {node: '>= 4'} + dependencies: + has-to-string-tag-x: 1.4.1 + is-object: 1.0.2 + dev: true + + /iterate-iterator@1.0.2: resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} dev: true - /iterate-value/1.0.2: + /iterate-value@1.0.2: resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} dependencies: - es-get-iterator: 1.1.2 + es-get-iterator: 1.1.3 iterate-iterator: 1.0.2 dev: true - /jake/10.8.5: + /jackspeak@2.2.2: + resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /jake@10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.3 + async: 3.2.4 chalk: 4.1.2 filelist: 1.0.4 - minimatch: 3.0.4 + minimatch: 3.1.2 + + /java-properties@1.0.2: + resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} + engines: {node: '>= 0.6.0'} dev: true - /jest-changed-files/27.5.1: + /jest-changed-files@27.5.1: resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 execa: 5.1.1 - throat: 6.0.1 + throat: 6.0.2 dev: true - /jest-circus/27.5.1: + /jest-circus@27.5.1: resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.4 + '@types/node': 18.11.9 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -11242,13 +22236,13 @@ packages: jest-util: 27.5.1 pretty-format: 27.5.1 slash: 3.0.0 - stack-utils: 2.0.5 - throat: 6.0.1 + stack-utils: 2.0.6 + throat: 6.0.2 transitivePeerDependencies: - supports-color dev: true - /jest-cli/27.5.1_ts-node@10.7.0: + /jest-cli@27.5.1(ts-node@10.9.1): resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -11258,14 +22252,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.5.1_ts-node@10.7.0 + '@jest/core': 27.5.1(ts-node@10.9.1) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 27.5.1_ts-node@10.7.0 + jest-config: 27.5.1(ts-node@10.9.1) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -11278,23 +22272,23 @@ packages: - utf-8-validate dev: true - /jest-config/27.5.1_ts-node@10.7.0: + /jest-config@27.5.1(ts-node@10.9.1): resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: - ts-node: '>=9.0.0' + ts-node: 10.9.1 peerDependenciesMeta: ts-node: optional: true dependencies: - '@babel/core': 7.17.10 + '@babel/core': 7.21.0 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1_@babel+core@7.17.10 + babel-jest: 27.5.1(@babel/core@7.21.0) chalk: 4.1.2 - ci-info: 3.3.1 - deepmerge: 4.2.2 - glob: 7.2.0 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 graceful-fs: 4.2.10 jest-circus: 27.5.1 jest-environment-jsdom: 27.5.1 @@ -11311,7 +22305,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.7.0_ixcth6kbstn6no7hiktnzckliq + ts-node: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) transitivePeerDependencies: - bufferutil - canvas @@ -11319,7 +22313,17 @@ packages: - utf-8-validate dev: true - /jest-diff/27.5.1: + /jest-diff@26.6.2: + resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} + engines: {node: '>= 10.14.2'} + dependencies: + chalk: 4.1.2 + diff-sequences: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + dev: true + + /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11329,14 +22333,24 @@ packages: pretty-format: 27.5.1 dev: true - /jest-docblock/27.5.1: + /jest-diff@29.4.3: + resolution: {integrity: sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /jest-docblock@27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/27.5.1: + /jest-each@27.5.1: resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11347,14 +22361,14 @@ packages: pretty-format: 27.5.1 dev: true - /jest-environment-jsdom/27.5.1: + /jest-environment-jsdom@27.5.1: resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.4 + '@types/node': 18.11.9 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -11365,32 +22379,42 @@ packages: - utf-8-validate dev: true - /jest-environment-node/27.5.1: + /jest-environment-node@27.5.1: resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.4 + '@types/node': 18.11.9 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true - /jest-get-type/27.5.1: + /jest-get-type@26.3.0: + resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} + engines: {node: '>= 10.14.2'} + dev: true + + /jest-get-type@27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-haste-map/26.6.2: + /jest-get-type@29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@26.6.2: resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.4 - anymatch: 3.1.2 - fb-watchman: 2.0.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 18.11.9 + anymatch: 3.1.3 + fb-watchman: 2.0.2 graceful-fs: 4.2.10 jest-regex-util: 26.0.0 jest-serializer: 26.6.2 @@ -11405,15 +22429,15 @@ packages: - supports-color dev: true - /jest-haste-map/27.5.1: + /jest-haste-map@27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.4 - anymatch: 3.1.2 - fb-watchman: 2.0.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 18.11.9 + anymatch: 3.1.3 + fb-watchman: 2.0.2 graceful-fs: 4.2.10 jest-regex-util: 27.5.1 jest-serializer: 27.5.1 @@ -11425,7 +22449,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-jasmine2/27.5.1: + /jest-jasmine2@27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11433,7 +22457,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.4 + '@types/node': 18.11.9 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -11445,12 +22469,12 @@ packages: jest-snapshot: 27.5.1 jest-util: 27.5.1 pretty-format: 27.5.1 - throat: 6.0.1 + throat: 6.0.2 transitivePeerDependencies: - supports-color dev: true - /jest-leak-detector/27.5.1: + /jest-leak-detector@27.5.1: resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11458,7 +22482,7 @@ packages: pretty-format: 27.5.1 dev: true - /jest-matcher-utils/27.5.1: + /jest-matcher-utils@27.5.1: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11468,11 +22492,21 @@ packages: pretty-format: 27.5.1 dev: true - /jest-message-util/27.5.1: + /jest-matcher-utils@29.4.3: + resolution: {integrity: sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + dev: true + + /jest-message-util@27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.18.6 '@jest/types': 27.5.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -11480,19 +22514,34 @@ packages: micromatch: 4.0.5 pretty-format: 27.5.1 slash: 3.0.0 - stack-utils: 2.0.5 + stack-utils: 2.0.6 + dev: true + + /jest-message-util@29.4.3: + resolution: {integrity: sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 29.5.0 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 29.5.0 + slash: 3.0.0 + stack-utils: 2.0.6 dev: true - /jest-mock/27.5.1: + /jest-mock@27.5.1: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 17.0.4 + '@types/node': 18.11.9 dev: true - /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: - resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: jest-resolve: '*' @@ -11503,17 +22552,17 @@ packages: jest-resolve: 27.5.1 dev: true - /jest-regex-util/26.0.0: + /jest-regex-util@26.0.0: resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} engines: {node: '>= 10.14.2'} dev: true - /jest-regex-util/27.5.1: + /jest-regex-util@27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-resolve-dependencies/27.5.1: + /jest-resolve-dependencies@27.5.1: resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11524,7 +22573,7 @@ packages: - supports-color dev: true - /jest-resolve/27.5.1: + /jest-resolve@27.5.1: resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11532,15 +22581,15 @@ packages: chalk: 4.1.2 graceful-fs: 4.2.10 jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) jest-util: 27.5.1 jest-validate: 27.5.1 - resolve: 1.22.0 - resolve.exports: 1.1.0 + resolve: 1.22.2 + resolve.exports: 1.1.1 slash: 3.0.0 dev: true - /jest-runner/27.5.1: + /jest-runner@27.5.1: resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11549,7 +22598,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.4 + '@types/node': 18.11.9 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.10 @@ -11564,7 +22613,7 @@ packages: jest-util: 27.5.1 jest-worker: 27.5.1 source-map-support: 0.5.21 - throat: 6.0.1 + throat: 6.0.2 transitivePeerDependencies: - bufferutil - canvas @@ -11572,7 +22621,7 @@ packages: - utf-8-validate dev: true - /jest-runtime/27.5.1: + /jest-runtime@27.5.1: resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11587,7 +22636,7 @@ packages: cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 execa: 5.1.1 - glob: 7.2.0 + glob: 7.2.3 graceful-fs: 4.2.10 jest-haste-map: 27.5.1 jest-message-util: 27.5.1 @@ -11602,36 +22651,36 @@ packages: - supports-color dev: true - /jest-serializer/26.6.2: + /jest-serializer@26.6.2: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 graceful-fs: 4.2.10 dev: true - /jest-serializer/27.5.1: + /jest-serializer@27.5.1: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 graceful-fs: 4.2.10 dev: true - /jest-snapshot/27.5.1: + /jest-snapshot@27.5.1: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.10 - '@babel/generator': 7.17.10 - '@babel/plugin-syntax-typescript': 7.17.10_@babel+core@7.17.10 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 + '@babel/core': 7.21.0 + '@babel/generator': 7.21.1 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.0) + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/babel__traverse': 7.17.1 - '@types/prettier': 2.6.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.10 + '@types/babel__traverse': 7.18.3 + '@types/prettier': 2.7.2 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.0) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.10 @@ -11643,36 +22692,47 @@ packages: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.3.7 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true - /jest-util/26.6.2: + /jest-util@26.6.2: resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 17.0.4 + '@types/node': 18.11.9 chalk: 4.1.2 graceful-fs: 4.2.10 is-ci: 2.0.0 micromatch: 4.0.5 dev: true - /jest-util/27.5.1: + /jest-util@27.5.1: resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.5.1 - '@types/node': 17.0.4 + '@jest/types': 27.5.1 + '@types/node': 18.11.9 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + + /jest-util@29.5.0: + resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 18.11.9 chalk: 4.1.2 - ci-info: 3.3.1 + ci-info: 3.8.0 graceful-fs: 4.2.10 picomatch: 2.3.1 - dev: true - /jest-validate/27.5.1: + /jest-validate@27.5.1: resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -11684,38 +22744,46 @@ packages: pretty-format: 27.5.1 dev: true - /jest-watcher/27.5.1: + /jest-watcher@27.5.1: resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.4 + '@types/node': 18.11.9 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 string-length: 4.0.2 dev: true - /jest-worker/26.6.2: + /jest-worker@26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true - /jest-worker/27.5.1: + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 17.0.4 + '@types/node': 18.11.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest-worker@29.4.3: + resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.11.9 + jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jest/27.5.1_ts-node@10.7.0: + /jest@27.5.1(ts-node@10.9.1): resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -11725,9 +22793,9 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.5.1_ts-node@10.7.0 + '@jest/core': 27.5.1(ts-node@10.9.1) import-local: 3.1.0 - jest-cli: 27.5.1_ts-node@10.7.0 + jest-cli: 27.5.1(ts-node@10.9.1) transitivePeerDependencies: - bufferutil - canvas @@ -11736,34 +22804,74 @@ packages: - utf-8-validate dev: true - /joycon/3.1.1: + /jiti@1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + hasBin: true + dev: false + + /jmespath@0.15.0: + resolution: {integrity: sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==} + engines: {node: '>= 0.6.0'} + dev: false + + /joi@17.8.3: + resolution: {integrity: sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + /jose@4.11.2: + resolution: {integrity: sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==} + dev: false + + /jose@4.9.0: + resolution: {integrity: sha512-RgaqEOZLkVO+ViN3KkN44XJt9g7+wMveUv59sVLaTxONcUPc8ZpfqOCeLphVBZyih2dgkvZ0Ap1CNcokvY7Uyw==} + dev: false + + /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - /js-base64/3.7.2: + /js-base64@3.7.2: resolution: {integrity: sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==} dev: false - /js-sha3/0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} dev: false - /js-string-escape/1.0.1: + /js-sdsl@4.3.0: + resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} + + /js-string-escape@1.0.1: resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} engines: {node: '>= 0.8'} dev: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 - /jsdom/16.7.0: + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /jsdom@16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} peerDependencies: @@ -11773,12 +22881,12 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.7.1 + acorn: 8.8.2 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 - decimal.js: 10.3.1 + decimal.js: 10.4.3 domexception: 2.0.1 escodegen: 2.0.0 form-data: 3.0.1 @@ -11786,18 +22894,18 @@ packages: http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.0 + nwsapi: 2.2.2 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 - tough-cookie: 4.0.0 + tough-cookie: 4.1.2 w3c-hr-time: 1.0.2 w3c-xmlserializer: 2.0.0 webidl-conversions: 6.1.0 whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.7 + ws: 7.5.9 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil @@ -11805,218 +22913,385 @@ packages: - utf-8-validate dev: true - /jsesc/0.5.0: + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true - dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - /json-parse-better-errors/1.0.2: + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - /json-schema/0.4.0: + /json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - /json2mq/0.2.0: + /json-stream@1.0.0: + resolution: {integrity: sha512-H/ZGY0nIAg3QcOwE1QN/rK/Fa7gJn7Ii5obwp6zyPO4xiPNwpIMjqy2gwjBEGqzkF/vSWEIBQCBuN19hYiL6Qg==} + dev: false + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + /json2mq@0.2.0: resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} dependencies: string-convert: 0.2.1 dev: false - /json5/1.0.1: - resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: - minimist: 1.2.6 + minimist: 1.2.8 dev: true - /json5/2.2.1: + /json5@2.2.1: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true - dev: true - /jsonc-parser/3.0.0: - resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + /jsonexport@3.2.0: + resolution: {integrity: sha512-GbO9ugb0YTZatPd/hqCGR0FSwbr82H6OzG04yzdrG7XOe4QZ0jhQ+kOsB29zqkzoYJLmLxbbrFiuwbQu891XnQ==} + hasBin: true dev: false - /jsonfile/2.4.0: + /jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /jsonfile/4.0.0: + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.10 - /jsonparse/1.3.1: + /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} dev: true - /jsonpointer/5.0.0: - resolution: {integrity: sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==} + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} dev: true - /jsonschema/1.4.0: - resolution: {integrity: sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==} + /jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + dev: false + + /jsonwebtoken@8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 5.7.1 + dev: false + + /jsonwebtoken@9.0.1: + resolution: {integrity: sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash: 4.17.21 + ms: 2.1.3 + semver: 7.5.4 dev: false - /jsx-ast-utils/3.3.0: - resolution: {integrity: sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==} + /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 + + /jsx-ast-utils@3.3.3: + resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.5 - object.assign: 4.1.2 + array-includes: 3.1.6 + object.assign: 4.1.4 dev: true - /junk/3.1.0: + /jsx-dom-cjs@8.0.3: + resolution: {integrity: sha512-TL+vWdFH6piot6tHXc/84L0QPwhnLxzTYm0KCrMM5wA1VdsHzDfbc7MRFgSgoeIMFH7LvZ82Gc9x5rzumtjHSA==} + dependencies: + csstype: 3.1.1 + dev: false + + /junk@3.1.0: resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==} engines: {node: '>=8'} dev: true - /jwt-decode/3.1.2: + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} dev: false - /kind-of/3.2.2: + /kareem@2.3.2: + resolution: {integrity: sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==} + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /keyv@4.5.2: + resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + dependencies: + json-buffer: 3.0.1 + + /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: + /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: + /kind-of@5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} dev: true - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - dev: true - /klaw/1.3.1: + /klaw@1.3.1: resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - dev: true - /klona/2.0.5: - resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + /klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + + /koa@2.13.4: + resolution: {integrity: sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4(supports-color@9.2.2) + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /latest-version@5.1.0: + resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} + engines: {node: '>=8'} + dependencies: + package-json: 6.5.0 + + /latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.0 dev: true - /lazy-brush/1.0.1: + /lazy-brush@1.0.1: resolution: {integrity: sha512-xT/iSClTVi7vLoF8dCWTBhCuOWqsLXCMPa6ucVmVAk6hyNCM5JeS1NLhXqIrJktUg+caEYKlqSOUU4u3cpXzKg==} dev: false - /lazy-universal-dotenv/3.0.1: + /lazy-universal-dotenv@3.0.1: resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} engines: {node: '>=6.0.0', npm: '>=6.0.0', yarn: '>=1.0.0'} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 app-root-dir: 1.0.2 - core-js: 3.22.5 + core-js: 3.28.0 dotenv: 8.6.0 dotenv-expand: 5.1.0 dev: true - /lazystream/1.0.1: + /lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: true - /lead/1.0.0: + /lead@1.0.0: resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} engines: {node: '>= 0.10'} dependencies: flush-write-stream: 1.1.1 dev: true - /less-loader/10.2.0_less@4.1.2+webpack@5.73.0: + /less-loader@10.2.0(less@4.1.3)(webpack@5.75.0): resolution: {integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==} engines: {node: '>= 12.13.0'} peerDependencies: less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 + webpack: 5.75.0 dependencies: - klona: 2.0.5 - less: 4.1.2 - webpack: 5.73.0_webpack-cli@4.9.2 + klona: 2.0.6 + less: 4.1.3 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + + /less@3.13.1: + resolution: {integrity: sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + tslib: 1.14.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.10 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + native-request: 1.1.0 + source-map: 0.6.1 dev: true - /less/4.1.2: - resolution: {integrity: sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==} + /less@4.1.3: + resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} engines: {node: '>=6'} hasBin: true dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.4.0 + tslib: 2.5.0 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.10 image-size: 0.5.5 make-dir: 2.1.0 mime: 1.6.0 - needle: 2.9.1 + needle: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /leven/3.1.0: + /leven@2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} - dev: true - /levn/0.3.0: + /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -12024,45 +23299,89 @@ packages: type-check: 0.3.2 dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + + /lib0@0.2.52: + resolution: {integrity: sha512-CjxlM7UgICfN6b2OPALBXchIBiNk6jE+1g7JP8ha+dh1xKRDSYpH0WQl1+rMqCju49xUnwPG34v4CR5/rPOZhg==} + engines: {node: '>=14'} + dependencies: + isomorphic.js: 0.2.5 + dev: false + + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + + /liftoff@4.0.0: + resolution: {integrity: sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==} + engines: {node: '>=10.13.0'} + dependencies: + extend: 3.0.2 + findup-sync: 5.0.0 + fined: 2.0.0 + flagged-respawn: 2.0.0 + is-plain-object: 5.0.0 + object.map: 1.0.1 + rechoir: 0.8.0 + resolve: 1.22.2 + dev: false + + /lilconfig@2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} + engines: {node: '>=10'} dev: true - /lilconfig/2.0.5: - resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - dev: false - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /lint-staged/11.2.6: - resolution: {integrity: sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg==} + /link-preview-js@2.1.19: + resolution: {integrity: sha512-ZXiacDuzpNLY/Xx7R3njpI07K2VWZqe/kANwc4RdRPTc+uAkBHW3hGHTeN7upnyrwV7hfwR79CjRXo0fvfGH5A==} + dependencies: + abort-controller: 3.0.0 + cheerio: 1.0.0-rc.11 + cross-fetch: 3.1.5 + url: 0.11.0 + transitivePeerDependencies: + - encoding + dev: false + + /lint-staged@13.1.2: + resolution: {integrity: sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==} + engines: {node: ^14.13.1 || >=16.0.0} hasBin: true dependencies: - cli-truncate: 2.1.0 - colorette: 1.4.0 - commander: 8.3.0 - cosmiconfig: 7.0.1 - debug: 4.3.3_supports-color@8.1.1 - enquirer: 2.3.6 - execa: 5.1.1 - listr2: 3.14.0_enquirer@2.3.6 + cli-truncate: 3.1.0 + colorette: 2.0.19 + commander: 9.5.0 + debug: 4.3.4(supports-color@9.2.2) + execa: 6.1.0 + lilconfig: 2.0.6 + listr2: 5.0.7 micromatch: 4.0.5 normalize-path: 3.0.0 - please-upgrade-node: 3.2.0 + object-inspect: 1.12.3 + pidtree: 0.6.0 string-argv: 0.3.1 - stringify-object: 3.3.0 - supports-color: 8.1.1 + yaml: 2.2.1 + transitivePeerDependencies: + - enquirer + - supports-color dev: true - /listr2/3.14.0_enquirer@2.3.6: - resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} - engines: {node: '>=10.0.0'} + /listr2@5.0.7: + resolution: {integrity: sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==} + engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: enquirer: '>= 2.3.0 < 3' peerDependenciesMeta: @@ -12070,117 +23389,275 @@ packages: optional: true dependencies: cli-truncate: 2.1.0 - colorette: 2.0.16 - enquirer: 2.3.6 + colorette: 2.0.19 log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.3.0 - rxjs: 7.5.5 + rxjs: 7.8.0 through: 2.3.8 wrap-ansi: 7.0.0 dev: true - /loader-runner/2.4.0: - resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + /livekit-client@1.12.1: + resolution: {integrity: sha512-/mob04a/Mb0D+4sIzB7/pqakpJMCORSK+Qu5oTIcuSpgL+eBYGzHPE2sutGCGoe3Ns9sITAqUTyiui5+GN3i2w==} + dependencies: + eventemitter3: 5.0.1 + loglevel: 1.8.0 + protobufjs: 7.2.4 + sdp-transform: 2.14.1 + ts-debounce: 4.0.0 + webrtc-adapter: 8.2.3 + dev: false + + /livekit-server-sdk@1.2.5: + resolution: {integrity: sha512-QYHGEoilSAXUQQBAZE2SXU1oXW8z08VFp2UxcZzXdPt3u4E9xamghTMhgniLMWmpSCl7oqVObQ6XXnK9rkr0Pg==} + dependencies: + axios: 1.4.0 + camelcase-keys: 7.0.2 + jsonwebtoken: 9.0.1 + protobufjs: 7.2.4 + transitivePeerDependencies: + - debug + dev: false + + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + graceful-fs: 4.2.10 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + optional: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 dev: true - /loader-runner/4.3.0: + /load-json-file@5.3.0: + resolution: {integrity: sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 4.0.1 + strip-bom: 3.0.0 + type-fest: 0.3.1 + dev: false + + /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - dev: true - /loader-utils/1.4.0: + /loader-utils@1.4.0: resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} engines: {node: '>=4.0.0'} dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 1.0.1 + json5: 1.0.2 dev: true - /loader-utils/2.0.0: - resolution: {integrity: sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==} + /loader-utils@2.0.2: + resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==} engines: {node: '>=8.9.0'} dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.1 + json5: 2.2.3 dev: true - /loader-utils/2.0.2: - resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==} + /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.1 + json5: 2.2.3 + + /loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + dev: false + + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 dev: true - /locate-path/3.0.0: + /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: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 - dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - dev: true - /lodash-es/4.17.21: + /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false - /lodash.debounce/4.0.8: + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + dev: false + + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + /lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + /lodash.flow@3.5.0: + resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} + dev: false + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} dev: true - /lodash.memoize/4.1.2: + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true - /lodash.sortby/4.7.0: + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true - /lodash.topath/4.5.2: + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.topath@4.5.2: resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==} dev: false - /lodash.truncate/4.4.2: + /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - dev: true - /lodash.uniq/4.5.0: + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - /lodash/4.17.21: + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-symbols/4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + /log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.1.2 + is-unicode-supported: 1.3.0 + + /log-update@3.4.0: + resolution: {integrity: sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==} + engines: {node: '>=6'} dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: false + ansi-escapes: 3.2.0 + cli-cursor: 2.1.0 + wrap-ansi: 5.1.0 - /log-update/4.0.0: + /log-update@4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} dependencies: @@ -12190,153 +23667,316 @@ packages: wrap-ansi: 6.2.0 dev: true - /loose-envify/1.4.0: + /loglevel@1.8.0: + resolution: {integrity: sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==} + engines: {node: '>= 0.6.0'} + dev: false + + /loglevel@1.8.1: + resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} + engines: {node: '>= 0.6.0'} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 - /lower-case/2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + /loud-rejection@1.6.0: + resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: - tslib: 2.4.0 + currently-unhandled: 0.4.1 + signal-exit: 3.0.7 dev: true + optional: true - /lowlight/1.20.0: - resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + /lower-case-first@1.0.2: + resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} dependencies: - fault: 1.0.4 - highlight.js: 10.7.3 - dev: true + lower-case: 1.1.4 + dev: false + + /lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.5.0 + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} - /lru-cache/5.1.1: + /lru-cache@10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + engines: {node: 14 || >=16.14} + dev: false + + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: true - /lz-string/1.4.4: + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + + /lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + dev: false + + /lz-string@1.4.4: resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} hasBin: true dev: true - /magic-string/0.25.9: + /macos-release@3.1.0: + resolution: {integrity: sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 - /make-dir/2.1.0: + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} requiresBuild: true dependencies: pify: 4.0.1 semver: 5.7.1 - dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - /makeerror/1.0.12: + /make-iterator@1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: false + + /make-plural@6.2.2: + resolution: {integrity: sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==} + dev: false + + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /map-cache/0.2.2: + /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} - dev: true - /map-obj/1.0.1: + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/4.3.0: + /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} - dev: true - /map-or-similar/1.5.0: + /map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} dev: true - /map-visit/1.0.0: + /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-escapes/1.0.4: + /markdown-escapes@1.0.4: resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} - dev: true - /markdown-to-jsx/7.1.7_react@17.0.2: - resolution: {integrity: sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==} - engines: {node: '>= 10'} - peerDependencies: - react: '>= 0.14.0' - dependencies: - react: 17.0.2 - dev: true + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /marked@4.1.1: + resolution: {integrity: sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==} + engines: {node: '>= 12'} + hasBin: true + dev: false - /match-sorter/6.3.1: + /match-sorter@6.3.1: resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 remove-accents: 0.4.2 dev: false - /md5.js/1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + /material-colors@1.2.6: + resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} + dev: false + + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false - /mdast-squeeze-paragraphs/4.0.0: + /mdast-squeeze-paragraphs@4.0.0: resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==} dependencies: unist-util-remove: 2.1.0 - dev: true - /mdast-util-definitions/4.0.0: + /mdast-util-definitions@4.0.0: resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} dependencies: unist-util-visit: 2.0.3 - /mdast-util-from-markdown/0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 + '@types/mdast': 3.0.11 + '@types/unist': 2.0.6 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.11 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.0 + unist-util-visit-parents: 5.1.3 + dev: false + + /mdast-util-from-markdown@1.3.0: + resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} + dependencies: + '@types/mdast': 3.0.11 + '@types/unist': 2.0.6 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.1.1 + micromark: 3.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-decode-string: 1.0.2 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.11 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.1.0 + dev: false + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.0.0 + dev: false + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.11 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.0 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.0 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color dev: false - /mdast-util-to-hast/10.0.1: + /mdast-util-phrasing@3.0.0: + resolution: {integrity: sha512-S+QYsDRLkGi8U7o5JF1agKa/sdP+CNGXXLqC17pdTVL8FHHgQEiwFGa9yE5aYtUxNiFGYoaDy9V1kC85Sz86Gg==} + dependencies: + '@types/mdast': 3.0.11 + unist-util-is: 5.2.0 + dev: false + + /mdast-util-to-hast@10.0.1: resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} dependencies: - '@types/mdast': 3.0.10 + '@types/mdast': 3.0.11 '@types/unist': 2.0.6 mdast-util-definitions: 4.0.0 mdurl: 1.0.1 @@ -12344,131 +23984,451 @@ packages: unist-util-generated: 1.1.6 unist-util-position: 3.1.0 unist-util-visit: 2.0.3 - dev: true - /mdast-util-to-hast/10.2.0: - resolution: {integrity: sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==} + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.11 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.1.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: - '@types/mdast': 3.0.10 + '@types/mdast': 3.0.11 '@types/unist': 2.0.6 - mdast-util-definitions: 4.0.0 - mdurl: 1.0.1 - unist-builder: 2.0.3 - unist-util-generated: 1.1.6 - unist-util-position: 3.1.0 - unist-util-visit: 2.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.0 + mdast-util-to-string: 3.1.1 + micromark-util-decode-string: 1.0.2 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 dev: false - /mdast-util-to-string/1.1.0: + /mdast-util-to-string@1.1.0: resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} dev: true - /mdast-util-to-string/2.0.0: + /mdast-util-to-string@2.0.0: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} dev: false - /mdn-data/2.0.14: + /mdast-util-to-string@3.1.1: + resolution: {integrity: sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==} + dependencies: + '@types/mdast': 3.0.11 + dev: false + + /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + /mdn-data@2.0.4: + resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + + /mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /mediasoup-client@3.6.57: + resolution: {integrity: sha512-/DHOpgyebCgNIFZ8ZmOZXMPXklyFxTPJa3IoVybG7cghMetMeqvGiOhzgR5i/uoMZ1CMGsOCBF9+604gyBzt4w==} + engines: {node: '>=10'} + dependencies: + '@types/debug': 4.1.7 + '@types/events': 3.0.0 + awaitqueue: 2.4.0 + bowser: 2.11.0 + debug: 4.3.4(supports-color@9.2.2) + events: 3.3.0 + fake-mediastreamtrack: 1.1.6 + h264-profile-level-id: 1.0.1(supports-color@9.2.2) + sdp-transform: 2.14.1 + supports-color: 9.2.2 + dev: false + + /medium-zoom@1.0.8: + resolution: {integrity: sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==} + dev: false + + /memfs@3.4.13: + resolution: {integrity: sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.3 + + /memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + dev: false + + /memoizee@0.3.10: + resolution: {integrity: sha512-LLzVUuWwGBKK188spgOK/ukrp5zvd9JGsiLDH41pH9vt5jvhZfsu5pxDuAnYAMG8YEGce72KO07sSBy9KkvOfw==} + dependencies: + d: 0.1.1 + es5-ext: 0.10.62 + es6-weak-map: 0.1.4 + event-emitter: 0.3.5 + lru-queue: 0.1.0 + next-tick: 0.2.2 + timers-ext: 0.1.7 + + /memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + dependencies: + map-or-similar: 1.5.0 + 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-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + requiresBuild: true + optional: true + + /meow@3.7.0: + resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + camelcase-keys: 2.1.0 + decamelize: 1.2.0 + loud-rejection: 1.6.0 + map-obj: 1.0.1 + minimist: 1.2.8 + normalize-package-data: 2.5.0 + object-assign: 4.1.1 + read-pkg-up: 1.0.1 + redent: 1.0.0 + trim-newlines: 1.0.0 + dev: true + optional: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /messageformat-parser@4.1.3: + resolution: {integrity: sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg==} + dev: false + + /metalsmith@2.5.0: + resolution: {integrity: sha512-tBFpCMq8t/ZeD8qbvyWSLjyW7aO8RJYeFSk8LyclgHYaeMWiSPrMxXc3NORVCJ3iG17aRxuL/+nla58Qq3DBcQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + dependencies: + commander: 6.2.1 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@9.2.2) + gray-matter: 4.0.3 + is-utf8: 0.2.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + stat-mode: 1.0.0 + ware: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + /miao-lang@1.0.5: + resolution: {integrity: sha512-aXfDZJ8aXR4fnMkJyJPGWf9gH55odkYNjxPTOlN6N4MH/+2Dt8d4TvM99bjyERG/tG4XprH9Q3bBQEkwKwXrRA==} + dependencies: + js-base64: 3.7.2 + dev: false + + /microevent.ts@0.1.1: + resolution: {integrity: sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==} + dev: true + + /micromark-core-commonmark@1.0.6: + resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.0.0 + micromark-factory-label: 1.0.2 + micromark-factory-space: 1.0.0 + micromark-factory-title: 1.0.2 + micromark-factory-whitespace: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-html-tag-name: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-footnote@1.1.0: + resolution: {integrity: sha512-RWYce7j8+c0n7Djzv5NzGEGitNNYO3uj+h/XYMdS/JinH1Go+/Qkomg/rfxExFzYTiydaV6GLeffGO5qcJbMPA==} + dependencies: + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-strikethrough@1.0.5: + resolution: {integrity: sha512-X0oI5eYYQVARhiNfbETy7BfLSmSilzN1eOuoRnrf9oUNsPRrWOAe9UqSizgw1vNxQBfOwL+n2610S3bYjVNi7w==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-table@1.0.5: + resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.0.2 + dev: false + + /micromark-extension-gfm-task-list-item@1.0.4: + resolution: {integrity: sha512-9XlIUUVnYXHsFF2HZ9jby4h3npfX10S1coXTnV035QGPgrtNYQq3J6IfIvcCIUAJrrqBVi5BqA/LmaOMJqPwMQ==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm@2.0.1: + resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.3 + micromark-extension-gfm-footnote: 1.1.0 + micromark-extension-gfm-strikethrough: 1.0.5 + micromark-extension-gfm-table: 1.0.5 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.4 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-destination@1.0.0: + resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false + + /micromark-factory-label@1.0.2: + resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-factory-space@1.0.0: + resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-types: 1.0.2 dev: false - /mdn-data/2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + /micromark-factory-title@1.0.2: + resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 dev: false - /mdurl/1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - - /media-typer/0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true + /micromark-factory-whitespace@1.0.0: + resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false - /memfs/3.4.1: - resolution: {integrity: sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==} - engines: {node: '>= 4.0.0'} + /micromark-util-character@1.1.0: + resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} dependencies: - fs-monkey: 1.0.3 - dev: true + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false - /memoize-one/6.0.0: - resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + /micromark-util-chunked@1.0.0: + resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + dependencies: + micromark-util-symbol: 1.0.1 dev: false - /memoizerific/1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + /micromark-util-classify-character@1.0.0: + resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} dependencies: - map-or-similar: 1.5.0 - dev: true + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: false - /memory-fs/0.4.1: - resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} + /micromark-util-combine-extensions@1.0.0: + resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} dependencies: - errno: 0.1.8 - readable-stream: 2.3.7 - dev: true + micromark-util-chunked: 1.0.0 + micromark-util-types: 1.0.2 + dev: false - /memory-fs/0.5.0: - resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + /micromark-util-decode-numeric-character-reference@1.0.0: + resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} dependencies: - errno: 0.1.8 - readable-stream: 2.3.7 - dev: true + micromark-util-symbol: 1.0.1 + dev: false - /meow/8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + /micromark-util-decode-string@1.0.2: + resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.0 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-symbol: 1.0.1 + dev: false - /merge-descriptors/1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true + /micromark-util-encode@1.0.1: + resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} + dev: false - /merge-stream/2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + /micromark-util-html-tag-name@1.1.0: + resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} + dev: false - /merge2/1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + /micromark-util-normalize-identifier@1.0.0: + resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: false - /methods/1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true + /micromark-util-resolve-all@1.0.0: + resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + dependencies: + micromark-util-types: 1.0.2 + dev: false - /miao-lang/1.0.5: - resolution: {integrity: sha512-aXfDZJ8aXR4fnMkJyJPGWf9gH55odkYNjxPTOlN6N4MH/+2Dt8d4TvM99bjyERG/tG4XprH9Q3bBQEkwKwXrRA==} + /micromark-util-sanitize-uri@1.1.0: + resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} dependencies: - js-base64: 3.7.2 + micromark-util-character: 1.1.0 + micromark-util-encode: 1.0.1 + micromark-util-symbol: 1.0.1 dev: false - /microevent.ts/0.1.1: - resolution: {integrity: sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==} - dev: true + /micromark-util-subtokenize@1.0.2: + resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: false + + /micromark-util-symbol@1.0.1: + resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + dev: false + + /micromark-util-types@1.0.2: + resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + dev: false - /micromark/2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + /micromark@3.1.0: + resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} dependencies: - debug: 4.3.3 - parse-entities: 2.0.0 + '@types/debug': 4.1.7 + debug: 4.3.4(supports-color@9.2.2) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-combine-extensions: 1.0.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-encode: 1.0.1 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-sanitize-uri: 1.1.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 transitivePeerDependencies: - supports-color dev: false - /micromatch/3.1.10: + /micromatch@3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} dependencies: @@ -12489,139 +24449,180 @@ packages: - supports-color dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 - /microseconds/0.2.0: - resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} + /mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} dev: false - /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: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - /mime-types/2.1.35: + /mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.33.0 + dev: false + + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - /mime/1.6.0: + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true - dev: true - /mime/2.6.0: + /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true - /mimic-fn/1.2.0: + /mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} - dev: false - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /min-document/2.19.0: + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + /min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} dependencies: dom-walk: 0.1.2 - dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /mini-create-react-context/0.4.1_2d37ibx6onn5gxj7obk37edtfe: - resolution: {integrity: sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==} + /mini-css-extract-plugin@2.7.2(webpack@5.75.0): + resolution: {integrity: sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==} + engines: {node: '>= 12.13.0'} peerDependencies: - prop-types: ^15.0.0 - react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + webpack: 5.75.0 dependencies: - '@babel/runtime': 7.17.9 - prop-types: 15.8.0 - react: 17.0.2 - tiny-warning: 1.0.3 - dev: false + schema-utils: 4.0.0 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) - /mini-css-extract-plugin/1.6.2_webpack@5.73.0: - resolution: {integrity: sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.4.0 || ^5.0.0 + /mini-star@1.3.1: + resolution: {integrity: sha512-u9Rw8mPZibaAkEVXBsOQJ1irAURTgjqdKoITFd24+KxIGVXCDK+RYR8KjKRF99VLaCbK6TwTqiJ6iNsqq0G+wA==} + hasBin: true dependencies: - loader-utils: 2.0.2 - schema-utils: 3.1.1 - webpack: 5.73.0_webpack-cli@4.9.2 - webpack-sources: 1.4.3 + '@rollup/plugin-commonjs': 19.0.2(rollup@2.79.1) + '@rollup/plugin-json': 4.1.0(rollup@2.79.1) + '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) + '@rollup/plugin-url': 6.1.0(rollup@2.79.1) + cosmiconfig: 7.1.0 + esbuild: 0.12.29 + fs-extra: 9.1.0 + inquirer: 8.2.5 + ora: 5.4.1 + rimraf: 3.0.2 + rollup: 2.79.1 + rollup-plugin-esbuild: 4.10.3(esbuild@0.12.29)(rollup@2.79.1) + rollup-plugin-styles: 3.14.1(rollup@2.79.1) + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color dev: true - /mini-star/1.3.1: - resolution: {integrity: sha512-u9Rw8mPZibaAkEVXBsOQJ1irAURTgjqdKoITFd24+KxIGVXCDK+RYR8KjKRF99VLaCbK6TwTqiJ6iNsqq0G+wA==} + /mini-star@2.0.5: + resolution: {integrity: sha512-6zt5E8ky/LO7SrPgvVuLzF1E5/bnuex5zLQHpuKq/XBuTHb/iSD9UMav5o2bfYyzhsWNCLE/dUWmgm7bdQGocg==} + hasBin: true + dependencies: + '@rollup/plugin-commonjs': 19.0.2(rollup@2.79.1) + '@rollup/plugin-json': 4.1.0(rollup@2.79.1) + '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) + '@rollup/plugin-url': 6.1.0(rollup@2.79.1) + cosmiconfig: 7.1.0 + esbuild: 0.12.29 + fs-extra: 9.1.0 + inquirer: 8.2.5 + ora: 5.4.1 + rimraf: 3.0.2 + rollup: 2.79.1 + rollup-plugin-esbuild: 4.10.3(esbuild@0.12.29)(rollup@2.79.1) + rollup-plugin-styles: 3.14.1(rollup@2.79.1) + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mini-star@2.1.1: + resolution: {integrity: sha512-MNXj03bZnZpfrqvW/8YZwVGyZBVL4j11xM4QqnotcUTKyHVoqDT7hf9PoD5lS9SM6xajBp9Nqkbel6iMLG6q2w==} hasBin: true dependencies: - '@rollup/plugin-commonjs': 19.0.2_rollup@2.72.1 - '@rollup/plugin-json': 4.1.0_rollup@2.72.1 - '@rollup/plugin-node-resolve': 13.3.0_rollup@2.72.1 - '@rollup/plugin-url': 6.1.0_rollup@2.72.1 - cosmiconfig: 7.0.1 + '@rollup/plugin-commonjs': 19.0.2(rollup@2.79.1) + '@rollup/plugin-json': 4.1.0(rollup@2.79.1) + '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.1) + '@rollup/plugin-url': 6.1.0(rollup@2.79.1) + cosmiconfig: 7.1.0 esbuild: 0.12.29 fs-extra: 9.1.0 - inquirer: 8.2.4 + inquirer: 8.2.5 ora: 5.4.1 rimraf: 3.0.2 - rollup: 2.72.1 - rollup-plugin-esbuild: 4.9.1_5xlwrs4uhpklszmwg2enemva4u - rollup-plugin-styles: 3.14.1_rollup@2.72.1 + rollup: 2.79.1 + rollup-plugin-esbuild: 4.10.3(esbuild@0.12.29)(rollup@2.79.1) + rollup-plugin-styles: 3.14.1(rollup@2.79.1) yargs: 16.2.0 transitivePeerDependencies: - supports-color dev: false - /minimalistic-assert/1.0.1: + /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.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - /minimatch/3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + /minimatch@5.1.1: + resolution: {integrity: sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==} + engines: {node: '>=10'} dependencies: - brace-expansion: 1.1.11 - dev: true + brace-expansion: 2.0.1 + dev: false - /minimatch/5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options/4.1.0: + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -12630,162 +24631,550 @@ packages: kind-of: 6.0.3 dev: true - /minimist/1.2.0: + /minimist@1.2.0: resolution: {integrity: sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==} dev: false - /minimist/1.2.6: + /minimist@1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minio@7.1.1: + resolution: {integrity: sha512-HBLRFXs1CkNwAkahU+j1ilB9YS/Tmkdc6orpxVW1YN11NlEJyLjarIpBYu/inF+dj+tJIsA8PSKNnRmUNm+9qQ==} + engines: {node: ^16 || ^18 || >=20} + dependencies: + async: 3.2.4 + block-stream2: 2.1.0 + browser-or-node: 2.1.1 + buffer-crc32: 0.2.13 + fast-xml-parser: 4.2.6 + ipaddr.js: 2.0.1 + json-stream: 1.0.0 + lodash: 4.17.21 + mime-types: 2.1.35 + query-string: 7.1.3 + through2: 4.0.2 + web-encoding: 1.1.5 + xml: 1.0.1 + xml2js: 0.5.0 + dev: false - /minipass-collect/1.0.2: + /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.6 + minipass: 3.3.6 dev: true - /minipass-flush/1.0.5: + /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.6 + minipass: 3.3.6 + dev: true + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@4.2.1: + resolution: {integrity: sha512-KS4CHIsDfOZetnT+u6fwxyFADXLamtkPxkGScmmtTW//MlRrImV+LtbmbJpLQ86Hw7km/utbfEfndhGBrfwvlA==} + engines: {node: '>=8'} + dev: true + + /minipass@7.0.2: + resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + 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-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /modern-normalize@1.1.0: + resolution: {integrity: sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==} + engines: {node: '>=6'} + dev: false + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} dev: true - /minipass-pipeline/1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + /moleculer-cli@0.7.1(ejs@3.1.8)(ioredis@4.28.5)(redlock@4.2.0): + resolution: {integrity: sha512-RCiaP6Hd3WykuoTr9ezOZm6jD07/KJApHBgP7btITmsE9KztOs8qTOvzNxU3avbq4v3qdf2zZSsIMoHXdI07/w==} + hasBin: true + dependencies: + async: 3.2.4 + consolidate: 0.15.1(ejs@3.1.8)(handlebars@4.7.7)(lodash@4.17.21) + download-git-repo: 3.0.2 + exeq: 3.0.0 + glob: 7.2.3 + handlebars: 4.7.7 + inquirer: 7.3.3 + kleur: 3.0.3 + lodash: 4.17.21 + metalsmith: 2.5.0 + minimatch: 3.1.2 + mkdirp: 1.0.4 + moleculer: 0.14.23(patch_hash=ahhlgpfy57fntn2aftq6beaeja)(ioredis@4.28.5)(nats@1.4.12)(redlock@4.2.0) + moleculer-repl: 0.6.6 + multimatch: 4.0.0 + nats: 1.4.12 + request: 2.88.2 + rimraf: 3.0.2 + update-notifier: 4.1.3 + yargs: 15.4.1 + transitivePeerDependencies: + - amqplib + - arc-templates + - atpl + - avsc + - babel-core + - bracket-template + - bunyan + - cbor-x + - coffee-script + - dd-trace + - debug + - dot + - dust + - dustjs-helpers + - dustjs-linkedin + - eco + - ect + - ejs + - encoding + - etcd3 + - haml-coffee + - hamlet + - hamljs + - hogan.js + - htmling + - ioredis + - jade + - jaeger-client + - jazz + - jqtpl + - just + - kafka-node + - liquid-node + - liquor + - log4js + - marko + - mote + - mqtt + - msgpack5 + - mustache + - node-nats-streaming + - notepack.io + - nunjucks + - pino + - plates + - protobufjs + - pug + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - redlock + - rhea-promise + - slm + - squirrelly + - supports-color + - swig + - swig-templates + - teacup + - templayed + - then-jade + - then-pug + - thrift + - tinyliquid + - toffee + - twig + - twing + - underscore + - vash + - velocityjs + - walrus + - whiskers + - winston + dev: true + + /moleculer-db@0.8.19(moleculer@0.14.23): + resolution: {integrity: sha512-MRlFmPrQy7AqUQWGBnzyF1vIcUX46L17OFDjom6OFNqtqwb4wloVNz2PDdWfZI12w4olToMfDon+O4ugWH1R6Q==} + engines: {node: '>= 8.x.x'} + peerDependencies: + moleculer: ^0.12.0 || ^0.13.0 || ^0.14.0 + peerDependenciesMeta: + moleculer: + optional: true + dependencies: + '@seald-io/nedb': 3.1.0 + bluebird: 3.7.2 + flat: 5.0.2 + lodash: 4.17.21 + moleculer: 0.14.23(patch_hash=ahhlgpfy57fntn2aftq6beaeja)(ioredis@4.28.5)(nats@1.4.12)(redlock@4.2.0) + dev: false + + /moleculer-repl@0.6.6: + resolution: {integrity: sha512-XQuz6PdosVgm8SkqJ21gba+VlDGvDHMd2yGhZyeZaoacWEe1wovA8Smr+JuAwFCz6YEpv6Gp6NVLMyHoG5DcsQ==} + engines: {node: '>= 12.x.x'} + dependencies: + '@moleculer/vorpal': 1.11.5 + clui: 0.3.6 + glob: 7.2.3 + is-stream: 2.0.1 + kleur: 4.1.5 + lodash: 4.17.21 + ora: 5.4.1 + pretty-bytes: 5.6.0 + table: 6.8.0 + tiny-human-time: 1.2.0 + + /moleculer-repl@0.7.2: + resolution: {integrity: sha512-f+vK8tu3LZUa9iD6A1iLJxYGBJ1aDbStwoJKG7BcsZNtkHRbLvvQsp39qxQGfz7QCjUbXkDGXDanQ/DqSw1FTA==} + engines: {node: '>= 12.x.x'} + dependencies: + clui: 0.3.6 + commander: 9.4.0 + glob: 7.2.3 + kleur: 4.1.5 + lodash: 4.17.21 + ora: 5.4.1 + pretty-bytes: 5.6.0 + string-argv: 0.3.1 + table: 6.8.0 + tiny-human-time: 1.2.0 + yargs-parser: 21.1.1 + dev: false + + /moleculer@0.14.23(patch_hash=ahhlgpfy57fntn2aftq6beaeja)(ioredis@4.28.5)(nats@1.4.12)(redlock@4.2.0): + resolution: {integrity: sha512-DE84fy8+1QiA7kUkF9ce4nyDdptBDlLFQfsaUccTScMGAbEjye5e+zfoI9iSA9rznwvshC8tgLhbOcnQBMn/HA==} + engines: {node: '>= 10.x.x'} + hasBin: true + peerDependencies: + amqplib: ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 + avsc: ^5.0.0 + bunyan: ^1.0.0 + cbor-x: ^0.8.3 || ^0.9.0 || ^1.2.0 + dd-trace: ^0.33.0 || ^0.34.0 || ^0.35.0 || ^0.36.0 || >=1.0.0 <1.6.0 + debug: ^4.0.0 + etcd3: ^1.0.0 + ioredis: ^4.0.0 || ^5.0.0 + jaeger-client: ^3.0.0 + kafka-node: ^5.0.0 + log4js: ^6.0.0 + mqtt: ^4.0.0 + msgpack5: ^5.0.0 || ^6.0.0 + nats: ^1.0.0 || ^2.0.0 + node-nats-streaming: ^0.0.51 || ^0.2.0 || ^0.3.0 + notepack.io: ^2.0.0 || ^3.0.0 + pino: ^6.0.0 || ^7.0.0 || ^8.0.0 + protobufjs: ^6.0.0 || ^7.0.0 + redlock: ^4.0.0 + rhea-promise: ^1.0.0 || ^2.0.0 + thrift: ^0.12.0 || ^0.16.0 + winston: ^3.0.0 + peerDependenciesMeta: + amqplib: + optional: true + avsc: + optional: true + bunyan: + optional: true + cbor-x: + optional: true + dd-trace: + optional: true + debug: + optional: true + etcd3: + optional: true + ioredis: + optional: true + jaeger-client: + optional: true + kafka-node: + optional: true + log4js: + optional: true + mqtt: + optional: true + msgpack5: + optional: true + nats: + optional: true + node-nats-streaming: + optional: true + notepack.io: + optional: true + pino: + optional: true + protobufjs: + optional: true + redlock: + optional: true + rhea-promise: + optional: true + thrift: + optional: true + winston: + optional: true + dependencies: + args: 5.0.3 + eventemitter2: 6.4.7 + fastest-validator: 1.13.0 + glob: 7.2.3 + ioredis: 4.28.5 + ipaddr.js: 2.0.1 + kleur: 4.1.5 + lodash: 4.17.21 + lru-cache: 6.0.0 + nats: 1.4.12 + node-fetch: 2.6.9 + recursive-watch: 1.1.4 + redlock: 4.2.0 + transitivePeerDependencies: + - encoding + patched: true + + /moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + dev: false + + /mongodb-connection-string-url@2.5.3: + resolution: {integrity: sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==} dependencies: - minipass: 3.1.6 - dev: true + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 - /minipass/3.1.6: - resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} - engines: {node: '>=8'} + /mongodb@4.2.1: + resolution: {integrity: sha512-nDC+ulM/Ea3Q2VG5eemuGfB7T4ORwrtKegH2XW9OLlUBgQF6OTNrzFCS1Z3SJGVA+T0Sr1xBYV6DMnp0A7us0g==} + engines: {node: '>=12.9.0'} dependencies: - yallist: 4.0.0 - dev: true + bson: 4.7.0 + denque: 2.1.0 + mongodb-connection-string-url: 2.5.3 + optionalDependencies: + saslprep: 1.0.3 - /minizlib/2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.1.6 - yallist: 4.0.0 - dev: true + /mongoose-findorcreate@3.0.0: + resolution: {integrity: sha512-kQhDe5XDj6tMv8kq1wjK+hITGIGUl60rj8oGLupF9poNsqIDkAJBXudZKcCdSyBZ7p6DLK2+0jSBthrb26tSYQ==} + dev: false - /mississippi/3.0.0: - resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} - engines: {node: '>=4.0.0'} + /mongoose@6.1.1: + resolution: {integrity: sha512-9IODOeFDxW0hzvGmE2Yvy/TaFGLIXQWgE/L1D/x3lKVo8PGyokklgnvX0/Qia7lxiZvxe6+na1aA7v0gT+TN+g==} + engines: {node: '>=12.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 + bson: 4.7.0 + kareem: 2.3.2 + mongodb: 4.2.1 + mpath: 0.8.4 + mquery: 4.0.0 + ms: 2.1.2 + regexp-clone: 1.0.0 + sift: 13.5.2 + sliced: 1.0.1 + transitivePeerDependencies: + - supports-color - /mixin-deep/1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} + /morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - dev: true + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color - /mkdirp/0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.6 + /mpath@0.8.4: + resolution: {integrity: sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==} + engines: {node: '>=4.0.0'} - /mkdirp/1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + /mquery@4.0.0: + resolution: {integrity: sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==} + engines: {node: '>=12.0.0'} + dependencies: + debug: 4.3.4(supports-color@9.2.2) + regexp-clone: 1.0.0 + sliced: 1.0.1 + transitivePeerDependencies: + - supports-color - /modern-normalize/1.1.0: - resolution: {integrity: sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==} - engines: {node: '>=6'} - dev: false + /mri@1.1.4: + resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} + engines: {node: '>=4'} - /moment/2.29.3: - resolution: {integrity: sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==} + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} 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 - - /mrmime/1.0.0: - resolution: {integrity: sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==} + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} - dev: true - /ms/2.0.0: + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - /ms/2.1.1: + /ms@2.1.1: resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - /multicast-dns/7.2.4: - resolution: {integrity: sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==} + /multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true dependencies: - dns-packet: 5.3.1 + dns-packet: 5.4.0 thunky: 1.1.0 + + /multimatch@4.0.0: + resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} + engines: {node: '>=8'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 dev: true - /mute-stream/0.0.7: + /multishift@2.0.1(@remirror/pm@2.0.0)(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2JX3QeJflvDDkxPSLTg94XYJGPR8jWrnu1o7rXP8qRZclzvWuK4iWlRJJ9U027WEkN+ORDt/x9jeaaJFahHfHw==} + peerDependencies: + '@types/react': 18.0.20 + react: ^16.14.0 || ^17 || ^18 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@reach/auto-id': 0.16.0(react-dom@18.2.0)(react@18.2.0) + '@remirror/core-helpers': 2.0.0 + '@remirror/core-types': 2.0.0(@remirror/pm@2.0.0) + '@seznam/compose-react-refs': 1.0.6 + '@types/react': 18.0.20 + a11y-status: 2.0.0 + compute-scroll-into-view: 1.0.20 + react: 18.2.0 + react-use: 17.4.0(react-dom@18.2.0)(react@18.2.0) + tiny-warning: 1.0.3 + w3c-keyname: 2.2.6 + transitivePeerDependencies: + - '@remirror/pm' + - react-dom + dev: false + + /mute-stream@0.0.7: resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} dev: false - /mute-stream/0.0.8: + /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + /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: false - /nan/2.15.0: - resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + /nan@2.16.0: + resolution: {integrity: sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==} requiresBuild: true - dev: true + dev: false optional: true - /nano-time/1.0.0: - resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} + /nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} + peerDependencies: + react: '*' + react-dom: '*' dependencies: - big-integer: 1.6.51 + css-tree: 1.1.3 + csstype: 3.1.1 + fastest-stable-stringify: 2.0.2 + inline-style-prefixer: 6.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rtl-css-js: 1.16.0 + sourcemap-codec: 1.4.8 + stacktrace-js: 2.0.2 + stylis: 4.1.3 dev: false - /nanoclone/0.2.1: + /nanoclone@0.2.1: resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} dev: false - /nanoid/3.3.4: + /nanoevents@5.1.13: + resolution: {integrity: sha512-JFAeG9fp0QZnRoESHjkbVFbZ9BkOXkkagUVwZVo/pkSX+Fq1VKlY+5og/8X9CYc6C7vje/CV+bwJ5M2X0+IY9Q==} + engines: {node: '>=6.0.0'} + dev: false + + /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanomatch/1.2.13: + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} dependencies: @@ -12804,69 +25193,129 @@ packages: - supports-color dev: true - /natural-compare/1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + /native-request@1.1.0: + resolution: {integrity: sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==} + requiresBuild: true + dev: true + optional: true + + /nats@1.4.12: + resolution: {integrity: sha512-Jf4qesEF0Ay0D4AMw3OZnKMRTQm+6oZ5q8/m4gpy5bTmiDiK6wCXbZpzEslmezGpE93LV3RojNEG6dpK/mysLQ==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + nuid: 1.1.6 + ts-nkeys: 1.0.16 + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /needle/2.9.1: - resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /needle@3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} engines: {node: '>= 4.4.x'} hasBin: true requiresBuild: true dependencies: - debug: 3.2.7 - iconv-lite: 0.4.24 + debug: 3.2.7(supports-color@5.5.0) + iconv-lite: 0.6.3 sax: 1.2.4 transitivePeerDependencies: - supports-color - dev: true optional: true - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - dev: true - /neo-async/2.6.2: + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /neo-blessed@0.2.0: + resolution: {integrity: sha512-C2kC4K+G2QnNQFXUIxTQvqmrdSIzGTX1ZRKeDW6ChmvPRw8rTkTEJzbEQHiHy06d36PCl/yMOCjquCRV8SpSQw==} + engines: {node: '>= 8.0.0'} + hasBin: true dev: true - /nested-error-stacks/2.1.1: + /nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} dev: true - /nice-try/1.0.5: + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + dev: true + + /new-github-release-url@2.0.0: + resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + type-fest: 2.19.0 + dev: true + + /next-tick@0.2.2: + resolution: {integrity: sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==} + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /no-case/3.0.4: + /no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + dependencies: + lower-case: 1.1.4 + dev: false + + /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.4.0 + tslib: 2.5.0 + + /nock@13.2.9: + resolution: {integrity: sha512-1+XfJNYF1cjGB+TKMWi29eZ0b82QOvQs2YoLNzbpWGqFMtRQHTa57osqdGj4FrFPgkO4D4AZinzUJR9VvW3QUA==} + engines: {node: '>= 10.13'} + dependencies: + debug: 4.3.4(supports-color@9.2.2) + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + propagate: 2.0.1 + transitivePeerDependencies: + - supports-color dev: true - /node-dir/0.1.17: + /node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} dependencies: minimatch: 3.1.2 dev: true - /node-emoji/1.11.0: + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true + + /node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 dev: false - /node-fetch/1.6.3: + /node-fetch@1.6.3: resolution: {integrity: sha512-BDxbhLHXFFFvilHjh9xihcDyPkXQ+kjblxnl82zAX41xUYSNvuRpFRznmldR9+OKu+p+ULZ7hNoyunlLB5ecUA==} dependencies: encoding: 0.1.13 is-stream: 1.1.0 dev: false - /node-fetch/2.6.7: + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -12876,112 +25325,234 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 + dev: false + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@3.3.0: + resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: true - /node-forge/1.3.1: + /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - dev: true - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-libs-browser/2.2.1: - resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} + /node-localstorage@1.3.1: + resolution: {integrity: sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==} + engines: {node: '>=0.12'} 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.3.2 - querystring-es3: 0.2.1 - readable-stream: 2.3.7 - 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 + write-file-atomic: 1.3.4 + + /node-plop@0.26.3: + resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} + engines: {node: '>=8.9.4'} + dependencies: + '@babel/runtime-corejs3': 7.18.9 + '@types/inquirer': 6.5.0 + change-case: 3.1.0 + del: 5.1.0 + globby: 10.0.1 + handlebars: 4.7.7 + inquirer: 7.3.3 + isbinaryfile: 4.0.10 + lodash.get: 4.4.2 + mkdirp: 0.5.6 + resolve: 1.22.1 + dev: false + + /node-plop@0.31.0: + resolution: {integrity: sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/inquirer': 8.2.3 + change-case: 4.1.2 + del: 6.1.1 + globby: 13.1.3 + handlebars: 4.7.7 + inquirer: 8.2.5 + isbinaryfile: 4.0.10 + lodash.get: 4.4.2 + lower-case: 2.0.2 + mkdirp: 1.0.4 + resolve: 1.22.2 + title-case: 3.0.3 + upper-case: 2.0.2 + dev: false + + /node-releases@2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + + /nodemailer@6.7.8: + resolution: {integrity: sha512-2zaTFGqZixVmTxpJRCFC+Vk5eGRd/fYtvIR+dl5u9QXLTQWGIf48x/JXvo58g9sa0bU6To04XUv554Paykum3g==} + engines: {node: '>=6.0.0'} + dev: false + + /nodemon@2.0.20: + resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.0.7 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.0.7 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 dev: true - /node-releases/2.0.4: - resolution: {integrity: sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==} + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true - /normalize-package-data/2.5.0: + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.0 + resolve: 1.22.2 semver: 5.7.1 validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data/3.0.3: + /normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.9.0 - semver: 7.3.7 + is-core-module: 2.11.0 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true - /normalize-path/2.1.1: + /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: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /normalize-range/0.1.2: + /normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - /normalize-url/3.3.0: + /normalize-url@3.3.0: resolution: {integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==} engines: {node: '>=6'} - dev: false - /normalize-wheel/1.0.1: + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + /normalize-wheel@1.0.1: resolution: {integrity: sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==} dev: false - /now-and-later/2.0.1: + /notepack.io@2.2.0: + resolution: {integrity: sha512-9b5w3t5VSH6ZPosoYnyDONnUTF8o0UkBw7JLA6eBlYJWyGT1Q3vQa8Hmuj1/X6RYvHjjygBDgw6fJhe0JEojfw==} + dev: false + + /notepack.io@3.0.1: + resolution: {integrity: sha512-TKC/8zH5pXIAMVQio2TvVDTtPRX+DJPHDqjRbxogtFiByHyzKmy96RA0JtCQJ+WouyyL4A10xomQzgbUT+1jCg==} + dev: false + + /now-and-later@2.0.1: resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} engines: {node: '>= 0.10'} dependencies: once: 1.4.0 dev: true - /npm-run-path/2.0.2: + /npm-conf@1.1.3: + resolution: {integrity: sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==} + engines: {node: '>=4'} + dependencies: + config-chain: 1.1.13 + pify: 3.0.0 + 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: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 dev: true - /npmlog/5.0.1: + /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: are-we-there-yet: 2.0.0 @@ -12990,31 +25561,50 @@ packages: set-blocking: 2.0.0 dev: true - /nth-check/1.0.2: + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: false + + /nth-check@1.0.2: resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} dependencies: boolbase: 1.0.0 - dev: false - /nth-check/2.0.1: - resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} + /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: + /nuid@1.1.6: + resolution: {integrity: sha512-Eb3CPCupYscP1/S1FQcO5nxtu6l/F3k0MQ69h7f5osnsemVk5pkc8/5AyalVT+NCfra9M71U8POqF6EZa6IHvg==} + engines: {node: '>= 8.16.0'} + + /num2fraction@1.2.2: resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} dev: true - /nwsapi/2.2.0: - resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: false + + /number-precision@1.6.0: + resolution: {integrity: sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==} + dev: false + + /nwsapi@2.2.2: + resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} + dev: true + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-copy/0.1.0: + /object-copy@0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: @@ -13023,125 +25613,216 @@ packages: kind-of: 3.2.2 dev: true - /object-hash/2.2.0: + /object-hash@2.2.0: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} engines: {node: '>= 6'} dev: false - /object-inspect/1.12.0: - resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /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: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - /object-visit/1.0.1: + /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.2: - resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + /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.1.4 + define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries/1.1.5: - resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} + /object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + dev: false + + /object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true - /object.fromentries/2.0.5: - resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} + /object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true - /object.getownpropertydescriptors/2.1.3: - resolution: {integrity: sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==} + /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.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 - /object.hasown/1.1.1: - resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} + /object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true - /object.pick/1.3.0: + /object.map@1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: false + + /object.omit@3.0.0: + resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 1.0.1 + dev: false + + /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.5: - resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} + /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.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 - /objectorarray/1.0.5: + /objectorarray@1.0.5: resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} dev: true - /oblivious-set/1.0.0: - resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + /octokit-auth-probot@1.2.8(@octokit/core@3.6.0): + resolution: {integrity: sha512-t8K0QYoch70jtNrJ04l3JbRQbQb/FRaKbSOtGLFo7B2yxZuH6RrUOkqod33v89ZiQyKgCYxVal2QMI8RxB0E6A==} + peerDependencies: + '@octokit/core': '>=3.2' + dependencies: + '@octokit/auth-app': 4.0.6 + '@octokit/auth-token': 3.0.1 + '@octokit/auth-unauthenticated': 3.0.2 + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + transitivePeerDependencies: + - encoding + dev: false + + /oidc-provider@7.11.5: + resolution: {integrity: sha512-vx7EGT0ErXxPNZFv04JSt3wR7ZrHljNAOk2NIH/DsOkKLB7yOSdp1wgFtQ+0XX+oTg9RjIFuq7T/Disay37ALA==} + engines: {node: ^12.19.0 || ^14.15.0 || ^16.13.0} + dependencies: + '@koa/cors': 3.4.1 + cacheable-lookup: 6.1.0 + debug: 4.3.4(supports-color@9.2.2) + ejs: 3.1.8 + got: 11.8.3 + jose: 4.9.0 + jsesc: 3.0.2 + koa: 2.13.4 + koa-compose: 4.1.0 + nanoid: 3.3.4 + object-hash: 2.2.0 + oidc-token-hash: 5.0.1 + paseto: 2.1.3 + quick-lru: 5.1.1 + raw-body: 2.5.1 + optionalDependencies: + paseto3: /paseto@3.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /oidc-token-hash@5.0.1: + resolution: {integrity: sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==} + engines: {node: ^10.13.0 || >=12.0.0} dev: false - /obuf/1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 - /on-finished/2.4.1: + /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: + /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: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - /onetime/2.0.1: + /onetime@2.0.1: resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} engines: {node: '>=4'} dependencies: mimic-fn: 1.2.0 - dev: false - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - /open/7.4.2: + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} dependencies: @@ -13149,7 +25830,7 @@ packages: is-wsl: 2.2.0 dev: true - /open/8.4.0: + /open@8.4.0: resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} engines: {node: '>=12'} dependencies: @@ -13158,12 +25839,29 @@ packages: is-wsl: 2.2.0 dev: true - /opencollective-postinstall/2.0.3: + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + /openapi-types@12.1.0: + resolution: {integrity: sha512-XpeCy01X6L5EpP+6Hc3jWN7rMZJ+/k1lwki/kTmWzbVhdPie3jd5O2ZtedEx8Yp58icJ0osVldLMrTB/zslQXA==} + + /openapi3-ts@4.3.1: + resolution: {integrity: sha512-ha/kTOLhMQL7MvS9Abu/cpCXx5qwHQ++88YkUzn1CGfmM8JvCOG/4ZE6tRsexgXRFaoJrcwLyf81H2Y/CXALtA==} + dependencies: + yaml: 2.4.1 + dev: false + + /opencollective-postinstall@2.0.3: resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} hasBin: true dev: false - /opencollective/1.0.3: + /opencollective@1.0.3: resolution: {integrity: sha512-YBRI0Qa8+Ui0/STV1qYuPrJm889PT3oCPHMVoL+8Y3nwCffj7PSrB2NlGgrhgBKDujxTjxknHWJ/FiqOsYcIDw==} hasBin: true dependencies: @@ -13175,12 +25873,20 @@ packages: opn: 4.0.2 dev: false - /opener/1.5.2: + /opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true - dev: true - /opn/4.0.2: + /openid-client@5.3.2: + resolution: {integrity: sha512-nXXt+cna0XHOw+WqjMZOmuXw/YZEMwfWD2lD7tCsFtsBjMQGVXA+NZABA3upYBET1suhIsmfd7GnxG4jCAnvYQ==} + dependencies: + jose: 4.11.2 + lru-cache: 6.0.0 + object-hash: 2.2.0 + oidc-token-hash: 5.0.1 + dev: false + + /opn@4.0.2: resolution: {integrity: sha512-iPBWbPP4OEOzR1xfhpGLDh+ypKBOygunZhM9jBtA7FS5sKjEiMZw0EFb82hnDOmTZX90ZWLoZKUza4cVt8MexA==} engines: {node: '>=0.10.0'} dependencies: @@ -13188,7 +25894,7 @@ packages: pinkie-promise: 2.0.1 dev: false - /optionator/0.8.3: + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -13200,7 +25906,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -13210,191 +25916,283 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.3 - dev: true - /ora/5.4.1: + /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} dependencies: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.6.1 + cli-spinners: 2.7.0 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: false - /ordered-read-streams/1.0.1: + /ora@6.1.2: + resolution: {integrity: sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + chalk: 5.1.2 + cli-cursor: 4.0.0 + cli-spinners: 2.7.0 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + strip-ansi: 7.0.1 + wcwidth: 1.0.1 + + /ordered-read-streams@1.0.1: resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 dev: true - /os-browserify/0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - dev: true + /orderedmap@2.0.0: + resolution: {integrity: sha512-buf4PoAMlh45b8a8gsGy/X6w279TSqkyAS0C0wdTSJwFSU+ljQFJON5I8NfjLHoCXwpSROIo2wr0g33T+kQshQ==} + dev: false - /os-tmpdir/1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} - dev: false + requiresBuild: true + dev: true + optional: true - /overlayscrollbars/1.13.1: - resolution: {integrity: sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==} + /os-name@5.0.1: + resolution: {integrity: sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + macos-release: 3.1.0 + windows-release: 5.1.0 dev: true - /p-all/2.1.0: + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + /p-all@2.1.0: resolution: {integrity: sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==} engines: {node: '>=6'} dependencies: p-map: 2.1.0 + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + /p-event@2.3.1: + resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} + engines: {node: '>=6'} + dependencies: + p-timeout: 2.0.1 dev: true - /p-event/4.2.0: + /p-event@4.2.0: resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} engines: {node: '>=8'} dependencies: p-timeout: 3.2.0 dev: true - /p-filter/2.1.0: + /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} dependencies: p-map: 2.1.0 dev: true - /p-finally/1.0.0: + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} - /p-limit/2.3.0: + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 - dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 dev: true - /p-locate/3.0.0: + /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: + /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-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - dev: true - /p-map/2.1.0: + /p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} - dev: true - /p-map/3.0.0: + /p-map@3.0.0: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} dependencies: aggregate-error: 3.1.0 - dev: true - /p-map/4.0.0: + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 - dev: true - /p-min-delay/4.0.1: - resolution: {integrity: sha512-Tgkn+fy2VYNWw9bLy4BwiF+1ZMIgTDBIpaIChi1HC3N4nwRpandJnG1jAEXiYCcrTZKYQJdBWzLJauAeYDXsBg==} + /p-min-delay@4.0.2: + resolution: {integrity: sha512-7hJcTq/MGF5pNHbQ2akrpPy1N43YYlB4RPECDSbPRn4xP/dsgP0I6ls7NvSUQ5k88o+CyATMOrQiZ/PK4aQR9w==} engines: {node: '>=12'} dependencies: yoctodelay: 1.2.0 dev: false - /p-queue/6.6.2: + /p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 + + /p-reduce@2.1.0: + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} dev: false - /p-retry/4.6.2: + /p-retry@4.6.2: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} dependencies: '@types/retry': 0.12.0 retry: 0.13.1 + + /p-series@2.1.0: + resolution: {integrity: sha512-vEAnkG1ikRT1kPBrKwpj7AFYQkd1hjt/oHeppxtpoPxy5gEt+OWiHZJN3tMqvFa+UJfVwO3lwHoMUpMYBLKnaQ==} + engines: {node: '>=8'} + dependencies: + '@sindresorhus/is': 0.15.0 + p-reduce: 2.1.0 + dev: false + + /p-timeout@2.0.1: + resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==} + engines: {node: '>=4'} + dependencies: + p-finally: 1.0.0 dev: true - /p-timeout/3.2.0: + /p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} dependencies: p-finally: 1.0.0 - /p-try/2.2.0: + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + + /pac-proxy-agent@5.0.0: + resolution: {integrity: sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==} + engines: {node: '>= 8'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@9.2.2) + get-uri: 3.0.2 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + pac-resolver: 5.0.1 + raw-body: 2.5.2 + socks-proxy-agent: 5.0.1 + transitivePeerDependencies: + - supports-color dev: true - /pako/1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + /pac-resolver@5.0.1: + resolution: {integrity: sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==} + engines: {node: '>= 8'} + dependencies: + degenerator: 3.0.2 + ip: 1.1.8 + netmask: 2.0.2 dev: true - /parallel-transform/1.2.0: - resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + /package-json@6.5.0: + resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} + engines: {node: '>=8'} dependencies: - cyclist: 1.0.1 - inherits: 2.0.4 - readable-stream: 2.3.7 + got: 11.8.3 + registry-auth-token: 4.2.2 + registry-url: 5.1.0 + semver: 6.3.0 + + /package-json@8.1.0: + resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} + engines: {node: '>=14.16'} + dependencies: + got: 11.8.3 + registry-auth-token: 5.0.1 + registry-url: 6.0.1 + semver: 7.5.4 dev: true - /param-case/3.0.4: + /param-case@2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + dependencies: + no-case: 2.3.2 + dev: false + + /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.4.0 - dev: true + tslib: 2.5.0 - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 - /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 + /parenthesis@3.1.8: + resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} + dev: false - /parse-entities/2.0.0: + /parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} dependencies: character-entities: 1.2.4 @@ -13404,327 +26202,752 @@ packages: is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - /parse-json/4.0.0: + /parse-exponential@1.0.1: + resolution: {integrity: sha512-QUa7PaOc7O6ei3hb0NmADJGrDYLbPBdcSKFUBGfwlMdHsrg8LOsliPEkpP0qHSKQOyzyyxCB00fxJKcP75Gl7w==} + engines: {node: '>=0.10.0'} + dev: false + + /parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + dev: false + + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + error-ex: 1.3.2 + dev: true + optional: 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: false - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.18.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-node-version/1.0.1: + /parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + dev: false + + /parse-node-version@1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} + + /parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + dev: false + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: false + + /parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + dependencies: + protocols: 2.0.1 dev: true - /parse5/6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + /parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + dependencies: + parse-path: 7.0.0 dev: true - /parseqs/0.0.6: - resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 dev: false - /parseuri/0.0.6: - resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.4.0 dev: false - /parseurl/1.3.3: + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - dev: true - /pascal-case/3.1.2: + /pascal-case@2.0.1: + resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + dependencies: + camel-case: 3.0.0 + upper-case-first: 1.1.2 + dev: false + + /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.4.0 - dev: true + tslib: 2.5.0 - /pascalcase/0.1.1: + /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 + /paseto@2.1.3: + resolution: {integrity: sha512-BNkbvr0ZFDbh3oV13QzT5jXIu8xpFc9r0o5mvWBhDU1GBkVt1IzHK1N6dcYmN7XImrUmPQ0HCUXmoe2WPo8xsg==} + engines: {node: ^12.19.0 || >=14.15.0} + dev: false + + /paseto@3.1.0: + resolution: {integrity: sha512-oVSKoCH89M0WU3I+13NoCP9wGRel0BlQumwxsDZPk1yJtqS76PWKRM7vM9D4bz4PcScT0aIiAipC7lW6hSgkBQ==} + engines: {node: '>=16.0.0'} + requiresBuild: true + dev: false + optional: true + + /patch-console@1.0.0: + resolution: {integrity: sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==} + engines: {node: '>=10'} + dev: false - /path-dirname/1.0.2: + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: false + + /path-case@2.1.1: + resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + dependencies: + no-case: 2.3.2 + dev: false + + /path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.5.0 + dev: false + + /path-dirname@1.0.2: resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} dev: true - /path-exists/3.0.0: + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + pinkie-promise: 2.0.1 + dev: true + optional: true + + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - /path-key/2.0.1: + /path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + dev: false + + /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-to-regexp/0.1.7: + /path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + dev: false + + /path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: 0.1.2 + dev: false + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.0 + minipass: 7.0.2 + dev: false + + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true - /path-to-regexp/1.8.0: + /path-to-regexp@1.8.0: resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} dependencies: isarray: 0.0.1 dev: false - /path-type/3.0.0: + /path-to-regexp@2.2.1: + resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + graceful-fs: 4.2.10 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + optional: true + + /path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} dependencies: pify: 3.0.0 dev: true - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /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 + /peek-readable@4.1.0: + resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} + engines: {node: '>=8'} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true - /picocolors/0.2.1: + /picocolors@0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pify/3.0.0: + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pidusage@3.0.2: + resolution: {integrity: sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==} + engines: {node: '>=10'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} dev: true - /pify/4.0.1: + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - dev: true - /pinkie-promise/2.0.1: + /pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 - dev: false - /pinkie/2.0.4: + /pinkie@2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} + + /pino-http@5.8.0: + resolution: {integrity: sha512-YwXiyRb9y0WCD1P9PcxuJuh3Dc5qmXde/paJE86UGYRdiFOi828hR9iUGmk5gaw6NBT9gLtKANOHFimvh19U5w==} + dependencies: + fast-url-parser: 1.1.3 + pino: 6.14.0 + pino-std-serializers: 4.0.0 + dev: false + + /pino-pretty@6.0.0: + resolution: {integrity: sha512-jyeR2fXXWc68st1DTTM5NhkHlx8p+1fKZMfm84Jwq+jSw08IwAjNaZBZR6ts69hhPOfOjg/NiE1HYW7vBRPL3A==} + hasBin: true + dependencies: + '@hapi/bourne': 2.1.0 + args: 5.0.3 + colorette: 1.4.0 + dateformat: 4.6.3 + fast-safe-stringify: 2.1.1 + jmespath: 0.15.0 + joycon: 3.1.1 + pump: 3.0.0 + readable-stream: 3.6.1 + rfdc: 1.3.0 + split2: 3.2.2 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@3.2.0: + resolution: {integrity: sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==} dev: false - /pirates/4.0.5: + /pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + dev: false + + /pino@6.14.0: + resolution: {integrity: sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==} + hasBin: true + dependencies: + fast-redact: 3.1.2 + fast-safe-stringify: 2.1.1 + flatstr: 1.0.12 + pino-std-serializers: 3.2.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + sonic-boom: 1.4.1 + dev: false + + /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} - dev: true - /pkg-dir/3.0.0: + /pkg-conf@3.1.0: + resolution: {integrity: sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + load-json-file: 5.3.0 + dev: false + + /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: + /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 - /pkg-dir/5.0.0: + /pkg-dir@5.0.0: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} dependencies: find-up: 5.0.0 dev: true - /please-upgrade-node/3.2.0: - resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + /pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + dependencies: + find-up: 3.0.0 + dev: false + + /plop@3.1.1: + resolution: {integrity: sha512-NuctKmuNUACXBQn25bBr5oj/75nHxdKGwjA/+b7cVoj1sp+gTVqcc8eAr4QcNJgMPsZWRJBN2kMkgmsqbqV9gg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true dependencies: - semver-compare: 1.0.0 - dev: true + '@types/liftoff': 4.0.0 + chalk: 5.1.2 + interpret: 2.2.0 + liftoff: 4.0.0 + minimist: 1.2.6 + node-plop: 0.31.0 + ora: 6.1.2 + v8flags: 4.0.0 + dev: false - /pnp-webpack-plugin/1.6.4_typescript@4.6.4: + /pnp-webpack-plugin@1.6.4(typescript@4.9.4): resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.2.0_typescript@4.6.4 + ts-pnp: 1.2.0(typescript@4.9.4) transitivePeerDependencies: - typescript dev: true - /polished/4.2.2: + /polished@4.2.2: resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 dev: true - /posix-character-classes/0.1.1: + /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: + /postcss-calc@7.0.5: resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} dependencies: postcss: 7.0.39 - postcss-selector-parser: 6.0.10 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + + /postcss-calc@8.2.4(postcss@8.4.21): + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: false - /postcss-colormin/4.0.3: + /postcss-calc@8.2.4(postcss@8.4.27): + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + + /postcss-colormin@4.0.3: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.20.3 + browserslist: 4.21.5 color: 3.2.1 has: 1.0.3 postcss: 7.0.39 postcss-value-parser: 3.3.1 + + /postcss-colormin@5.3.1(postcss@8.4.21): + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-convert-values/4.0.1: + /postcss-colormin@5.3.1(postcss@8.4.27): + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /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 + + /postcss-convert-values@5.1.3(postcss@8.4.21): + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-discard-comments/4.0.2: + /postcss-convert-values@5.1.3(postcss@8.4.27): + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-discard-comments@4.0.2: resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} engines: {node: '>=6.9.0'} dependencies: postcss: 7.0.39 + + /postcss-discard-comments@5.1.2(postcss@8.4.21): + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 dev: false - /postcss-discard-duplicates/4.0.2: + /postcss-discard-comments@5.1.2(postcss@8.4.27): + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-discard-duplicates@4.0.2: resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} engines: {node: '>=6.9.0'} dependencies: postcss: 7.0.39 + + /postcss-discard-duplicates@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 dev: false - /postcss-discard-empty/4.0.1: + /postcss-discard-duplicates@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-discard-empty@4.0.1: resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} engines: {node: '>=6.9.0'} dependencies: postcss: 7.0.39 + + /postcss-discard-empty@5.1.1(postcss@8.4.21): + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 dev: false - /postcss-discard-overridden/4.0.1: + /postcss-discard-empty@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-discard-overridden@4.0.1: resolution: {integrity: sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==} engines: {node: '>=6.9.0'} dependencies: postcss: 7.0.39 + + /postcss-discard-overridden@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: false + + /postcss-discard-overridden@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-discard-unused@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 dev: false - /postcss-flexbugs-fixes/4.2.1: + /postcss-flexbugs-fixes@4.2.1: resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} dependencies: postcss: 7.0.39 dev: true - /postcss-js/3.0.3: + /postcss-import@15.1.0(postcss@8.4.27): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.2 + dev: false + + /postcss-js@3.0.3: resolution: {integrity: sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==} engines: {node: '>=10.0'} dependencies: camelcase-css: 2.0.1 - postcss: 8.4.13 + postcss: 8.4.27 + dev: false + + /postcss-js@4.0.1(postcss@8.4.27): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.27 dev: false - /postcss-load-config/3.1.4_4jqnslpwnj4ifyjfqbkuebd4fy: + /postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.9.1): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: postcss: '>=8.0.9' - ts-node: '>=9.0.0' + ts-node: 10.9.1 peerDependenciesMeta: postcss: optional: true ts-node: optional: true dependencies: - lilconfig: 2.0.5 - postcss: 8.4.13 - ts-node: 10.7.0_ixcth6kbstn6no7hiktnzckliq + lilconfig: 2.1.0 + postcss: 8.4.21 + ts-node: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) yaml: 1.10.2 dev: false - /postcss-loader/4.3.0_gzaxsinx64nntyd3vmdqwl7coe: + /postcss-load-config@4.0.1(postcss@8.4.27)(ts-node@10.9.1): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: 10.9.1 + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.27 + ts-node: 10.9.1(@types/node@18.11.9)(typescript@4.9.4) + yaml: 2.4.1 + dev: false + + /postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.75.0): resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} engines: {node: '>= 10.13.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: - cosmiconfig: 7.0.1 - klona: 2.0.5 - loader-utils: 2.0.2 + cosmiconfig: 7.1.0 + klona: 2.0.6 + loader-utils: 2.0.4 postcss: 7.0.39 schema-utils: 3.1.1 - semver: 7.3.7 - webpack: 4.46.0 + semver: 7.5.4 + webpack: 5.75.0(esbuild@0.15.18) dev: true - /postcss-loader/6.2.1_antlv5ffwu5b3l6qf5ix53g2p4: + /postcss-loader@6.2.1(postcss@8.4.21)(webpack@5.75.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 + webpack: 5.75.0 dependencies: - cosmiconfig: 7.0.1 - klona: 2.0.5 - postcss: 8.4.13 - semver: 7.3.7 - webpack: 5.73.0_webpack-cli@4.9.2 + cosmiconfig: 7.1.0 + klona: 2.0.6 + postcss: 8.4.21 + semver: 7.5.4 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) dev: true - /postcss-merge-longhand/4.0.11: + /postcss-loader@7.0.2(postcss@8.4.21)(webpack@5.75.0): + resolution: {integrity: sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: 5.75.0 + dependencies: + cosmiconfig: 7.1.0 + klona: 2.0.6 + postcss: 8.4.21 + semver: 7.5.4 + webpack: 5.75.0(esbuild@0.15.18) + dev: false + + /postcss-merge-idents@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-merge-longhand@4.0.11: resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} engines: {node: '>=6.9.0'} dependencies: @@ -13732,29 +26955,91 @@ packages: postcss: 7.0.39 postcss-value-parser: 3.3.1 stylehacks: 4.0.3 + + /postcss-merge-longhand@5.1.7(postcss@8.4.21): + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.4.21) dev: false - /postcss-merge-rules/4.0.3: + /postcss-merge-longhand@5.1.7(postcss@8.4.27): + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.4.27) + + /postcss-merge-rules@4.0.3: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.20.3 + 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 + + /postcss-merge-rules@5.1.4(postcss@8.4.21): + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: false - /postcss-minify-font-values/4.0.2: + /postcss-merge-rules@5.1.4(postcss@8.4.27): + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 + + /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 + + /postcss-minify-font-values@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-minify-gradients/4.0.2: + /postcss-minify-font-values@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-minify-gradients@4.0.2: resolution: {integrity: sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==} engines: {node: '>=6.9.0'} dependencies: @@ -13762,21 +27047,65 @@ packages: is-color-stop: 1.1.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 + + /postcss-minify-gradients@5.1.1(postcss@8.4.21): + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-minify-params/4.0.2: + /postcss-minify-gradients@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /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.20.3 + 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 + + /postcss-minify-params@5.1.4(postcss@8.4.21): + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-minify-selectors/4.0.2: + /postcss-minify-params@5.1.4(postcss@8.4.27): + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + cssnano-utils: 3.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-minify-selectors@4.0.2: resolution: {integrity: sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==} engines: {node: '>=6.9.0'} dependencies: @@ -13784,104 +27113,207 @@ packages: has: 1.0.3 postcss: 7.0.39 postcss-selector-parser: 3.1.2 + + /postcss-minify-selectors@5.2.1(postcss@8.4.21): + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: false - /postcss-modules-extract-imports/2.0.0: + /postcss-minify-selectors@5.2.1(postcss@8.4.27): + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 + + /postcss-modules-extract-imports@2.0.0: resolution: {integrity: sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==} engines: {node: '>= 6'} dependencies: postcss: 7.0.39 dev: true - /postcss-modules-extract-imports/3.0.0_postcss@8.4.13: + /postcss-modules-extract-imports@3.0.0(postcss@8.4.21): + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + + /postcss-modules-extract-imports@3.0.0(postcss@8.4.27): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.13 + postcss: 8.4.27 + dev: false - /postcss-modules-local-by-default/3.0.3: + /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.10 + postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-local-by-default/4.0.0_postcss@8.4.13: + /postcss-modules-local-by-default@4.0.0(postcss@8.4.21): + resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + + /postcss-modules-local-by-default@4.0.0(postcss@8.4.27): resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.13 - postcss: 8.4.13 - postcss-selector-parser: 6.0.10 + icss-utils: 5.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 + dev: false - /postcss-modules-scope/2.2.0: + /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.10 + postcss-selector-parser: 6.0.11 dev: true - /postcss-modules-scope/3.0.0_postcss@8.4.13: + /postcss-modules-scope@3.0.0(postcss@8.4.21): + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + + /postcss-modules-scope@3.0.0(postcss@8.4.27): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.13 - postcss-selector-parser: 6.0.10 + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 + dev: false - /postcss-modules-values/3.0.0: + /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-modules-values/4.0.0_postcss@8.4.13: + /postcss-modules-values@4.0.0(postcss@8.4.21): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.13 - postcss: 8.4.13 + icss-utils: 5.1.0(postcss@8.4.21) + postcss: 8.4.21 - /postcss-nested/5.0.6_postcss@8.4.13: + /postcss-modules-values@4.0.0(postcss@8.4.27): + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.27) + postcss: 8.4.27 + dev: false + + /postcss-nested@5.0.6(postcss@8.4.21): resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.13 - postcss-selector-parser: 6.0.10 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: false + + /postcss-nested@6.0.1(postcss@8.4.27): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 dev: false - /postcss-normalize-charset/4.0.1: + /postcss-normalize-charset@4.0.1: resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} engines: {node: '>=6.9.0'} dependencies: postcss: 7.0.39 + + /postcss-normalize-charset@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 dev: false - /postcss-normalize-display-values/4.0.2: + /postcss-normalize-charset@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /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 + + /postcss-normalize-display-values@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-positions/4.0.2: + /postcss-normalize-display-values@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-positions@4.0.2: resolution: {integrity: sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==} engines: {node: '>=6.9.0'} dependencies: @@ -13889,9 +27321,27 @@ packages: has: 1.0.3 postcss: 7.0.39 postcss-value-parser: 3.3.1 + + /postcss-normalize-positions@5.1.1(postcss@8.4.21): + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-repeat-style/4.0.2: + /postcss-normalize-positions@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-repeat-style@4.0.2: resolution: {integrity: sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==} engines: {node: '>=6.9.0'} dependencies: @@ -13899,36 +27349,110 @@ packages: cssnano-util-get-match: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 + + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.21): + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-string/4.0.2: + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /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 + + /postcss-normalize-string@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-timing-functions/4.0.2: + /postcss-normalize-string@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /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 + + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-unicode/4.0.1: + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-unicode@4.0.1: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.20.3 + browserslist: 4.21.5 postcss: 7.0.39 postcss-value-parser: 3.3.1 + + /postcss-normalize-unicode@5.1.1(postcss@8.4.21): + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-url/4.0.1: + /postcss-normalize-unicode@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-url@4.0.1: resolution: {integrity: sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==} engines: {node: '>=6.9.0'} dependencies: @@ -13936,36 +27460,124 @@ packages: normalize-url: 3.3.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 + + /postcss-normalize-url@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-whitespace/4.0.2: + /postcss-normalize-url@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /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 + + /postcss-normalize-whitespace@5.1.1(postcss@8.4.21): + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-ordered-values/4.1.2: + /postcss-normalize-whitespace@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /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 + cssnano-util-get-arguments: 4.0.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 + + /postcss-ordered-values@5.1.3(postcss@8.4.21): + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-ordered-values@5.1.3(postcss@8.4.27): + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.27) + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-reduce-idents@5.2.0(postcss@8.4.27): + resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 dev: false - /postcss-reduce-initial/4.0.3: + /postcss-reduce-initial@4.0.3: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.20.3 + browserslist: 4.21.5 caniuse-api: 3.0.0 has: 1.0.3 postcss: 7.0.39 + + /postcss-reduce-initial@5.1.2(postcss@8.4.21): + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + postcss: 8.4.21 dev: false - /postcss-reduce-transforms/4.0.2: + /postcss-reduce-initial@5.1.2(postcss@8.4.27): + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + postcss: 8.4.27 + + /postcss-reduce-transforms@4.0.2: resolution: {integrity: sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==} engines: {node: '>=6.9.0'} dependencies: @@ -13973,113 +27585,222 @@ packages: has: 1.0.3 postcss: 7.0.39 postcss-value-parser: 3.3.1 + + /postcss-reduce-transforms@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 dev: false - /postcss-selector-parser/3.1.2: + /postcss-reduce-transforms@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /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: false - /postcss-selector-parser/6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + /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 - /postcss-svgo/4.0.3: + /postcss-sort-media-queries@4.3.0(postcss@8.4.27): + resolution: {integrity: sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.4.16 + dependencies: + postcss: 8.4.27 + sort-css-media-queries: 2.1.0 + dev: false + + /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 + + /postcss-svgo@5.1.0(postcss@8.4.21): + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 dev: false - /postcss-unique-selectors/4.0.1: + /postcss-svgo@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + + /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 + + /postcss-unique-selectors@5.1.1(postcss@8.4.21): + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: false - /postcss-value-parser/3.3.1: + /postcss-unique-selectors@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 + + /postcss-value-parser@3.3.1: resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} - dev: false - /postcss-value-parser/4.2.0: + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss/7.0.39: + /postcss-zindex@5.1.0(postcss@8.4.27): + resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + dev: false + + /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 - /postcss/8.4.13: - resolution: {integrity: sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==} + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 - /prelude-ls/1.1.2: + /postcss@8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /posthog-js@1.35.0: + resolution: {integrity: sha512-eRAT+IH0t6M/LH3OygD3mobbr90620O7c0zrxJKKx6REvyzxYMSxjehwPEjFqBess2HJOLWLWSHq146h3EZeOw==} + dependencies: + '@sentry/types': 7.20.0 + fflate: 0.4.8 + rrweb-snapshot: 1.1.14 + dev: false + + /precision@1.0.1: + resolution: {integrity: sha512-cBMxnM2nzEF1xx75NhhOaKjsDNt92WUZv17t/p3wrvCfA+2RL0twbgfvXvgDbxxsfUUb5C5he5tla8Xa2ny1Ew==} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.0.2 + parse-exponential: 1.0.1 + dev: false + + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - dev: true - /prettier-linter-helpers/1.0.0: + /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.0: + /prettier@2.3.0: resolution: {integrity: sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /prettier/2.6.2: - resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} + /prettier@2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-bytes/5.6.0: + /prettier@2.8.4: + resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} + engines: {node: '>=10.13.0'} + hasBin: true + + /pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} - dev: true - /pretty-error/2.1.2: + /pretty-error@2.1.2: resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} dependencies: lodash: 4.17.21 renderkid: 2.0.7 dev: true - /pretty-error/4.0.0: + /pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: lodash: 4.17.21 renderkid: 3.0.0 + + /pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 dev: true - /pretty-format/27.5.1: + /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -14088,40 +27809,125 @@ packages: react-is: 17.0.2 dev: true - /pretty-hrtime/1.0.3: + /pretty-format@29.4.3: + resolution: {integrity: sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-format@29.5.0: + resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-hrtime@1.0.3: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} - /pretty-time/1.1.0: + /pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + dependencies: + parse-ms: 2.1.0 + dev: false + + /pretty-time@1.1.0: resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} engines: {node: '>=4'} - dev: true - /prismjs/1.27.0: + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + dev: false + + /prism-react-renderer@1.3.5(react@17.0.2): + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + peerDependencies: + react: '>=0.14.9' + dependencies: + react: 17.0.2 + dev: false + + /prismjs@1.27.0: resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} engines: {node: '>=6'} - dev: true + dev: false - /prismjs/1.28.0: - resolution: {integrity: sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==} + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} - dev: true + dev: false + + /probot-metadata@2.1.0(probot@12.3.0): + resolution: {integrity: sha512-0e8+fZ5tE2EbsSgN1zGHfjFNs17DEbG5b0zYq2HlEL6u+8JJRZraUMtwsi0QdtB2eMrenYfEy76aBfnfzFcrRw==} + peerDependencies: + probot: '>=10' + dependencies: + probot: 12.3.0 + dev: false + + /probot@12.3.0: + resolution: {integrity: sha512-I7qpD6myIt5eEqAOv14mrbdh4HdLG1MQgCHGQJpIj6rdDeQaacQDL2THlMSqIU2VBcdIRpLqNv7D0z2NG0la3w==} + engines: {node: '>=10.21'} + hasBin: true + dependencies: + '@octokit/core': 3.6.0 + '@octokit/plugin-enterprise-compatibility': 1.3.0 + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + '@octokit/plugin-retry': 3.0.9 + '@octokit/plugin-throttling': 3.7.0(@octokit/core@3.6.0) + '@octokit/types': 8.0.0 + '@octokit/webhooks': 9.26.0 + '@probot/get-private-key': 1.1.1 + '@probot/octokit-plugin-config': 1.1.6(@octokit/core@3.6.0) + '@probot/pino': 2.3.5 + '@types/express': 4.17.17 + '@types/ioredis': 4.28.10 + '@types/pino': 6.3.12 + '@types/pino-http': 5.8.1 + commander: 6.2.1 + deepmerge: 4.2.2 + deprecation: 2.3.1 + dotenv: 8.6.0 + eventsource: 2.0.2 + express: 4.18.2 + express-handlebars: 6.0.6 + ioredis: 4.28.5 + js-yaml: 3.14.1 + lru-cache: 6.0.0 + octokit-auth-probot: 1.2.8(@octokit/core@3.6.0) + pino: 6.14.0 + pino-http: 5.8.0 + pkg-conf: 3.1.0 + resolve: 1.22.1 + semver: 7.5.4 + update-dotenv: 1.1.1(dotenv@8.6.0) + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - /process/0.11.10: + /process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + dev: false + + /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: + /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: bluebird: '*' @@ -14130,112 +27936,325 @@ packages: optional: true dev: true - /promise-inflight/1.0.1_bluebird@3.7.2: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} dependencies: - bluebird: 3.7.2 - dev: true + err-code: 2.0.3 + retry: 0.12.0 + dev: false - /promise.allsettled/1.0.5: + /promise.allsettled@1.0.5: resolution: {integrity: sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==} engines: {node: '>= 0.4'} dependencies: array.prototype.map: 1.0.4 call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 - get-intrinsic: 1.1.1 + define-properties: 1.2.0 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 iterate-value: 1.0.2 dev: true - /promise.prototype.finally/3.1.3: + /promise.allsettled@1.0.6: + resolution: {integrity: sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==} + engines: {node: '>= 0.4'} + dependencies: + array.prototype.map: 1.0.5 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 + iterate-value: 1.0.2 + dev: true + + /promise.prototype.finally@3.1.3: resolution: {integrity: sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true - /prompts/2.4.2: + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: false + + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: true - - /prop-types/15.8.0: - resolution: {integrity: sha512-fDGekdaHh65eI3lMi5OnErU6a8Ighg2KjcjQxO7m8VHyWjcPyj5kiOgV1LQDOOOgVy3+5FgjXvdSSX7B8/5/4g==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - /prop-types/15.8.1: + /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + + /propagate@2.0.1: + resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} + engines: {node: '>= 8'} dev: true - /property-expr/2.0.4: - resolution: {integrity: sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==} + /property-expr@2.0.5: + resolution: {integrity: sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==} dev: false - /property-information/5.6.0: + /property-information@5.6.0: resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} dependencies: xtend: 4.0.2 - /proxy-addr/2.0.7: + /property-information@6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + dev: false + + /prosemirror-collab@1.3.0: + resolution: {integrity: sha512-+S/IJ69G2cUu2IM5b3PBekuxs94HO1CxJIWOFrLQXUaUDKL/JfBx+QcH31ldBlBXyDEUl+k3Vltfi1E1MKp2mA==} + dependencies: + prosemirror-state: 1.4.1 + dev: false + + /prosemirror-commands@1.3.1: + resolution: {integrity: sha512-XTporPgoECkOQACVw0JTe3RZGi+fls3/byqt+tXwGTkD7qLuB4KdVrJamDMJf4kfKga3uB8hZ+kUUyZ5oWpnfg==} + dependencies: + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-transform: 1.7.0 + dev: false + + /prosemirror-dropcursor@1.6.0: + resolution: {integrity: sha512-2vj5tYDXADpd6Acg5iuZV2/3dEBy9s3tRUju6lQPOlKYSvJd7Tsz9c4uLS+L9ZCJndyW0EBrT+PadarHa1G30Q==} + dependencies: + prosemirror-state: 1.4.1 + prosemirror-transform: 1.7.0 + prosemirror-view: 1.28.2 + dev: false + + /prosemirror-gapcursor@1.3.1: + resolution: {integrity: sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==} + dependencies: + prosemirror-keymap: 1.2.0 + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-view: 1.28.2 + dev: false + + /prosemirror-history@1.3.0: + resolution: {integrity: sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==} + dependencies: + prosemirror-state: 1.4.1 + prosemirror-transform: 1.7.0 + rope-sequence: 1.3.3 + dev: false + + /prosemirror-inputrules@1.2.0: + resolution: {integrity: sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==} + dependencies: + prosemirror-state: 1.4.1 + prosemirror-transform: 1.7.0 + dev: false + + /prosemirror-keymap@1.2.0: + resolution: {integrity: sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==} + dependencies: + prosemirror-state: 1.4.1 + w3c-keyname: 2.2.6 + dev: false + + /prosemirror-model@1.18.1: + resolution: {integrity: sha512-IxSVBKAEMjD7s3n8cgtwMlxAXZrC7Mlag7zYsAKDndAqnDScvSmp/UdnRTV/B33lTCVU3CCm7dyAn/rVVD0mcw==} + dependencies: + orderedmap: 2.0.0 + dev: false + + /prosemirror-paste-rules@2.0.0(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2): + resolution: {integrity: sha512-7E/iG5RAThxMks9up+YqsIL+ATH1EZqb7Dnwq2dQz+EpNJciBaYKpHZQ2nTgi2gdhtJ4a1ru1lFZ6geQvm5xBA==} + peerDependencies: + prosemirror-model: ^1 + prosemirror-state: ^1 + prosemirror-view: ^1 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core-constants': 2.0.0 + '@remirror/core-helpers': 2.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-view: 1.28.2 + dev: false + + /prosemirror-resizable-view@2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9): + resolution: {integrity: sha512-HDe0RTIY4XQjkDyNVdBM9ctwexQ08Fj7la0+bUnEnleTS90wEOnG6xheQx6NIB3zzqXjswPesn1d/0Ilp9v4zg==} + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core-helpers': 2.0.0 + '@remirror/core-utils': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + prosemirror-model: 1.18.1 + prosemirror-view: 1.28.2 + transitivePeerDependencies: + - '@remirror/pm' + - '@types/node' + - jsdom + dev: false + + /prosemirror-schema-list@1.2.2: + resolution: {integrity: sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==} + dependencies: + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-transform: 1.7.0 + dev: false + + /prosemirror-state@1.4.1: + resolution: {integrity: sha512-U/LBDW2gNmVa07sz/D229XigSdDQ5CLFwVB1Vb32MJbAHHhWe/6pOc721faI17tqw4pZ49i1xfY/jEZ9tbIhPg==} + dependencies: + prosemirror-model: 1.18.1 + prosemirror-transform: 1.7.0 + dev: false + + /prosemirror-suggest@2.0.0(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2): + resolution: {integrity: sha512-VRpkV1v9I076AdG/TlNAZCXxJPfc49/SpZnNkDQudQCbmKIzTDkhgbRSoWiUGWjVqy53ksjrjDJ4u3Z4NaOylA==} + peerDependencies: + prosemirror-model: ^1 + prosemirror-state: ^1 + prosemirror-view: ^1 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core-constants': 2.0.0 + '@remirror/core-helpers': 2.0.0 + '@remirror/types': 1.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-view: 1.28.2 + dev: false + + /prosemirror-tables@1.2.5: + resolution: {integrity: sha512-UB5XkWQC7YHJ2qubriOnKGxdVe+KujmoSatFyBlV8odVT/G++61XB1JXiU3ZAKJ60lTdq9WsowUhINSFeE7BoA==} + dependencies: + prosemirror-keymap: 1.2.0 + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-transform: 1.7.0 + prosemirror-view: 1.28.2 + dev: false + + /prosemirror-trailing-node@2.0.0(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2): + resolution: {integrity: sha512-7hcCgHgHrZKUADP+Sh6lgOtRcDp/hr75iScsjF4uS7dJVNWaAo5DZZHyBCiYRBsRO4eoLmRlr1hoYOwY3DH1sg==} + peerDependencies: + prosemirror-model: ^1 + prosemirror-state: ^1 + prosemirror-view: ^1 + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core-constants': 2.0.0 + '@remirror/core-helpers': 2.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-view: 1.28.2 + dev: false + + /prosemirror-transform@1.7.0: + resolution: {integrity: sha512-O4T697Cqilw06Zvc3Wm+e237R6eZtJL/xGMliCi+Uo8VL6qHk6afz1qq0zNjT3eZMuYwnP8ZS0+YxX/tfcE9TQ==} + dependencies: + prosemirror-model: 1.18.1 + dev: false + + /prosemirror-view@1.28.2: + resolution: {integrity: sha512-uK28mJbu0GI8Oz7Aclt6BKL4g+C59EBShBXDB0Y9Y71H25p4bQgmLQLfDWjsT1J9XOw0bR8QQajZmdK8RvXI9g==} + dependencies: + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-transform: 1.7.0 + dev: false + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + + /protobufjs@7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.11.9 + long: 5.2.3 + dev: false + + /protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: 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 + + /proxy-agent@5.0.0: + resolution: {integrity: sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==} + engines: {node: '>= 8'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@9.2.2) + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + lru-cache: 5.1.1 + pac-proxy-agent: 5.0.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 5.0.1 + transitivePeerDependencies: + - supports-color dev: true - /prr/1.0.1: + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: true + requiresBuild: true - /psl/1.8.0: - resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + /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 + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true - /pump/2.0.1: + /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: + /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: + /pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} dependencies: duplexify: 3.7.1 @@ -14243,100 +28262,152 @@ packages: pump: 2.0.1 dev: true - /punycode/1.3.2: + /punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} + dev: false + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: false - /punycode/2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} + + /pupa@2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} + engines: {node: '>=8'} + dependencies: + escape-goat: 2.1.1 + + /pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + dependencies: + escape-goat: 4.0.0 dev: true - /purgecss/4.1.3: + /pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + dev: false + + /purgecss@4.1.3: resolution: {integrity: sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==} hasBin: true dependencies: commander: 8.3.0 - glob: 7.2.0 - postcss: 8.4.13 - postcss-selector-parser: 6.0.10 + glob: 7.2.3 + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 dev: false - /q/1.5.1: + /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - /qs/6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 - /query-string/6.14.1: + /qs@6.11.1: + resolution: {integrity: sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /qs@6.9.3: + resolution: {integrity: sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==} + engines: {node: '>=0.6'} + dev: true + + /query-string@6.14.1: resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} engines: {node: '>=6'} dependencies: - decode-uri-component: 0.2.0 + decode-uri-component: 0.2.2 filter-obj: 1.1.0 split-on-first: 1.1.0 strict-uri-encode: 2.0.0 - dev: false - /query-string/7.1.1: - resolution: {integrity: sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==} + /query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} dependencies: - decode-uri-component: 0.2.0 + decode-uri-component: 0.2.2 filter-obj: 1.1.0 split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 - dev: true - - /querystring-es3/0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - dev: true + strict-uri-encode: 2.0.0 - /querystring/0.2.0: + /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: false - /queue-microtask/1.2.3: + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /quick-lru/4.0.1: + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + dev: false + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /quick-lru/5.1.1: + /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + + /ramda-adjunct@4.0.0(ramda@0.29.0): + resolution: {integrity: sha512-W/NiJAlZdwZ/iUkWEQQgRdH5Szqqet1WoVH9cdqDVjFbVaZHuJfJRvsxqHhvq6tZse+yVbFatLDLdVa30wBlGQ==} + engines: {node: '>=0.10.3'} + peerDependencies: + ramda: '>= 0.29.0' + dependencies: + ramda: 0.29.0 dev: false - /ramda/0.21.0: - resolution: {integrity: sha512-HGd5aczYKQXGILB+abY290V7Xz62eFajpa6AtMdwEmQSakJmgSO7ks4eI3HdR34j+X2Vz4Thp9VAJbrCAMbO2w==} + /ramda@0.28.0: + resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==} dev: true - /randombytes/2.1.0: + /ramda@0.29.0: + resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + 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.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + dev: false - /range-parser/1.2.1: + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - dev: true - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -14344,596 +28415,709 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + 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 - /raw-loader/4.0.2_webpack@4.46.0: + /raw-loader@4.0.2(webpack@5.75.0): resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} engines: {node: '>= 10.13.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.4 schema-utils: 3.1.1 - webpack: 4.46.0 + webpack: 5.75.0(esbuild@0.15.18) dev: true - /rc-align/4.0.12_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ==} + /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - dom-align: 1.12.3 - lodash: 4.17.21 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + dom-align: 1.12.4 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) resize-observer-polyfill: 1.5.1 dev: false - /rc-cascader/3.5.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-rpXnWCfvk7Frh2dBzMoA0c7i0nn6aJU7L2NZo8R8pNkrT0sKgytQSpdtPWP+Pq8IkvwbEd8BU8Z8OnOljcqgZg==} + /rc-cascader@3.7.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 array-tree-filter: 2.1.0 - classnames: 2.3.1 - rc-select: 14.1.2_sfoxds7t5ydpegc3knd667wn6m - rc-tree: 5.5.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + classnames: 2.3.2 + rc-select: 14.1.18(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.2(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-checkbox/2.3.2_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==} + /rc-checkbox@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k7nxDWxYF+jDI0ZcCvuvj71xONmWRVe5+1MKcERRR9MRyP3tZ69b+yUCSXXh+sik4/Hc9P5wHr2nnUoGS2zBjA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-collapse/3.1.4_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-WayrhswKMwuJab9xbqFxXTgV0m6X8uOPEO6zm/GJ5YJiJ/wIh/Dd2VtWeI06HYUEnTFv0HNcYv+zWbB+p6OD2A==} + /rc-collapse@3.4.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) shallowequal: 1.1.0 dev: false - /rc-dialog/8.8.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-7M1WKZCjfIABKEaJVskdYvb80z+RX7I11PeSjPVfLOOaJAmIepvDEd0alBtOZvOL3fZFWlMs4JVZtp9LZgONxA==} + /rc-dialog@9.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-drawer/4.4.3_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-FYztwRs3uXnFOIf1hLvFxIQP9MiZJA+0w+Os8dfDh/90X7z/HqP/Yg+noLCIeHEbKln1Tqelv8ymCAN24zPcfQ==} + /rc-drawer@6.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uBZVb3xTAR+dBV53d/bUhTctCw3pwcwJoM7g5aX+7vgwt2zzVzoJ6aqFjYJpBlZ9zp0dVYN8fV+hykFE7c4lig==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-dropdown/3.5.2_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-Ty4LsXjkspZuFJSRx3blCLLCDicXM5qds6F1odgEa+jcjC+OJKHQGnvE4FqtoljPaqWm4wG78pbgXH6Ddh2DkA==} + /rc-dropdown@4.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==} peerDependencies: react: '>=16.11.0' react-dom: '>=16.11.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-trigger: 5.2.18_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-field-form/1.26.4_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-eCCyiNNaN0NTYTyoziQHD4Fj6mUED21lWkw66vg+kttg0eDw+miD6LsaJbTD5c2bzKjUJTf10AitPG+f5zT4+A==} + /rc-field-form@1.34.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BdciU5C7dBO51/9ZKcMvK2f8zaaO12Lt1eBhlAo8nNv+6htlNcgY9DAkUlZ7gfyWjnCc1Oo4hHIXau1m6tLw1A==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - async-validator: 4.1.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + async-validator: 4.2.5 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-image/5.6.2_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-qhKOVvivCZkd6CrzS/4ST2+Auu16mtPSFVqVzwE7sELWfuvzcLGTzGv8UsVvm6qRNIz6SeaueUetqi4Ii16XQA==} + /rc-image@5.13.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-dialog: 8.8.1_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + rc-dialog: 9.0.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-input-number/7.3.4_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-W9uqSzuvJUnz8H8vsVY4kx+yK51SsAxNTwr8SNH4G3XqQNocLVmKIibKFRjocnYX1RDHMND9FFbgj2h7E7nvGA==} + /rc-input-number@7.3.11(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-input/0.0.1-alpha.7_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-eozaqpCYWSY5LBMwlHgC01GArkVEP+XlJ84OMvdkwUnJBSv83Yxa15pZpn7vACAj84uDC4xOA2CoFdbLuqB08Q==} + /rc-input@0.1.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-mentions/1.7.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-JbCS9bTqt6BYN2vfTPythlScLuc42rIlX85n7975RnkfawXlJjskHOlR3o8EpD4asl4KuA2jKTy0dj39DtSVqg==} + /rc-mentions@1.13.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-menu: 9.5.5_sfoxds7t5ydpegc3knd667wn6m - rc-textarea: 0.3.7_sfoxds7t5ydpegc3knd667wn6m - rc-trigger: 5.2.18_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-menu: 9.8.2(react-dom@18.2.0)(react@18.2.0) + rc-textarea: 0.4.7(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-menu/9.5.5_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-wj2y2BAKwSMyWXO3RBf9sNN5V+DFWxFl45Ma6qQEHA5nwwh7p07bNgc6AAJc+L1+LAz+rWz3AU8PYyT17hMHCw==} + /rc-menu@9.8.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-overflow: 1.2.5_sfoxds7t5ydpegc3knd667wn6m - rc-trigger: 5.2.18_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - shallowequal: 1.1.0 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-overflow: 1.2.8(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-motion/2.6.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-1MDWA9+i174CZ0SIDenSYm2Wb9YbRkrexjZWR0CUFu7D6f23E8Y0KsTgk9NGOLJsGak5ELZK/Y5lOlf5wQdzbw==} + /rc-motion@2.6.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-notification/4.6.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-xF3MKgIoynzjQAO4lqsoraiFo3UXNYlBfpHs0VWvwF+4pimen9/H1DYLN2mfRWhHovW6gRpla73m2nmyIqAMZQ==} + /rc-notification@4.6.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-overflow/1.2.5_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-5HJKZ4nPe9e7AFdCkflgpRydvH6lJ4i2iFF06q/T1G9lL/XBeuoPLRrTBU8ao/Vo/yARW6WfEHnC2951lVgX5Q==} + /rc-overflow@1.2.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-resize-observer: 1.2.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-pagination/3.1.16_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-GFcHXJ7XxeJDf9B+ndP4PRDt46maSSgYhiwofBMiIGKIlBhJ0wfu8DMCEvaWJJLpI2u4Gb6zF1dHpiqPFrosPg==} + /rc-pagination@3.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-picker/2.6.9_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-yH3UYXCADf7REtOAB5cwe1cyFKtB0p204RCN8JdZGG4uuSOZ1IPTkk/GJS6HOpxspZeJCLGzzajuQMDwck9dsw==} + /rc-picker@2.7.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - date-fns: 2.28.0 - dayjs: 1.10.7 - moment: 2.29.3 - rc-trigger: 5.2.18_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + date-fns: 2.29.3 + dayjs: 1.11.7 + moment: 2.29.4 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) shallowequal: 1.1.0 dev: false - /rc-progress/3.2.4_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-M9WWutRaoVkPUPIrTpRIDpX0SPSrVHzxHdCRCbeoBFrd9UFWTYNWRlHsruJM5FH1AZI+BwB4wOJUNNylg/uFSw==} + /rc-progress@3.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-rate/2.9.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA==} + /rc-rate@2.9.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-resize-observer/1.2.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-6W+UzT3PyDM0wVCEHfoW3qTHPTvbdSgiA43buiy8PzmeMnfgnDeb9NjdimMXMl3/TcrvvWl5RRVdp+NqcR47pQ==} + /rc-resize-observer@1.3.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) resize-observer-polyfill: 1.5.1 dev: false - /rc-segmented/2.1.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-hUlonro+pYoZcwrH6Vm56B2ftLfQh046hrwif/VwLIw1j3zGt52p5mREBwmeVzXnSwgnagpOpfafspzs1asjGw==} + /rc-segmented@2.1.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-select/14.1.2_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-/QgarL/T/d7MIPcoRmTca2TWHBoHBM1EQIgdaFmvl3qsYRSbrb8NpWcQuJoc9fprXERWxdYSTUThQObHvdEVBQ==} + /rc-select@14.1.18(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4JgY3oG2Yz68ECMUSCON7mtxuJvCSj+LJpHEg/AONaaVBxIIrmI/ZTuMJkyojall/X50YdBe5oMKqHHPNiPzEg==} engines: {node: '>=8.x'} peerDependencies: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-overflow: 1.2.5_sfoxds7t5ydpegc3knd667wn6m - rc-trigger: 5.2.18_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - rc-virtual-list: 3.4.7_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-overflow: 1.2.8(react-dom@18.2.0)(react@18.2.0) + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.4.13(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-slider/10.0.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-Bk54UIKWW4wyhHcL8ehAxt+wX+n69dscnHTX6Uv0FMxSke/TGrlkZz1LSIWblCpfE2zr/dwR2Ca8nZGk3U+Tbg==} + /rc-slider@10.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-tooltip: 5.1.1_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) shallowequal: 1.1.0 dev: false - /rc-steps/4.1.4_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-qoCqKZWSpkh/b03ASGx1WhpKnuZcRWmvuW+ZUu4mvMdfvFzVxblTwUM+9aBd0mlEUFmt6GW8FXhMpHkK3Uzp3w==} + /rc-steps@5.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-switch/3.2.2_sfoxds7t5ydpegc3knd667wn6m: + /rc-switch@3.2.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-table/7.24.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-DRWpv5z5pmOaTmy5GqWoskeV1thaOu5HuD+2f61b/CkbBqlgJR3cygc5R/Qvd2uVW6pHU0lYulhmz0VLVFm+rw==} + /rc-table@7.26.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-resize-observer: 1.2.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) shallowequal: 1.1.0 dev: false - /rc-tabs/11.13.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-aUw1Pq0B1a2zGX4o/m3yrQycZcCLgDp6gKwn8IAU07q148RRONsVGxi0oLVVe5SE51kOB+j0bk1RX43ZBdZNgA==} + /rc-tabs@12.5.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-i9gY2TcwCNmBM+bXCDDTvb6mnRYIDkkNm+UGoIqrLOFnRRbAqjsSf+tgyvzhBvbK8XcSrMhzKKLaOMbGyND8YA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-dropdown: 3.5.2_sfoxds7t5ydpegc3knd667wn6m - rc-menu: 9.5.5_sfoxds7t5ydpegc3knd667wn6m - rc-resize-observer: 1.2.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.8.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-textarea/0.3.7_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-yCdZ6binKmAQB13hc/oehh0E/QRwoPP1pjF21aHBxlgXO3RzPF6dUu4LG2R4FZ1zx/fQd2L1faktulrXOM/2rw==} + /rc-textarea@0.4.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-resize-observer: 1.2.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) shallowequal: 1.1.0 dev: false - /rc-tooltip/5.1.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA==} + /rc-tooltip@5.2.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - rc-trigger: 5.2.18_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - dev: false - - /rc-tree-select/5.3.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-UN6CUBulmch+CsihnJ73+DtWijEB1hVTC8sdVxq6E0teVAkHQZUvDj+cwZShtShAKvWwXy73PZ1hIHEUrmVcKw==} - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-select: 14.1.2_sfoxds7t5ydpegc3knd667wn6m - rc-tree: 5.5.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-tree/5.5.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-vpKeFsDyj7weik8UPseCTaSNAPt939qn1dQd8goSbRDajbjJEja0v/WFXyRhOiF1HLemNTfqMz4MYc9qlqyNXg==} - engines: {node: '>=10.x'} + /rc-tree-select@5.5.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==} peerDependencies: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - rc-virtual-list: 3.4.7_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-select: 14.1.18(react-dom@18.2.0)(react@18.2.0) + rc-tree: 5.7.2(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-tree/5.6.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-kjxdI2jiYT2dWFT3NZ9FIR6L5Hf+LVXP0zUUr7e0vX/KVwC9cZ1l8PO//u5tvmzky9z7EC6ENx7TK7i+PNANAw==} + /rc-tree@5.7.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nmnL6qLnfwVckO5zoqKL2I9UhwDqzyCtjITQCkwhimyz1zfuFkG5ZPIXpzD/Guzso94qQA/QrMsvzic5W6QDjg==} engines: {node: '>=10.x'} peerDependencies: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - rc-virtual-list: 3.4.7_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.4.13(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-trigger/5.2.18_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-hi2yZ7umtbAGLxgSph1az9BR9i4Pb4fiQa4pdvFQuKN7U//3nwwygHQKHfexnM+0APBnzZwVlEHA5I8BpWrygw==} + /rc-trigger@5.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-align: 4.0.12_sfoxds7t5ydpegc3knd667wn6m - rc-motion: 2.6.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.6.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-upload/4.3.3_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-YoJ0phCRenMj1nzwalXzciKZ9/FAaCrFu84dS5pphwucTC8GUWClcDID/WWNGsLFcM97NqIboDqrV82rVRhW/w==} + /rc-upload@4.3.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - classnames: 2.3.1 - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /rc-util/5.21.4_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-rq11ap3NnOIdywFhcMQ9J7DXRJJ1c1Id1Hvr/1Dphr+5X75ERJBJybuh779DdurP4LJQqAhT6Aie0AjrBc5Vqw==} + /rc-util@5.36.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a4uUvT+UNHvYL+awzbN8H8zAjfduwY4KAp2wQy40wOz3NyBdo3Xhx/EAAPyDkHLoGm535jIACaMhIqExGiAjHw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.17.9 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) react-is: 16.13.1 - shallowequal: 1.1.0 dev: false - /rc-virtual-list/3.4.7_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-PhV8a8g/L9sCmWcmXizzwW7QdqsxK4ebHU6fA9OsUIR7isFdx2bTGU2iAUdRV4teiIF1ZHF3gSQh8NtAxrXh6A==} + /rc-virtual-list@3.4.13(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w==} engines: {node: '>=8.x'} peerDependencies: react: '*' react-dom: '*' dependencies: - classnames: 2.3.1 - rc-resize-observer: 1.2.0_sfoxds7t5ydpegc3knd667wn6m - rc-util: 5.21.4_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@babel/runtime': 7.21.0 + classnames: 2.3.2 + rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.36.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + /react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + dependencies: + base16: 1.0.0 + lodash.curry: 4.1.1 + lodash.flow: 3.5.0 + pure-color: 1.3.0 dev: false - /react-canvas-draw/1.2.1_react@17.0.2: + /react-canvas-draw@1.2.1(react@18.2.0): resolution: {integrity: sha512-mCHE+Q91a26gUhyraHONedmbCI7dF/4BKdOxba7s4538QNfFWv/NfzLXWZrmjAQ4tO1vTvO+axX5YGIFjGc6uw==} peerDependencies: react: 16.x || 17.x dependencies: catenary-curve: 1.0.1 lazy-brush: 1.0.1 - prop-types: 15.8.0 - react: 17.0.2 + prop-types: 15.8.1 + react: 18.2.0 resize-observer-polyfill: 1.5.1 dev: false - /react-colorful/5.5.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==} + /react-clientside-effect@1.2.6(react@18.2.0): + resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - dev: true + '@babel/runtime': 7.21.0 + react: 18.2.0 + dev: false + + /react-color@2.19.3(react@18.2.0): + resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==} + peerDependencies: + react: '*' + dependencies: + '@icons/material': 0.2.4(react@18.2.0) + lodash: 4.17.21 + lodash-es: 4.17.21 + material-colors: 1.2.6 + prop-types: 15.8.1 + react: 18.2.0 + reactcss: 1.2.3(react@18.2.0) + tinycolor2: 1.4.2 + dev: false + + /react-dev-utils@12.0.1(eslint@8.34.0)(typescript@4.9.4)(webpack@5.75.0): + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: 4.9.4 + webpack: 5.75.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/code-frame': 7.18.6 + address: 1.2.2 + browserslist: 4.21.5 + chalk: 4.1.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 4.0.0 + filesize: 8.0.7 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.2(eslint@8.34.0)(typescript@4.9.4)(webpack@5.75.0) + global-modules: 2.0.0 + globby: 11.1.0 + gzip-size: 6.0.0 + immer: 9.0.21 + is-root: 2.1.0 + loader-utils: 3.2.1 + open: 8.4.2 + pkg-up: 3.1.0 + prompts: 2.4.2 + react-error-overlay: 6.0.11 + recursive-readdir: 2.2.3 + shell-quote: 1.8.0 + strip-ansi: 6.0.1 + text-table: 0.2.0 + typescript: 4.9.4 + webpack: 5.75.0(esbuild@0.15.18) + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + dev: false + + /react-devtools-core@4.25.0: + resolution: {integrity: sha512-iewRrnu0ZnmfL+jJayKphXj04CFh6i3ezVnpCtcnZbTPSQgN09XqHAzXbKbqNDl7aTg9QLNkQRP6M3DvdrinWA==} + dependencies: + shell-quote: 1.8.0 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /react-dnd-html5-backend@16.0.1: + resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} + dependencies: + dnd-core: 16.0.1 + dev: false + + /react-dnd@16.0.1(@types/node@18.11.9)(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} + peerDependencies: + '@types/hoist-non-react-statics': '>= 3.3.1' + '@types/node': 18.11.9 + '@types/react': 18.0.20 + react: '>= 16.14' + peerDependenciesMeta: + '@types/hoist-non-react-statics': + optional: true + '@types/node': + optional: true + '@types/react': + optional: true + dependencies: + '@react-dnd/invariant': 4.0.2 + '@react-dnd/shallowequal': 4.0.2 + '@types/node': 18.11.9 + '@types/react': 18.0.20 + dnd-core: 16.0.1 + fast-deep-equal: 3.1.3 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false - /react-docgen-typescript/2.2.2_typescript@4.6.4: + /react-docgen-typescript@2.2.2(typescript@4.9.4): resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} peerDependencies: - typescript: '>= 4.3.x' + typescript: 4.9.4 dependencies: - typescript: 4.6.4 + typescript: 4.9.4 dev: true - /react-docgen/5.4.0: - resolution: {integrity: sha512-JBjVQ9cahmNlfjMGxWUxJg919xBBKAoy3hgDgKERbR+BcF4ANpDuzWAScC7j27hZfd8sJNmMPOLWo9+vB/XJEQ==} + /react-docgen@5.4.3: + resolution: {integrity: sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==} engines: {node: '>=8.10.0'} hasBin: true dependencies: - '@babel/core': 7.17.10 - '@babel/generator': 7.17.10 - '@babel/runtime': 7.17.9 + '@babel/core': 7.21.0 + '@babel/generator': 7.21.1 + '@babel/runtime': 7.21.0 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -14945,7 +29129,7 @@ packages: - supports-color dev: true - /react-dom/17.0.2_react@17.0.2: + /react-dom@17.0.2(react@17.0.2): resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} peerDependencies: react: 17.0.2 @@ -14955,31 +29139,40 @@ packages: react: 17.0.2 scheduler: 0.20.2 - /react-draggable/4.4.5_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==} + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: '>= 16.3.0' - react-dom: '>= 16.3.0' + react: ^18.2.0 dependencies: - clsx: 1.1.1 - prop-types: 15.8.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - dev: true + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 - /react-easy-crop/3.5.3_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-ApTbh+lzKAvKqYW81ihd5J6ZTNN3vPDwi6ncFuUrHPI4bko2DlYOESkRm+0NYoW0H8YLaD7bxox+Z3EvIzAbUA==} + /react-easy-crop@5.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ppYg3E0jxpDW+HdgLa65lCykZSsGMuusBuKD3HeTMs/Aod4xiWyAH5jZn5iHlllLUV2c0PPT6FznvdNeLhO2wA==} peerDependencies: react: '>=16.4.0' react-dom: '>=16.4.0' dependencies: normalize-wheel: 1.0.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.0.1 + dev: false + + /react-easy-sort@1.5.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VKwFO2pHJgz75zEZkxoZYSr0jvQfbS2BUqCQPR3hCRxUfLl9M7xTrXK4rZeFlA+83RxOQCZnzrqtuX0sbtKKlQ==} + peerDependencies: + react: '>=16.4.0' + react-dom: '>=16.4.0' + dependencies: + array-move: 3.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) tslib: 2.0.1 dev: false - /react-element-to-jsx-string/14.3.4_sfoxds7t5ydpegc3knd667wn6m: + /react-element-to-jsx-string@14.3.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==} peerDependencies: react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 @@ -14987,68 +29180,101 @@ packages: dependencies: '@base2/pretty-print-object': 1.0.1 is-plain-object: 5.0.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) react-is: 17.0.2 dev: true - /react-error-boundary/3.1.4_react@17.0.2: + /react-error-boundary@3.1.4(react@18.2.0): resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} engines: {node: '>=10', npm: '>=6'} peerDependencies: react: '>=16.13.1' dependencies: - '@babel/runtime': 7.17.9 - react: 17.0.2 + '@babel/runtime': 7.21.0 + react: 18.2.0 dev: true - /react-fast-compare/2.0.4: + /react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + dev: false + + /react-fast-compare@2.0.4: resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==} dev: false - /react-fast-compare/3.2.0: + /react-fast-compare@3.2.0: resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} - /react-helmet-async/1.3.0_sfoxds7t5ydpegc3knd667wn6m: + /react-fastify-form@1.0.13(react@18.2.0): + resolution: {integrity: sha512-cm9a7b6j0L8aeCsLg3ClZmYjajhWsX+p/MbB0C2Yc4A6lnxvYGJDQ0trEMIqxO07QyMQmoPPQVI4DQvhG4A8IA==} + peerDependencies: + react: ^16.14.0 + dependencies: + formik: 2.2.9(react@18.2.0) + lodash: 4.17.21 + react: 18.2.0 + yup: 0.32.11 + dev: false + + /react-focus-lock@2.9.5(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-h6vrdgUbsH2HeD5I7I3Cx1PPrmwGuKYICS+kB9m+32X/9xHRrAbxgvaBpG7BFBN9h3tO+C3qX1QAVESmi4CiIA==} + peerDependencies: + '@types/react': 18.0.20 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@types/react': 18.0.20 + focus-lock: 0.11.6 + prop-types: 15.8.1 + react: 18.2.0 + react-clientside-effect: 1.2.6(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.0.20)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.0.20)(react@18.2.0) + dev: false + + /react-helmet-async@1.3.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} peerDependencies: react: ^16.6.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 invariant: 2.2.4 prop-types: 15.8.1 react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react-dom: 17.0.2(react@17.0.2) react-fast-compare: 3.2.0 shallowequal: 1.1.0 - dev: true - /react-helmet/6.1.0_react@17.0.2: + /react-helmet@6.1.0(react@18.2.0): resolution: {integrity: sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==} peerDependencies: react: '>=16.3.0' dependencies: object-assign: 4.1.1 - prop-types: 15.8.0 - react: 17.0.2 + prop-types: 15.8.1 + react: 18.2.0 react-fast-compare: 3.2.0 - react-side-effect: 2.1.1_react@17.0.2 + react-side-effect: 2.1.2(react@18.2.0) dev: false - /react-highlight/0.14.0_sfoxds7t5ydpegc3knd667wn6m: + /react-highlight@0.14.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-kWE+KXOXidS7SABhVopOgMnowbI3RAfeGZbnrduLNlWrYAED8sycL9l/Fvw3w0PFpIIawB7mRDnyhDcM/cIIGA==} peerDependencies: react: ^15.0.0 || ^16.0.0 || ^17.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: highlight.js: 10.7.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /react-i18next/11.16.9_fx4b3zen7tdcdwbld3lkpcycbu: - resolution: {integrity: sha512-euXxWvcEAvsY7ZVkwx9ztCq4butqtsGHEkpkuo0RMj8Ru09IF9o2KxCyN+zyv51Nr0aBh/elaTIiR6fMb8YfVg==} + /react-i18next@11.18.6(i18next@21.9.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==} peerDependencies: i18next: '>= 19.0.0' react: '>= 16.8.0' @@ -15060,307 +29286,475 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.17.9 - html-escaper: 2.0.2 + '@babel/runtime': 7.21.0 html-parse-stringify: 3.0.1 - i18next: 20.6.1 - react: 17.0.2 + i18next: 21.9.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-i18next@12.3.1(i18next@22.5.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5v8E2XjZDFzK7K87eSwC7AJcAkcLt5xYZ4+yTPDAW1i7C93oOY1dnr4BaQM7un4Hm+GmghuiPvevWwlca5PwDA==} + peerDependencies: + i18next: '>= 19.0.0' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.21.0 + html-parse-stringify: 3.0.1 + i18next: 22.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /react-inspector/5.1.1_react@17.0.2: + /react-inspector@5.1.1(react@18.2.0): resolution: {integrity: sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==} peerDependencies: react: ^16.8.4 || ^17.0.0 dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 is-dom: 1.1.0 prop-types: 15.8.1 - react: 17.0.2 + react: 18.2.0 dev: true - /react-is/16.13.1: + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /react-is/17.0.2: + /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + /react-json-view@1.21.3(@types/react@18.0.20)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} + peerDependencies: + react: ^17.0.0 || ^16.3.0 || ^15.5.4 + react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + dependencies: + flux: 4.0.3(react@17.0.2) + react: 17.0.2 + react-base16-styling: 0.6.0 + react-dom: 17.0.2(react@17.0.2) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 8.4.0(@types/react@18.0.20)(react@17.0.2) + transitivePeerDependencies: + - '@types/react' + - encoding + dev: false + + /react-json-view@1.21.3(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} + peerDependencies: + react: ^17.0.0 || ^16.3.0 || ^15.5.4 + react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 + dependencies: + flux: 4.0.3(react@18.2.0) + react: 18.2.0 + react-base16-styling: 0.6.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 8.4.0(@types/react@18.0.20)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - encoding + dev: false + + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + dev: false + + /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.75.0): + resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} + engines: {node: '>=10.13.0'} + peerDependencies: + react-loadable: '*' + webpack: 5.75.0 + dependencies: + '@babel/runtime': 7.21.0 + react-loadable: /@docusaurus/react-loadable@5.5.2(react@17.0.2) + webpack: 5.75.0(esbuild@0.15.18) + dev: false - /react-markdown/6.0.3_zdsfwtvwq54q3oqxwtq4jnbhh4: - resolution: {integrity: sha512-kQbpWiMoBHnj9myLlmZG9T1JdoT/OEyHK7hqM6CqFT14MAkgWiWBUYijLyBmxbntaN6dCDicPcUhWhci1QYodg==} + /react-markdown@8.0.5(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-jGJolWWmOWAvzf+xMdB9zwStViODyyFQhNB/bwCerbBKmrTmgmA599CGiOlP58OId1IMoIRsA8UdI1Lod4zb5A==} peerDependencies: - '@types/react': '>=16' + '@types/react': 18.0.20 react: '>=16' dependencies: '@types/hast': 2.3.4 - '@types/react': 17.0.44 + '@types/prop-types': 15.7.5 + '@types/react': 18.0.20 '@types/unist': 2.0.6 - comma-separated-tokens: 1.0.8 - prop-types: 15.8.0 - property-information: 5.6.0 - react: 17.0.2 - react-is: 17.0.2 - remark-parse: 9.0.0 - remark-rehype: 8.1.0 - space-separated-tokens: 1.1.5 - style-to-object: 0.3.0 - unified: 9.2.2 - unist-util-visit: 2.0.3 - vfile: 4.2.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 2.0.1 + prop-types: 15.8.1 + property-information: 6.2.0 + react: 18.2.0 + react-is: 18.2.0 + remark-parse: 10.0.1 + remark-rehype: 10.1.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 transitivePeerDependencies: - supports-color dev: false - /react-mentions/4.3.2_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-NV8ixuE5W9zuvBNWLpPlO+f4QYEkR+p6mR3Jfpfcbytrqqn2nbVb27YXE/M4qSP8N8C+ktgeMUV4jVhm86gt1A==} + /react-mentions@4.4.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VNriu2h/uOB+RS0mwZgPG2Vf+UtdDvRh5zbXa2TNc1WqacKuNDgTdhlbo9LEOZRBxRzIeTUYQmYJ7p9M9rDHqQ==} peerDependencies: react: '>=16.8.3' react-dom: '>=16.8.3' dependencies: - '@babel/runtime': 7.4.5 + '@babel/runtime': 7.21.0 invariant: 2.2.4 - prop-types: 15.8.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - substyle: 9.4.1_react@17.0.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + substyle: 9.4.1(react@18.2.0) dev: false - /react-popper-tooltip/3.1.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==} - peerDependencies: - react: ^16.6.0 || ^17.0.0 - react-dom: ^16.6.0 || ^17.0.0 - dependencies: - '@babel/runtime': 7.17.9 - '@popperjs/core': 2.11.5 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-popper: 2.3.0_kz2vxbzpsgxv356x2ucg6oykdm - dev: true - - /react-popper/2.3.0_kz2vxbzpsgxv356x2ucg6oykdm: - resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} - peerDependencies: - '@popperjs/core': ^2.0.0 - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 - dependencies: - '@popperjs/core': 2.11.5 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-fast-compare: 3.2.0 - warning: 4.0.3 + /react-merge-refs@1.1.0: + resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} dev: true - /react-property/2.0.0: + /react-property@2.0.0: resolution: {integrity: sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==} dev: false - /react-query/3.39.0_react@17.0.2: - resolution: {integrity: sha512-Od0IkSuS79WJOhzWBx/ys0x13+7wFqgnn64vBqqAAnZ9whocVhl/y1padD5uuZ6EIkXbFbInax0qvY7zGM0thA==} + /react-reconciler@0.26.2(react@18.2.0): + resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} + engines: {node: '>=0.10.0'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: '*' - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true + react: ^17.0.2 dependencies: - '@babel/runtime': 7.17.9 - broadcast-channel: 3.7.0 - match-sorter: 6.3.1 - react: 17.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 18.2.0 + scheduler: 0.20.2 dev: false - /react-redux/7.2.8_react@17.0.2: - resolution: {integrity: sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==} + /react-redux@8.0.2(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1): + resolution: {integrity: sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA==} peerDependencies: - react: ^16.8.3 || ^17 || ^18 - react-dom: '*' - react-native: '*' + '@types/react': 18.0.20 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: '>=0.59' + redux: 4.2.1 peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true react-dom: optional: true react-native: optional: true + redux: + optional: true dependencies: - '@babel/runtime': 7.17.9 - '@types/react-redux': 7.1.24 + '@babel/runtime': 7.21.0 + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.0.20 + '@types/use-sync-external-store': 0.0.3 hoist-non-react-statics: 3.3.2 - loose-envify: 1.4.0 - prop-types: 15.8.0 - react: 17.0.2 - react-is: 17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + redux: 4.2.1 + use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /react-refresh/0.11.0: + /react-refresh@0.11.0: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} dev: true - /react-router-dom/5.3.1_react@17.0.2: - resolution: {integrity: sha512-f0pj/gMAbv9e8gahTmCEY20oFhxhrmHwYeIwH5EO5xu0qme+wXtsdB8YfUOAZzUz4VaXmb58m3ceiLtjMhqYmQ==} + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-resize-detector@8.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-router-config@5.1.1(react-router@5.3.4)(react@17.0.2): + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: 6.11.0 + dependencies: + '@babel/runtime': 7.21.0 + react: 17.0.2 + react-router: 5.3.4(react@17.0.2) + dev: false + + /react-router-dom@5.3.4(react@17.0.2): + resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 history: 4.10.1 loose-envify: 1.4.0 - prop-types: 15.8.0 + prop-types: 15.8.1 react: 17.0.2 - react-router: 5.3.1_react@17.0.2 - tiny-invariant: 1.2.0 + react-router: 5.3.4(react@17.0.2) + tiny-invariant: 1.3.1 tiny-warning: 1.0.3 dev: false - /react-router-dom/6.3.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} + /react-router-dom@6.11.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==} + engines: {node: '>=14'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - history: 5.3.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-router: 6.3.0_react@17.0.2 - dev: true + '@remix-run/router': 1.6.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.11.0(react@18.2.0) + dev: false - /react-router/5.3.1_react@17.0.2: - resolution: {integrity: sha512-v+zwjqb7bakqgF+wMVKlAPTca/cEmPOvQ9zt7gpSNyPXau1+0qvuYZ5BWzzNDP1y6s15zDwgb9rPN63+SIniRQ==} + /react-router@5.3.4(react@17.0.2): + resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 - mini-create-react-context: 0.4.1_2d37ibx6onn5gxj7obk37edtfe path-to-regexp: 1.8.0 - prop-types: 15.8.0 + prop-types: 15.8.1 react: 17.0.2 react-is: 16.13.1 - tiny-invariant: 1.2.0 + tiny-invariant: 1.3.1 tiny-warning: 1.0.3 dev: false - /react-router/6.3.0_react@17.0.2: - resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==} + /react-router@6.11.0(react@18.2.0): + resolution: {integrity: sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==} + engines: {node: '>=14'} peerDependencies: react: '>=16.8' dependencies: - history: 5.3.0 - react: 17.0.2 - dev: true + '@remix-run/router': 1.6.0 + react: 18.2.0 - /react-side-effect/2.1.1_react@17.0.2: - resolution: {integrity: sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==} + /react-side-effect@2.1.2(react@18.2.0): + resolution: {integrity: sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==} peerDependencies: - react: ^16.3.0 || ^17.0.0 + react: ^16.3.0 || ^17.0.0 || ^18.0.0 dependencies: - react: 17.0.2 + react: 18.2.0 dev: false - /react-sizeme/3.0.2: - resolution: {integrity: sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==} + /react-smooth@2.0.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==} + peerDependencies: + prop-types: ^15.6.0 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - element-resize-detector: 1.2.4 - invariant: 2.2.4 - shallowequal: 1.1.0 - throttle-debounce: 3.0.1 - dev: true + fast-equals: 5.0.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 2.9.0(react-dom@18.2.0)(react@18.2.0) + dev: false - /react-split/2.0.14_react@17.0.2: + /react-split@2.0.14(react@18.2.0): resolution: {integrity: sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==} peerDependencies: react: '*' dependencies: - prop-types: 15.8.0 - react: 17.0.2 + prop-types: 15.8.1 + react: 18.2.0 split.js: 1.6.5 dev: false - /react-syntax-highlighter/13.5.3_react@17.0.2: - resolution: {integrity: sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==} + /react-textarea-autosize@8.4.0(@types/react@18.0.20)(react@17.0.2): + resolution: {integrity: sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==} + engines: {node: '>=10'} peerDependencies: - react: '>= 0.14.0' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.17.9 - highlight.js: 10.7.3 - lowlight: 1.20.0 - prismjs: 1.28.0 + '@babel/runtime': 7.21.0 react: 17.0.2 - refractor: 3.6.0 - dev: true + use-composed-ref: 1.3.0(react@17.0.2) + use-latest: 1.2.1(@types/react@18.0.20)(react@17.0.2) + transitivePeerDependencies: + - '@types/react' + dev: false - /react-textarea-autosize/8.3.3_react@17.0.2: - resolution: {integrity: sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==} + /react-textarea-autosize@8.4.0(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==} engines: {node: '>=10'} peerDependencies: - react: ^16.8.0 || ^17.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.17.9 - react: 17.0.2 - use-composed-ref: 1.3.0_react@17.0.2 - use-latest: 1.2.1_react@17.0.2 + '@babel/runtime': 7.21.0 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(@types/react@18.0.20)(react@18.2.0) transitivePeerDependencies: - '@types/react' - dev: true + dev: false + + /react-transition-group@2.9.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} + peerDependencies: + react: '>=15.0.0' + react-dom: '>=15.0.0' + dependencies: + dom-helpers: 3.4.0 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + dev: false - /react-transition-group/4.4.2_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==} + /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 - prop-types: 15.8.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /react-use-gesture/9.1.3_react@17.0.2: - resolution: {integrity: sha512-CdqA2SmS/fj3kkS2W8ZU8wjTbVBAIwDWaRprX7OKaj7HlGwBasGEFggmk5qNklknqk9zK/h8D355bEJFTpqEMg==} - deprecated: This package is no longer maintained. Please use @use-gesture/react instead + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.5.0): + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: - react: '>= 16.8.0' + react: '*' + tslib: '*' dependencies: - react: 17.0.2 + react: 18.2.0 + tslib: 2.5.0 + dev: false + + /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@types/js-cookie': 2.2.7 + '@xobotyi/scrollbar-width': 1.9.5 + copy-to-clipboard: 3.3.3 + fast-deep-equal: 3.1.3 + fast-shallow-equal: 1.0.0 + js-cookie: 2.2.1 + nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.5.0) + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + set-harmonic-interval: 1.0.1 + throttle-debounce: 3.0.1 + ts-easing: 0.2.0 + tslib: 2.5.0 dev: false - /react-virtualized-auto-sizer/1.0.6_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==} + /react-virtualized-auto-sizer@1.0.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Mxi6lwOmjwIjC1X4gABXMJcKHsOo0xWl3E3ugOgufB8GJU+MqrtY35aBuvCYv/razQ1Vbp7h1gWJjGjoNN5pmA==} engines: {node: '>8.0.0'} peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc dependencies: - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /react-virtuoso/2.11.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-8Lb0duo23pceUR0f5FMh3qoSRtO6XTYD/Hh3JHjNtRcvTl9rq87rk182tbKNwVDc4zvlO0WLlxytmMuHxuHg6Q==} + /react-virtuoso@4.4.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7hVk43DN9Sx6czpclTpPnB2uzDmCaioSoTSN8lRv4mMF7UL5jmfc58UpjRrGoJavzVn1VBjHLLj6RHBLsS+N5Q==} engines: {node: '>=10'} peerDependencies: react: '>=16 || >=17 || >= 18' react-dom: '>=16 || >=17 || >= 18' dependencies: - '@virtuoso.dev/react-urx': 0.2.13_react@17.0.2 - '@virtuoso.dev/urx': 0.2.13 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /react/17.0.2: + /react@17.0.2: resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - /read-pkg-up/7.0.1: + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /reactcss@1.2.3(react@18.2.0): + resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==} + peerDependencies: + react: '*' + dependencies: + lodash: 4.17.21 + react: 18.2.0 + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + optional: true + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -15369,7 +29763,27 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg/5.2.0: + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + optional: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -15379,8 +29793,17 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream/2.3.7: - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + /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: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -15389,42 +29812,103 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream/3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + /readable-stream@3.6.1: + resolution: {integrity: sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==} engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp/2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} + /readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} dependencies: - graceful-fs: 4.2.10 - micromatch: 3.1.10 - readable-stream: 2.3.7 - transitivePeerDependencies: - - supports-color + readable-stream: 3.6.1 dev: true - optional: true - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /rechoir/0.7.1: + /reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + dev: false + + /recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + dependencies: + decimal.js-light: 2.5.1 + dev: false + + /recharts@2.7.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HMKRBkGoOXHW+7JcRa6+MukPSifNtJlqbc+JreGVNA407VLE/vOP+8n3YYjprDVVIF9E2ZgwWnL3D7K/LUFzBg==} + engines: {node: '>=12'} + peerDependencies: + prop-types: ^15.6.0 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + classnames: 2.3.2 + eventemitter3: 4.0.7 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 16.13.1 + react-resize-detector: 8.1.0(react-dom@18.2.0)(react@18.2.0) + react-smooth: 2.0.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + recharts-scale: 0.4.5 + reduce-css-calc: 2.1.8 + victory-vendor: 36.6.11 + dev: false + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.2 + + /rechoir@0.7.1: resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.0 + resolve: 1.22.2 + + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.2 + dev: false + + /recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + dependencies: + minimatch: 3.1.2 + dev: false + + /recursive-watch@1.1.4: + resolution: {integrity: sha512-fWejAmdLi7B/jipBUjTLnqId+PK+573fbGNbdaNA/AiAnQAx6OYOLCGWRs0W5+PyM1rLzZSWK2f40QpHSR49PQ==} + hasBin: true + dependencies: + ttl: 1.3.1 + + /redent@1.0.0: + resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + indent-string: 2.1.0 + strip-indent: 1.0.1 dev: true + optional: true - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -15432,63 +29916,85 @@ packages: strip-indent: 3.0.0 dev: true - /reduce-css-calc/2.1.8: + /redis-commands@1.7.0: + resolution: {integrity: sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==} + + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + + /redlock@4.2.0: + resolution: {integrity: sha512-j+oQlG+dOwcetUt2WJWttu4CZVeRzUrcVcISFmEmfyuwCVSJ93rDT7YSgg7H7rnxwoRyk/jU46kycVka5tW7jA==} + engines: {node: '>=8.0.0'} + dependencies: + bluebird: 3.7.2 + + /reduce-css-calc@2.1.8: resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==} dependencies: css-unit-converter: 1.1.2 postcss-value-parser: 3.3.1 dev: false - /redux-thunk/2.4.1_redux@4.2.0: + /redux-thunk@2.4.1(redux@4.2.1): resolution: {integrity: sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==} peerDependencies: - redux: ^4 + redux: 4.2.1 dependencies: - redux: 4.2.0 + redux: 4.2.1 dev: false - /redux/4.2.0: - resolution: {integrity: sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==} + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 + dev: false + + /reflect-metadata@0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + dev: false - /refractor/3.6.0: + /refractor@3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} dependencies: hastscript: 6.0.0 parse-entities: 2.0.0 prismjs: 1.27.0 - dev: true + dev: false - /regenerate-unicode-properties/10.0.1: - resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} + /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: + /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true - /regenerator-runtime/0.10.5: + /regenerator-runtime@0.10.5: resolution: {integrity: sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==} - dev: false - /regenerator-runtime/0.11.1: + /regenerator-runtime@0.11.1: resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - dev: false - /regenerator-runtime/0.13.9: + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regenerator-runtime@0.13.9: resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} - /regenerator-transform/0.15.0: - resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==} + /regenerator-transform@0.15.1: + resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: - '@babel/runtime': 7.17.9 - dev: true + '@babel/runtime': 7.21.0 - /regex-not/1.0.2: + /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} dependencies: @@ -15496,48 +30002,144 @@ packages: safe-regex: 1.1.0 dev: true - /regexp.prototype.flags/1.4.3: + /regexp-clone@1.0.0: + resolution: {integrity: sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==} + + /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.1.4 + define-properties: 1.2.0 functions-have-names: 1.2.3 - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} - dev: true - /regexpu-core/5.0.1: - resolution: {integrity: sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==} + /regexpu-core@5.3.1: + resolution: {integrity: sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==} engines: {node: '>=4'} dependencies: + '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.0.1 - regjsgen: 0.6.0 - regjsparser: 0.8.4 + regenerate-unicode-properties: 10.1.0 + regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + + /registry-auth-token@4.2.2: + resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} + engines: {node: '>=6.0.0'} + dependencies: + rc: 1.2.8 + + /registry-auth-token@5.0.1: + resolution: {integrity: sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 1.0.5 dev: true - /regjsgen/0.6.0: - resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==} + /registry-url@5.1.0: + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} + engines: {node: '>=8'} + dependencies: + rc: 1.2.8 + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 dev: true - /regjsparser/0.8.4: - resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==} + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 - dev: true - /relateurl/0.2.7: + /rehype-raw@6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + dependencies: + '@types/hast': 2.3.4 + hast-util-raw: 7.2.3 + unified: 10.1.2 + dev: false + + /rehype-sanitize@5.0.1: + resolution: {integrity: sha512-da/jIOjq8eYt/1r9GN6GwxIR3gde7OZ+WV8pheu1tL8K0D9KxM2AyMh+UEfke+FfdM3PvGHeYJU0Td5OWa7L5A==} + dependencies: + '@types/hast': 2.3.4 + hast-util-sanitize: 4.1.0 + unified: 10.1.2 + dev: false + + /rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + dev: false + + /rehype-stringify@9.0.3: + resolution: {integrity: sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==} + dependencies: + '@types/hast': 2.3.4 + hast-util-to-html: 8.0.4 + unified: 10.1.2 + dev: false + + /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} + + /release-it@15.6.0: + resolution: {integrity: sha512-NXewgzO8QV1LOFjn2K7/dgE1Y1cG+2JiLOU/x9X/Lq9UdFn2hTH1r9SSrufCxG+y/Rp+oN8liYTsNptKrj92kg==} + engines: {node: '>=14.9'} + hasBin: true + dependencies: + '@iarna/toml': 2.2.5 + '@octokit/rest': 19.0.5 + async-retry: 1.3.3 + chalk: 5.1.2 + cosmiconfig: 8.0.0 + execa: 6.1.0 + git-url-parse: 13.1.0 + globby: 13.1.2 + got: 11.8.3 + inquirer: 9.1.4 + is-ci: 3.0.1 + lodash: 4.17.21 + mime-types: 2.1.35 + new-github-release-url: 2.0.0 + node-fetch: 3.3.0 + open: 8.4.0 + ora: 6.1.2 + os-name: 5.0.1 + promise.allsettled: 1.0.6 + proxy-agent: 5.0.0 + semver: 7.3.8 + shelljs: 0.8.5 + update-notifier: 6.0.2 + url-join: 5.0.0 + wildcard-match: 5.1.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /remark-external-links/8.0.0: + /remark-emoji@2.2.0: + resolution: {integrity: sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==} + dependencies: + emoticon: 3.2.0 + node-emoji: 1.11.0 + unist-util-visit: 2.0.3 + dev: false + + /remark-external-links@8.0.0: resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} dependencies: extend: 3.0.2 @@ -15547,26 +30149,45 @@ packages: unist-util-visit: 2.0.3 dev: true - /remark-footnotes/2.0.0: + /remark-footnotes@2.0.0: resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} - dev: true - /remark-mdx/1.6.22: + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-mdx@1.6.22: resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} dependencies: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.10.4 - '@babel/plugin-proposal-object-rest-spread': 7.12.1_@babel+core@7.12.9 - '@babel/plugin-syntax-jsx': 7.12.1_@babel+core@7.12.9 + '@babel/plugin-proposal-object-rest-spread': 7.12.1(@babel/core@7.12.9) + '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) '@mdx-js/util': 1.6.22 is-alphabetical: 1.0.4 remark-parse: 8.0.3 unified: 9.2.0 transitivePeerDependencies: - supports-color - dev: true - /remark-parse/8.0.3: + /remark-parse@10.0.1: + resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} + dependencies: + '@types/mdast': 3.0.11 + mdast-util-from-markdown: 1.3.0 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@8.0.3: resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==} dependencies: ccount: 1.1.0 @@ -15585,41 +30206,123 @@ packages: unist-util-remove-position: 2.0.1 vfile-location: 3.2.0 xtend: 4.0.2 - dev: true - - /remark-parse/9.0.0: - resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} - dependencies: - mdast-util-from-markdown: 0.8.5 - transitivePeerDependencies: - - supports-color - dev: false - /remark-rehype/8.1.0: - resolution: {integrity: sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==} + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: - mdast-util-to-hast: 10.2.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.11 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 dev: false - /remark-slug/6.1.0: + /remark-slug@6.1.0: resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} dependencies: - github-slugger: 1.4.0 + github-slugger: 1.5.0 mdast-util-to-string: 1.1.0 unist-util-visit: 2.0.3 dev: true - /remark-squeeze-paragraphs/4.0.0: + /remark-squeeze-paragraphs@4.0.0: resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==} dependencies: mdast-squeeze-paragraphs: 4.0.0 - dev: true - /remove-accents/0.4.2: + /remirror@2.0.9(@remirror/pm@2.0.0)(@types/node@18.11.9)(prettier@2.8.4)(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2): + resolution: {integrity: sha512-Vr4M9ZyPbkxR3ddhhmV0T/rgIzMhbygxHFANfLuvzaRf0iOeBWJSNkoipd1xU/496MPmkwKUqVy9EsoSEwQXdg==} + peerDependencies: + '@remirror/pm': ^2.0.0 + '@types/prettier': ^2.1.5 + prettier: ^2.2.0 + peerDependenciesMeta: + '@types/prettier': + optional: true + prettier: + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@remirror/core': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/core-constants': 2.0.0 + '@remirror/core-helpers': 2.0.0 + '@remirror/core-types': 2.0.0(@remirror/pm@2.0.0) + '@remirror/core-utils': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/dom': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-annotation': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-bidi': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-blockquote': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-bold': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-callout': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-code': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-code-block': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(prettier@2.8.4) + '@remirror/extension-codemirror5': 2.0.5(@remirror/pm@2.0.0)(@types/codemirror@5.60.5)(@types/node@18.11.9)(codemirror@5.65.9) + '@remirror/extension-collaboration': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-columns': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-diff': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-doc': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-drop-cursor': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-embed': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-emoji': 2.0.8(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-entity-reference': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-epic-mode': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-events': 2.1.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-font-family': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-font-size': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-gap-cursor': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-hard-break': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-heading': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-history': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-horizontal-rule': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-image': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-italic': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-link': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-list': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-markdown': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-mention': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-mention-atom': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-node-formatting': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-paragraph': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-placeholder': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-positioner': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-search': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-shortcuts': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-strike': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-sub': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-sup': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-tables': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text-case': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text-color': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-text-highlight': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-trailing-node': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-underline': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-whitespace': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/extension-yjs': 3.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9)(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2)(yjs@13.5.41) + '@remirror/icons': 2.0.0 + '@remirror/pm': 2.0.0 + '@remirror/preset-core': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/preset-formatting': 2.0.5(@remirror/pm@2.0.0)(@types/node@18.11.9) + '@remirror/preset-wysiwyg': 2.0.6(@remirror/pm@2.0.0)(@types/node@18.11.9)(prettier@2.8.4) + '@remirror/theme': 2.0.0(@remirror/pm@2.0.0) + '@types/codemirror': 5.60.5 + '@types/refractor': 3.0.2 + codemirror: 5.65.9 + prettier: 2.8.4 + refractor: 3.6.0 + yjs: 13.5.41 + transitivePeerDependencies: + - '@types/node' + - jsdom + - prosemirror-model + - prosemirror-state + - prosemirror-view + dev: false + + /remove-accents@0.4.2: resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} dev: false - /remove-bom-buffer/3.0.0: + /remove-bom-buffer@3.0.0: resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} engines: {node: '>=0.10.0'} dependencies: @@ -15627,7 +30330,7 @@ packages: is-utf8: 0.2.1 dev: true - /remove-bom-stream/1.2.0: + /remove-bom-stream@1.2.0: resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} engines: {node: '>= 0.10'} dependencies: @@ -15636,11 +30339,11 @@ packages: through2: 2.0.5 dev: true - /remove-trailing-separator/1.1.0: + /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: true - /renderkid/2.0.7: + /renderkid@2.0.7: resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} dependencies: css-select: 4.3.0 @@ -15650,7 +30353,7 @@ packages: strip-ansi: 3.0.1 dev: true - /renderkid/3.0.0: + /renderkid@3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} dependencies: css-select: 4.3.0 @@ -15658,170 +30361,233 @@ packages: htmlparser2: 6.1.0 lodash: 4.17.21 strip-ansi: 6.0.1 - dev: true - /repeat-element/1.1.4: + /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: + /repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} + + /repeating@2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + is-finite: 1.1.0 dev: true + optional: true - /replace-ext/1.0.1: + /replace-ext@1.0.1: resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} engines: {node: '>= 0.10'} dev: true - /require-directory/2.1.1: + /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.11.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'} - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + + /require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + dev: false + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true - /requires-port/1.0.0: + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - /reselect/4.1.5: - resolution: {integrity: sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ==} + /reselect@4.1.6: + resolution: {integrity: sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ==} dev: false - /resize-observer-polyfill/1.5.1: + /resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} dev: false - /resolve-cwd/3.0.0: + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 - dev: true - /resolve-from/3.0.0: + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: false + + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} - dev: false - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - dev: true - /resolve-global/1.0.0: + /resolve-global@1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} engines: {node: '>=8'} dependencies: global-dirs: 0.1.1 dev: true - /resolve-options/1.1.0: + /resolve-options@1.1.0: resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} engines: {node: '>= 0.10'} dependencies: value-or-function: 3.0.0 dev: true - /resolve-pathname/3.0.0: + /resolve-pathname@3.0.0: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} dev: false - /resolve-url/0.2.1: + /resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: true - /resolve.exports/1.1.0: - resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} engines: {node: '>=10'} dev: true - /resolve/1.22.0: - resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve/2.0.0-next.3: - resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.11.0 path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor/2.0.0: + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + + /restore-cursor@2.0.0: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} dependencies: onetime: 2.0.1 - signal-exit: 3.0.6 - dev: false + signal-exit: 3.0.7 - /restore-cursor/3.1.0: + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: onetime: 5.1.2 - signal-exit: 3.0.6 + signal-exit: 3.0.7 + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 - /ret/0.1.15: + /ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} dev: true - /retry/0.13.1: + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + + /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - /rfdc/1.3.0: + /rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true - /rgb-regex/1.0.1: + /rgb-regex@1.0.1: resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==} - dev: false - /rgba-regex/1.0.0: + /rgba-regex@1.0.0: resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} - dev: false - /rimraf/2.7.1: + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: - glob: 7.2.0 + glob: 7.2.3 dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.2.0 - - /ripemd160/2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - dev: true + glob: 7.2.3 - /rollup-plugin-copy/3.4.0: + /rollup-plugin-copy@3.4.0: resolution: {integrity: sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==} engines: {node: '>=8.3'} dependencies: @@ -15832,25 +30598,51 @@ packages: is-plain-object: 3.0.1 dev: true - /rollup-plugin-esbuild/4.9.1_5xlwrs4uhpklszmwg2enemva4u: - resolution: {integrity: sha512-qn/x7Wz9p3Xnva99qcb+nopH0d2VJwVnsxJTGEg+Sh2Z3tqQl33MhOwzekVo1YTKgv+yAmosjcBRJygMfGrtLw==} + /rollup-plugin-esbuild@4.10.3(esbuild@0.12.29)(rollup@2.79.1): + resolution: {integrity: sha512-RILwUCgnCL5vo8vyZ/ZpwcqRuE5KmLizEv6BujBQfgXFZ6ggcS0FiYvQN+gsTJfWCMaU37l0Fosh4eEufyO97Q==} engines: {node: '>=12'} peerDependencies: esbuild: '>=0.10.1' rollup: ^1.20.0 || ^2.0.0 dependencies: '@rollup/pluginutils': 4.2.1 - debug: 4.3.3 + debug: 4.3.4(supports-color@9.2.2) es-module-lexer: 0.9.3 esbuild: 0.12.29 joycon: 3.1.1 - jsonc-parser: 3.0.0 - rollup: 2.72.1 + jsonc-parser: 3.2.0 + rollup: 2.79.1 transitivePeerDependencies: - supports-color - dev: false - /rollup-plugin-replace/2.2.0: + /rollup-plugin-inject-process-env@1.3.1: + resolution: {integrity: sha512-kKDoL30IZr0wxbNVJjq+OS92RJSKRbKV6B5eNW4q3mZTFqoWDh6lHy+mPDYuuGuERFNKXkG+AKxvYqC9+DRpKQ==} + dependencies: + magic-string: 0.25.9 + dev: true + + /rollup-plugin-less@1.1.3: + resolution: {integrity: sha512-gvJFXpEeU5Opyz514ZO4JGj9kvFTChZEDMR3LSkSIyFfWaeE5NJMFzxPpo+MZK3CY/0j7+AotDeRofyQt9rTew==} + dependencies: + babel-runtime: 6.26.0 + fs-extra: 0.30.0 + growl: 1.10.5 + less: 3.13.1 + mkdirp: 0.5.6 + rollup: 0.34.13 + rollup-pluginutils: 1.5.2 + dev: true + + /rollup-plugin-polyfill-node@0.9.0(rollup@2.78.1): + resolution: {integrity: sha512-cVqm7LjgBqtZ77M9hLYayXrLz18nLIVPp3MPqNi2suStrFDg1LsA2cSdMIighr2yeuAQrphu8ymXTAsJNVABow==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/plugin-inject': 4.0.4(rollup@2.78.1) + rollup: 2.78.1 + dev: true + + /rollup-plugin-replace@2.2.0: resolution: {integrity: sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==} deprecated: This module has moved and is now available at @rollup/plugin-replace. Please update your dependencies. This version is no longer maintained. dependencies: @@ -15858,7 +30650,15 @@ packages: rollup-pluginutils: 2.8.2 dev: true - /rollup-plugin-styles/3.14.1_rollup@2.72.1: + /rollup-plugin-source-ref@1.0.7: + resolution: {integrity: sha512-zzr1AAZJ7311jIcwg4Y5AYcG5O+aQHeiPhTRyG/qSAEQ+XZzMsaetUovAcokOKXi1iyzRu2MAi89mic6cvfv+g==} + dependencies: + source-ref-core: 1.0.7 + transitivePeerDependencies: + - supports-color + dev: true + + /rollup-plugin-styles@3.14.1(rollup@2.79.1): resolution: {integrity: sha512-0JodP26O3WZ8320X3sBn5S2SOPv9Al2tLyOmLco+H2UqLjbmycM9KWGypLjcDuIEWwa0oLYiXpViMmO2yyeqIA==} engines: {node: '>=10'} peerDependencies: @@ -15866,109 +30666,195 @@ packages: dependencies: '@rollup/pluginutils': 4.2.1 '@types/cssnano': 4.0.1 - cosmiconfig: 7.0.1 + cosmiconfig: 7.1.0 cssnano: 4.1.11 fs-extra: 9.1.0 - icss-utils: 5.1.0_postcss@8.4.13 + icss-utils: 5.1.0(postcss@8.4.21) mime-types: 2.1.35 p-queue: 6.6.2 - postcss: 8.4.13 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.13 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.13 - postcss-modules-scope: 3.0.0_postcss@8.4.13 - postcss-modules-values: 4.0.0_postcss@8.4.13 + postcss: 8.4.21 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.21) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.21) + postcss-modules-scope: 3.0.0(postcss@8.4.21) + postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 query-string: 6.14.1 - resolve: 1.22.0 - rollup: 2.72.1 - source-map: 0.7.3 - tslib: 2.4.0 - dev: false + resolve: 1.22.1 + rollup: 2.79.1 + source-map: 0.7.4 + tslib: 2.5.0 - /rollup-plugin-terser/7.0.2_rollup@2.72.1: + /rollup-plugin-terser@7.0.2(rollup@2.79.1): resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: rollup: ^2.0.0 dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.18.6 jest-worker: 26.6.2 - rollup: 2.72.1 + rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.13.1 + terser: 5.16.5 + dev: true + + /rollup-pluginutils@1.5.2: + resolution: {integrity: sha512-SjdWWWO/CUoMpDy8RUbZ/pSpG68YHmhk5ROKNIoi2En9bJ8bTt3IhYi254RWiTclQmL7Awmrq+rZFOhZkJAHmQ==} + dependencies: + estree-walker: 0.2.1 + minimatch: 3.1.2 dev: true - /rollup-pluginutils/2.8.2: + /rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} dependencies: estree-walker: 0.6.1 dev: true - /rollup/2.72.1: - resolution: {integrity: sha512-NTc5UGy/NWFGpSqF1lFY8z9Adri6uhyMLI6LvPAXdBKoPRFhIIiBUpt+Qg2awixqO3xvzSijjhnb4+QEZwJmxA==} + /rollup@0.34.13: + resolution: {integrity: sha512-DlmYghq9ozqhrGHEEUoPXpDq9isXuejioj4toBiMXEpp7K8jlsaURcC2iMFa/J6E81vWuq5cYYafStcOgyFDUg==} + hasBin: true + dependencies: + source-map-support: 0.4.18 + dev: true + + /rollup@2.78.1: + resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 + dev: true - /rollup/2.75.0: - resolution: {integrity: sha512-1/wxtweHJ7YwI2AIK3ZgCBU3nbW8sLnBIFwN46cwOTnVzt8f1o6J8zPKjwoiuADvzSjmnLqJce31p0q2vQ+dqw==} + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true - /rsvp/4.8.5: + /rollup@3.20.7: + resolution: {integrity: sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + + /rope-sequence@1.3.3: + resolution: {integrity: sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==} + dev: false + + /round-precision@1.0.0: + resolution: {integrity: sha512-L2a0XDSNeaaBTEGmzuENMK4T8c0HqKYeS3pCDurW4MRPo8O6LeCLqVPWUt5+xW9rrEcG9QaYrAFcApEFXKziyw==} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.0.2 + is-integer: 1.0.7 + dev: false + + /round@2.0.1: + resolution: {integrity: sha512-wzT6PF3wNEd2PCLTBQxteheeSwViBrD89E1XZjl4sj505C4LwTpqOQSNXLEROHDQw35NoylYbMxoUhgf2hb4qw==} + dependencies: + precision: 1.0.1 + round-precision: 1.0.0 + dev: false + + /rrweb-snapshot@1.1.14: + resolution: {integrity: sha512-eP5pirNjP5+GewQfcOQY4uBiDnpqxNRc65yKPW0eSoU1XamDfc4M8oqpXGMyUyvLyxFDB0q0+DChuxxiU2FXBQ==} + dev: false + + /rsvp@4.8.5: resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} engines: {node: 6.* || >= 7.*} dev: true - /run-async/2.4.1: + /rtl-css-js@1.16.0: + resolution: {integrity: sha512-Oc7PnzwIEU4M0K1J4h/7qUUaljXhQ0kCObRsZjxs2HjkpKsnoTMvSmvJ4sqgJZd0zBoEfAyTdnK/jMIYvrjySQ==} + dependencies: + '@babel/runtime': 7.21.0 + dev: false + + /rtl-detect@1.0.4: + resolution: {integrity: sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==} + dev: false + + /rtlcss@3.5.0: + resolution: {integrity: sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==} + hasBin: true + dependencies: + find-up: 5.0.0 + picocolors: 1.0.0 + postcss: 8.4.27 + strip-json-comments: 3.1.1 + dev: false + + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - dev: false - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - /run-queue/1.0.3: - resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} - dependencies: - aproba: 1.2.0 - dev: true - - /rx/4.1.0: + /rx@4.1.0: resolution: {integrity: sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==} dev: false - /rxjs/7.5.5: - resolution: {integrity: sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==} + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} dependencies: - tslib: 2.4.0 + tslib: 1.14.1 + + /rxjs@7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} + dependencies: + tslib: 2.5.0 + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /safari-14-idb-fix@1.0.6: + resolution: {integrity: sha512-oTEQOdMwRX+uCtWCKT1nx2gAeSdpr8elg/2gcaKUH00SJU2xWESfkx11nmXwTRHy7xfQoj1o4TTQvdmuBosTnA==} + dev: false - /safe-buffer/5.1.1: + /safe-buffer@5.1.1: resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} dev: true - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex/1.1.0: + /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 + + /safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sane/4.1.0: + /sakana-widget@2.6.0: + resolution: {integrity: sha512-uYG7loibwAB6bwNUy4VvYt0jREy4cUIEA/vdQJa27HgySHtN1bmEjHfQu3CVeohinxsSTRcuqJvPew+SaG2p6w==} + dependencies: + '@juggle/resize-observer': 3.4.0 + dev: false + + /sane@4.1.0: resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} engines: {node: 6.* || 8.* || >= 10.*} deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added @@ -15979,132 +30865,171 @@ packages: capture-exit: 2.0.0 exec-sh: 0.3.6 execa: 1.0.0 - fb-watchman: 2.0.1 + fb-watchman: 2.0.2 micromatch: 3.1.10 - minimist: 1.2.6 + minimist: 1.2.8 walker: 1.0.8 transitivePeerDependencies: - supports-color dev: true - /sax/1.2.4: + /saslprep@1.0.3: + resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + sparse-bitfield: 3.0.3 + optional: true + + /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - /saxes/5.0.1: + /saxes@5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} dependencies: xmlchars: 2.2.0 dev: true - /scheduler/0.20.2: + /scheduler@0.20.2: resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - /schema-utils/1.0.0: - resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} - engines: {node: '>= 4'} + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 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 + loose-envify: 1.4.0 - /schema-utils/2.7.0: + /schema-utils@2.7.0: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} 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 + ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils/2.7.1: + /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 + ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils/3.1.1: + /schema-utils@3.1.1: resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: true + ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils/4.0.0: + /schema-utils@4.0.0: resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==} engines: {node: '>= 12.13.0'} dependencies: '@types/json-schema': 7.0.11 - ajv: 8.11.0 - ajv-formats: 2.1.1 - ajv-keywords: 5.1.0_ajv@8.11.0 - dev: true + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + + /screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: false - /script_sanitize/1.2.6: - resolution: {integrity: sha512-CA53o9tyResT5Sq8HT4w6jcmHoYtfbBxRKvaBQc0Iw0kS4+c9MDNwl1ReUcFjbb/GFm8YjB7diTJE10MWOnHNQ==} + /scroll-into-view-if-needed@2.2.20: + resolution: {integrity: sha512-P9kYMrhi9f6dvWwTGpO5I3HgjSU/8Mts7xL3lkoH5xlewK7O9Obdc5WmMCzppln7bCVGNmf3qfoZXrpCeyNJXw==} + dependencies: + compute-scroll-into-view: 1.0.11 dev: false - /scroll-into-view-if-needed/2.2.29: - resolution: {integrity: sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==} + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} dependencies: - compute-scroll-into-view: 1.0.17 + compute-scroll-into-view: 1.0.20 dev: false - /select-hose/2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + /sdp-transform@2.14.1: + resolution: {integrity: sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw==} + hasBin: true + dev: false + + /sdp@3.2.0: + resolution: {integrity: sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==} + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + /seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + dependencies: + commander: 2.20.3 dev: true - /selfsigned/2.0.1: - resolution: {integrity: sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==} + /select-files@1.0.1: + resolution: {integrity: sha512-8h4DSpjfFa0hyMP3z3ye4SxyhdaE5RgaXeScRpH7xl4YblnZSHwexmLdLNdSKwTO8H9ccDKj7Votz0io+18+BQ==} + dev: false + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + /selfsigned@2.1.1: + resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} engines: {node: '>=10'} dependencies: node-forge: 1.3.1 - dev: true - /semver-compare/1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + /semver-diff@3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + + /semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + dependencies: + semver: 7.5.4 dev: true - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true - dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - /semver/7.0.0: + /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true - /semver/7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 dev: true - /semver/7.3.7: - resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 - dev: true - /send/0.18.0: + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: @@ -16123,35 +31048,44 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - /serialize-javascript/4.0.0: + /sentence-case@2.1.1: + resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + dependencies: + no-case: 2.3.2 + upper-case-first: 1.1.2 + dev: false + + /sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.0 + upper-case-first: 2.0.2 + dev: false + + /serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} dependencies: randombytes: 2.1.0 dev: true - /serialize-javascript/5.0.1: + /serialize-javascript@5.0.1: resolution: {integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==} dependencies: randombytes: 2.1.0 dev: true - /serialize-javascript/6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 - dev: true - /serialize-query-params/1.3.6_query-string@7.1.1: - resolution: {integrity: sha512-VlH7sfWNyPVZClPkRacopn6sn5uQMXBsjPVz1+pBHX895VpcYVznfJtZ49e6jymcrz+l/vowkepCZn/7xEAEdw==} - peerDependencies: - query-string: '>=5.1.1' - dependencies: - query-string: 7.1.1 + /serialize-query-params@2.0.2: + resolution: {integrity: sha512-1chMo1dST4pFA9RDXAtF0Rbjaut4is7bzFbI1Z26IuMub68pNCILku85aYmeFhvnY//BXUPUhoRMjYcsT93J/Q==} dev: true - /serve-favicon/2.5.0: + /serve-favicon@2.5.0: resolution: {integrity: sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==} engines: {node: '>= 0.8.0'} dependencies: @@ -16162,7 +31096,20 @@ packages: safe-buffer: 5.1.1 dev: true - /serve-index/1.9.1: + /serve-handler@6.1.5: + resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + fast-url-parser: 1.1.3 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 2.2.1 + range-parser: 1.2.0 + dev: false + + /serve-index@1.9.1: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} dependencies: @@ -16175,9 +31122,8 @@ packages: parseurl: 1.3.3 transitivePeerDependencies: - supports-color - dev: true - /serve-static/1.15.0: + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: @@ -16187,13 +31133,17 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: true - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-value/2.0.1: + /set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + dev: false + + /set-value@2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} dependencies: @@ -16203,131 +31153,211 @@ packages: split-string: 3.1.0 dev: true - /setimmediate/1.0.5: + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: true + dev: false - /setprototypeof/1.1.0: + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true - /setprototypeof/1.2.0: + /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-clone/3.0.1: + /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} dependencies: kind-of: 6.0.3 - dev: true - /shallowequal/1.1.0: + /shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - /shebang-command/1.2.0: + /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: + /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: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: true - /shepherd.js/8.3.1: - resolution: {integrity: sha512-IhxZNhnK2m/pNTXudNfYrcwvcZNWkeYngQbQee8nC3xJ2GjeIatGqivhdZAMZ+LeogZvKMakB931d/V534uhrw==} - engines: {node: 10.* || >= 12} + /shell-quote@1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true dependencies: - '@popperjs/core': 2.11.5 - deepmerge: 4.2.2 - smoothscroll-polyfill: 0.4.4 + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + /shepherd.js@11.1.1: + resolution: {integrity: sha512-7nVEgLTZUu5qQCKTlzQeKL1AQd2rG9Y9iqzZUgGvCFwMUZZhfwtZ6eEyMWMYw0zl8qKjSrjgzxFOe+SpfO43aA==} + engines: {node: 16.* || >= 18} + dependencies: + '@floating-ui/dom': 1.4.5 + deepmerge: 4.3.1 dev: false - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.1 - object-inspect: 1.12.0 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + + /sift@13.5.2: + resolution: {integrity: sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==} + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /signal-exit/3.0.6: - resolution: {integrity: sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==} + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + dev: false + + /simple-git@3.16.1: + resolution: {integrity: sha512-xzRxMKiy1zEYeHGXgAzvuXffDS0xgsq07Oi4LWEEcVH29vLpcZ2tyQRWyK0NLLlCVaKysZeem5tC1qHEOxsKwA==} + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color + dev: true - /simple-swizzle/0.2.2: + /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 - dev: false - /sirv/1.0.19: + /simple-update-notifier@1.0.7: + resolution: {integrity: sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /sirv@1.0.19: resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} engines: {node: '>= 10'} dependencies: '@polka/url': 1.0.0-next.21 - mrmime: 1.0.0 + mrmime: 1.0.1 totalist: 1.1.0 - dev: true - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - /slash/2.0.0: + /sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + dependencies: + '@types/node': 18.11.9 + '@types/sax': 1.2.4 + arg: 5.0.2 + sax: 1.2.4 + dev: false + + /slash@2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} engines: {node: '>=6'} dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true - /slice-ansi/3.0.0: + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - dev: true - /slice-ansi/4.0.0: + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /sliced@1.0.1: + resolution: {integrity: sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==} + + /slide@1.1.6: + resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==} + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /smee-client@1.2.3: + resolution: {integrity: sha512-uDrU8u9/Ln7aRXyzGHgVaNUS8onHZZeSwQjCdkMoSL7U85xI+l+Y2NgjibkMJAyXkW7IAbb8rw9RMHIjS6lAwA==} + hasBin: true + dependencies: + commander: 2.20.3 + eventsource: 1.1.2 + morgan: 1.10.0 + superagent: 7.1.5 + validator: 13.7.0 + transitivePeerDependencies: + - supports-color dev: true - /smoothscroll-polyfill/0.4.4: - resolution: {integrity: sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==} + /snake-case@2.1.0: + resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} + dependencies: + no-case: 2.3.2 + dev: false + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.5.0 dev: false - /snapdragon-node/2.1.1: + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} dependencies: @@ -16336,14 +31366,14 @@ packages: snapdragon-util: 3.0.1 dev: true - /snapdragon-util/3.0.1: + /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: + /snapdragon@0.8.2: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} dependencies: @@ -16359,214 +31389,472 @@ packages: - supports-color dev: true - /socket.io-client/4.4.0: - resolution: {integrity: sha512-g7riSEJXi7qCFImPow98oT8X++MSsHz6MMFRXkWNJ6uEROSHOa3kxdrsYWMq85dO+09CFMkcqlpjvbVXQl4z6g==} + /socket.io-adapter@2.5.2: + resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + dependencies: + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /socket.io-client@4.5.1: + resolution: {integrity: sha512-e6nLVgiRYatS+AHXnOnGi4ocOpubvOUCGhyWw8v+/FxW8saHkinG6Dfhi9TU0Kt/8mwJIAASxvw6eujQmjdZVA==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + engine.io-client: 6.2.2 + socket.io-parser: 4.2.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /socket.io-client@4.6.1: + resolution: {integrity: sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + engine.io-client: 6.4.0 + socket.io-parser: 4.2.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-client@4.6.2: + resolution: {integrity: sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + engine.io-client: 6.4.0 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-client@4.7.1: + resolution: {integrity: sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w==} engines: {node: '>=10.0.0'} dependencies: - '@socket.io/component-emitter': 3.0.0 - backo2: 1.0.2 - debug: 4.3.3 - engine.io-client: 6.1.1 - parseuri: 0.0.6 - socket.io-parser: 4.1.1 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + engine.io-client: 6.5.1 + socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: false - /socket.io-parser/4.1.1: - resolution: {integrity: sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA==} + /socket.io-msgpack-parser@3.0.2: + resolution: {integrity: sha512-1e76bJ1PCKi9H+JiYk+S29PBJvknHjQWM7Mtj0hjF2KxDA6b6rQxv3rTsnwBoz/haZOhlCDIMQvPATbqYeuMxg==} + dependencies: + component-emitter: 1.3.0 + notepack.io: 2.2.0 + dev: false + + /socket.io-parser@4.2.1: + resolution: {integrity: sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color + + /socket.io-parser@4.2.2: + resolution: {integrity: sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} dependencies: - '@socket.io/component-emitter': 3.0.0 - debug: 4.3.3 + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4(supports-color@9.2.2) + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io@4.7.2: + resolution: {integrity: sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==} + engines: {node: '>=10.2.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.4(supports-color@9.2.2) + engine.io: 6.5.2 + socket.io-adapter: 2.5.2 + socket.io-parser: 4.2.4 transitivePeerDependencies: + - bufferutil - supports-color + - utf-8-validate dev: false - /sockjs/0.3.24: + /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 + + /socks-proxy-agent@5.0.1: + resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@9.2.2) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: true + + /sonic-boom@1.4.1: + resolution: {integrity: sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==} + dependencies: + atomic-sleep: 1.0.0 + flatstr: 1.0.12 + dev: false + + /sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /sort-css-media-queries@2.1.0: + resolution: {integrity: sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==} + engines: {node: '>= 6.3.0'} + dev: false + + /sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + dependencies: + sort-keys: 1.1.2 + 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 - /sortobject/4.16.0: + /sortobject@4.16.0: resolution: {integrity: sha512-jdcWhqJjxyYxRcXa30qImF3PZea1GpNwdKxUac28T28+GodptH4XihPuRlgCY0hITIEQVnw8DtQ81Fb6fomBaw==} engines: {node: '>=10'} dev: true - /source-list-map/2.0.1: + /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true - /source-map-js/1.0.2: + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map-resolve/0.5.3: + /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.0 + 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-resolve/0.6.0: - resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated + /source-map-support@0.4.18: + resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.0 + source-map: 0.5.7 dev: true - /source-map-support/0.5.21: + /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: + /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: + /source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} - dev: true - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - /source-map/0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - /source-map/0.8.0-beta.0: + /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 dev: true - /sourcemap-codec/1.4.8: + /source-ref-core@1.0.7: + resolution: {integrity: sha512-mf4xriHN9Xeb8FP74672Y5CZV8AmN+qaeopeqPHd4PsZLUxgI4u+A6MwJn5MX7uQLoGXivGbWXE5z1FgiBb6yg==} + dependencies: + '@babel/generator': 7.21.1 + '@babel/parser': 7.21.2 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + /source-ref-loader@1.0.7: + resolution: {integrity: sha512-1PEIA9bJpYyUwWPEpdeCG8FN+qj6i0JeEe3UCOy6MqjJ1g5CKFzSQCCYtqbUSwyT5uS8bss7mE+Zq/WP9++buQ==} + dependencies: + source-ref-core: 1.0.7 + transitivePeerDependencies: + - supports-color + dev: true + + /source-ref-runtime@1.0.7: + resolution: {integrity: sha512-q40Yt6mPf3kiaMubg25zcycd0I3hhZx9kULWF4OVCQLDUX7uL8t5rYgpHehUo1ig+K6WoKNKUf2N/ibE2le2lA==} + dev: false + + /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead - /space-separated-tokens/1.1.5: + /space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - /spdx-correct/3.1.1: + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + requiresBuild: true + dependencies: + memory-pager: 1.5.0 + optional: true + + /spawn-command@0.0.2-1: + resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} + dev: true + + /spdx-correct@3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.11 + spdx-license-ids: 3.0.12 dev: true - /spdx-exceptions/2.3.0: + /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.11 + spdx-license-ids: 3.0.12 dev: true - /spdx-license-ids/3.0.11: - resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + /spdx-license-ids@3.0.12: + resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} dev: true - /spdy-transport/3.0.0: + /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.3 + debug: 4.3.4(supports-color@9.2.2) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 - readable-stream: 3.6.0 + readable-stream: 3.6.1 wbuf: 1.7.3 transitivePeerDependencies: - supports-color - dev: true - /spdy/4.0.2: + /spdy@4.0.2: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.3 + debug: 4.3.4(supports-color@9.2.2) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 spdy-transport: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /split-on-first/1.1.0: + /spinnies@0.5.1: + resolution: {integrity: sha512-WpjSXv9NQz0nU3yCT9TFEOfpFrXADY9C5fG6eAJqixLhvTX1jP3w92Y8IE5oafIe42nlF9otjhllnXN/QCaB3A==} + dependencies: + chalk: 2.4.2 + cli-cursor: 3.1.0 + strip-ansi: 5.2.0 + dev: false + + /split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + dev: false + + /split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} - /split-string/3.1.0: + /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 - /split.js/1.6.5: + /split.js@1.6.5: resolution: {integrity: sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==} dev: false - /split2/3.2.2: + /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: - readable-stream: 3.6.0 + readable-stream: 3.6.1 + + /split2@4.1.0: + resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} + engines: {node: '>= 10.x'} + dev: false + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /ssri/6.0.2: - resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} + /ssh2@1.11.0: + resolution: {integrity: sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==} + engines: {node: '>=10.16.0'} + requiresBuild: true + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.4 + nan: 2.16.0 + dev: false + + /sshpk@1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true dependencies: - figgy-pudding: 3.5.2 + 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/8.0.1: + /ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} dependencies: - minipass: 3.1.6 + minipass: 3.3.6 dev: true - /stable/0.1.8: + /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' + + /stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + dependencies: + stackframe: 1.3.4 + dev: false - /stack-utils/2.0.5: + /stack-utils@2.0.5: resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: false + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /stackframe/1.2.1: - resolution: {integrity: sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==} + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + /stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + dependencies: + source-map: 0.5.6 + stackframe: 1.3.4 + dev: false + + /stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + dependencies: + error-stack-parser: 2.1.4 + stack-generator: 2.0.10 + stacktrace-gps: 3.1.2 + dev: false + + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + /stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} dev: true - /state-toggle/1.0.3: + /state-toggle@1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} - dev: true - /static-extend/0.1.2: + /static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: @@ -16574,70 +31862,49 @@ packages: object-copy: 0.1.0 dev: true - /statuses/1.5.0: + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - dev: true - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: true - - /std-env/3.1.1: - resolution: {integrity: sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw==} - dev: true - /store2/2.13.2: - resolution: {integrity: sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg==} - dev: true - - /str2int/1.1.0: - resolution: {integrity: sha512-Eb9eGdySBmA2cQyJaxsiB9a6IJ7t1RCQK6o3pUZf6dTI3CVq9TkMcUCVNoWeonv7mNza3Hcp3cf1j73vEhL4ag==} - dev: false + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - /stream-browserify/2.0.2: - resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} dependencies: - inherits: 2.0.4 - readable-stream: 2.3.7 + internal-slot: 1.0.5 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 + /store2@2.14.2: + resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} 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.7 - to-arraybuffer: 1.0.1 - xtend: 4.0.2 - dev: true + /str2int@1.1.0: + resolution: {integrity: sha512-Eb9eGdySBmA2cQyJaxsiB9a6IJ7t1RCQK6o3pUZf6dTI3CVq9TkMcUCVNoWeonv7mNza3Hcp3cf1j73vEhL4ag==} + dev: false - /stream-shift/1.0.1: + /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true - /strict-uri-encode/2.0.0: + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} - /string-argv/0.3.1: + /string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} - dev: true - /string-convert/0.2.1: + /string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} dev: false - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -16645,7 +31912,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/2.1.1: + /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} dependencies: @@ -16653,7 +31920,15 @@ packages: strip-ansi: 4.0.0 dev: false - /string-width/4.2.3: + /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 + + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -16661,221 +31936,439 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string.prototype.matchall/4.0.7: - resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 - get-intrinsic: 1.1.1 + define-properties: 1.2.0 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 has-symbols: 1.0.3 - internal-slot: 1.0.3 + internal-slot: 1.0.5 regexp.prototype.flags: 1.4.3 side-channel: 1.0.4 dev: true - /string.prototype.padend/3.1.3: + /string.prototype.padend@3.1.3: resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true - /string.prototype.padstart/3.1.3: + /string.prototype.padstart@3.1.3: resolution: {integrity: sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true - /string.prototype.trimend/1.0.5: - resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 - /string.prototype.trimstart/1.0.5: - resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: true - /string_decoder/1.1.1: + /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: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - /stringify-object/3.3.0: + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - dev: true - /strip-ansi/3.0.1: + /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 - /strip-ansi/4.0.0: + /strip-ansi@4.0.0: resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} engines: {node: '>=4'} dependencies: ansi-regex: 3.0.1 dev: false - /strip-ansi/6.0.1: + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-bom/3.0.0: + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + is-utf8: 0.2.1 + dev: true + optional: true + + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: true - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-comments/2.0.1: + /strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} dev: true - /strip-eof/1.0.0: + /strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + dependencies: + is-natural-number: 4.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: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@1.0.1: + resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dependencies: + get-stdin: 4.0.1 dev: true + optional: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + + /strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 dev: true - /style-loader/1.3.0_webpack@4.46.0: + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + + /strtok3@6.3.0: + resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} + engines: {node: '>=10'} + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 4.1.0 + dev: true + + /style-loader@1.3.0(webpack@5.75.0): resolution: {integrity: sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==} engines: {node: '>= 8.9.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 4.46.0 + webpack: 5.75.0(esbuild@0.15.18) dev: true - /style-loader/3.3.1_webpack@5.73.0: + /style-loader@3.3.1(webpack@5.75.0): resolution: {integrity: sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^5.0.0 + webpack: 5.75.0 dependencies: - webpack: 5.73.0_webpack-cli@4.9.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) dev: true - /style-to-js/1.1.0: - resolution: {integrity: sha512-1OqefPDxGrlMwcbfpsTVRyzwdhr4W0uxYQzeA2F1CBc8WG04udg2+ybRnvh3XYL4TdHQrCahLtax2jc8xaE6rA==} + /style-to-js@1.1.1: + resolution: {integrity: sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==} dependencies: style-to-object: 0.3.0 dev: false - /style-to-object/0.3.0: + /style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} dependencies: inline-style-parser: 0.1.1 - /stylehacks/4.0.3: + /style-to-object@0.4.1: + resolution: {integrity: sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /styled-components@5.3.10(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + dependencies: + '@babel/helper-module-imports': 7.18.6 + '@babel/traverse': 7.21.2(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.2.0 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.0.7(styled-components@5.3.10) + css-to-react-native: 3.0.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + shallowequal: 1.1.0 + supports-color: 5.5.0 + + /styled-components@5.3.6(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + dependencies: + '@babel/helper-module-imports': 7.18.6 + '@babel/traverse': 7.21.2(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.2.0 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.0.7(styled-components@5.3.6) + css-to-react-native: 3.0.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + shallowequal: 1.1.0 + supports-color: 5.5.0 + + /stylehacks@4.0.3: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.20.3 - postcss: 7.0.39 - postcss-selector-parser: 3.1.2 + browserslist: 4.21.5 + postcss: 7.0.39 + postcss-selector-parser: 3.1.2 + + /stylehacks@5.1.1(postcss@8.4.21): + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: false + + /stylehacks@5.1.1(postcss@8.4.27): + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.27 + postcss-selector-parser: 6.0.11 + + /stylis@4.0.13: + resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==} dev: false - /substyle/9.4.1_react@17.0.2: + /stylis@4.1.3: + resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} + dev: false + + /substyle@9.4.1(react@18.2.0): resolution: {integrity: sha512-VOngeq/W1/UkxiGzeqVvDbGDPM8XgUyJVWjrqeh+GgKqspEPiLYndK+XRcsKUHM5Muz/++1ctJ1QCF/OqRiKWA==} peerDependencies: react: '>=16.8.3' dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.21.0 invariant: 2.2.4 - react: 17.0.2 + react: 18.2.0 + dev: false + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.5 + ts-interface-checker: 0.1.13 dev: false - /superstruct/0.8.3: - resolution: {integrity: sha512-LbtbFpktW1FcwxVIJlxdk7bCyBq/GzOx2FSFLRLTUhWIA1gHkYPIl3aXRG5mBdGZtnPNT6t+4eEcLDCMOuBHww==} + /superagent@7.1.5: + resolution: {integrity: sha512-HQYyGuDRFGmZ6GNC4hq2f37KnsY9Lr0/R1marNZTgMweVDQLTLJJ6DGQ9Tj/xVVs5HEnop9EMmTbywb5P30aqw==} + engines: {node: '>=6.4.0 <13 || >=14'} dependencies: - kind-of: 6.0.3 - tiny-invariant: 1.2.0 + component-emitter: 1.3.0 + cookiejar: 2.1.3 + debug: 4.3.4(supports-color@9.2.2) + fast-safe-stringify: 2.1.1 + form-data: 4.0.0 + formidable: 2.0.1 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.11.1 + readable-stream: 3.6.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /superjson@1.12.2: + resolution: {integrity: sha512-ugvUo9/WmvWOjstornQhsN/sR9mnGtWGYeTxFuqLb4AiT4QdUavjGFRALCPKWWnAiUJ4HTpytj5e0t5HoMRkXg==} + engines: {node: '>=10'} + dependencies: + copy-anything: 3.0.3 + dev: false + + /superstruct@1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} + engines: {node: '>=14.0.0'} dev: true - /supports-color/2.0.0: + /supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} dev: false - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - dev: true - /supports-hyperlinks/2.2.0: - resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} + /supports-color@9.2.2: + resolution: {integrity: sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==} + engines: {node: '>=12'} + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 supports-color: 7.2.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svgo/1.3.2: + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: false + + /svgmoji@3.2.0: + resolution: {integrity: sha512-tjmdQhIju2ZQ81FLBlPngg1aWMOhQjP9ErXb2ROikM0aBGA/hqI0/DN/5J0sDsXzJPHmODpSFhWfiSsUieU3bA==} + dependencies: + '@babel/runtime': 7.21.0 + '@svgmoji/blob': 3.2.0 + '@svgmoji/core': 3.2.0 + '@svgmoji/noto': 3.2.0 + '@svgmoji/openmoji': 3.2.0 + '@svgmoji/twemoji': 3.2.0 + dev: false + + /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. @@ -16889,43 +32382,157 @@ packages: csso: 4.2.0 js-yaml: 3.14.1 mkdirp: 0.5.6 - object.values: 1.1.5 + object.values: 1.1.6 sax: 1.2.4 stable: 0.1.8 unquote: 1.1.1 util.promisify: 1.0.1 + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + + /swagger-jsdoc@6.2.8(openapi-types@12.1.0): + resolution: {integrity: sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + commander: 6.2.0 + doctrine: 3.0.0 + glob: 7.1.6 + lodash.mergewith: 4.6.2 + swagger-parser: 10.0.3(openapi-types@12.1.0) + yaml: 2.0.0-1 + transitivePeerDependencies: + - openapi-types + dev: true + + /swagger-parser@10.0.3(openapi-types@12.1.0): + resolution: {integrity: sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==} + engines: {node: '>=10'} + dependencies: + '@apidevtools/swagger-parser': 10.0.3(openapi-types@12.1.0) + transitivePeerDependencies: + - openapi-types + dev: true + + /swap-case@1.1.2: + resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + dependencies: + lower-case: 1.1.4 + upper-case: 1.1.3 dev: false - /symbol-tree/3.2.4: + /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /symbol.prototype.description/1.0.5: + /symbol.prototype.description@1.0.5: resolution: {integrity: sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==} engines: {node: '>= 0.11.15'} dependencies: call-bind: 1.0.2 get-symbol-description: 1.0.0 has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.3 + object.getownpropertydescriptors: 2.1.5 dev: true - /synchronous-promise/2.0.15: + /synchronous-promise@2.0.15: resolution: {integrity: sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==} dev: true - /table/6.8.0: + /table@6.8.0: resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==} engines: {node: '>=10.0.0'} dependencies: - ajv: 8.11.0 + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.12.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 dev: true - /tailwindcss/2.2.19_hqu7j45oxtlo2g5y3qitzppg3y: + /tailchat-meeting-sdk@1.2.4: + resolution: {integrity: sha512-HDPyk+tgHbRq9hvcNKCTIny2difo7xhdUlmSMY2KPvdNGeZxMDT7jICHSGDIQEInhTgafl9yfbBv2EUE6gqR3A==} + dependencies: + bowser: 2.11.0 + debug: 4.3.4(supports-color@9.2.2) + eventemitter-strict: 1.0.1 + hark: 1.2.3 + lodash: 4.17.21 + mediasoup-client: 3.6.57 + socket.io-client: 4.7.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /tailchat-server-sdk@0.0.12: + resolution: {integrity: sha512-v+Bkdj+W3sEA6jUV8WoEbP6nJa/pYkLyL7C2hXKCAZn95HvwKKdmrTUpbRWJ2adHQO+wvnqo4MDTOPjlAfMLzQ==} + dependencies: + '@typegoose/typegoose': 9.3.1(mongoose@6.1.1) + accept-language: 3.0.18 + crc: 3.8.0 + dotenv: 10.0.0 + fastest-validator: 1.13.0 + i18next: 20.6.1 + i18next-fs-backend: 1.1.5 + ioredis: 4.28.5 + kleur: 4.1.5 + lodash: 4.17.21 + moleculer: 0.14.23(patch_hash=ahhlgpfy57fntn2aftq6beaeja)(ioredis@4.28.5)(nats@1.4.12)(redlock@4.2.0) + moleculer-db: 0.8.19(moleculer@0.14.23) + moleculer-repl: 0.6.6 + moment: 2.29.4 + mongodb: 4.2.1 + mongoose: 6.1.1 + transitivePeerDependencies: + - amqplib + - avsc + - bunyan + - cbor-x + - dd-trace + - debug + - encoding + - etcd3 + - jaeger-client + - kafka-node + - log4js + - mqtt + - msgpack5 + - nats + - node-nats-streaming + - notepack.io + - pino + - protobufjs + - redlock + - rhea-promise + - supports-color + - thrift + - winston + dev: false + + /tailwindcss@2.2.19(autoprefixer@10.4.13)(postcss@8.4.21)(ts-node@10.9.1): resolution: {integrity: sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==} engines: {node: '>=12.13.0'} hasBin: true @@ -16933,17 +32540,17 @@ packages: autoprefixer: ^10.0.2 postcss: ^8.0.9 dependencies: - arg: 5.0.1 - autoprefixer: 10.4.7_postcss@8.4.13 + arg: 5.0.2 + autoprefixer: 10.4.13(postcss@8.4.21) bytes: 3.1.2 chalk: 4.1.2 chokidar: 3.5.3 color: 4.2.3 - cosmiconfig: 7.0.1 - detective: 5.2.0 + cosmiconfig: 7.1.0 + detective: 5.2.1 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.11 + fast-glob: 3.2.12 fs-extra: 10.1.0 glob-parent: 6.0.2 html-tags: 3.2.0 @@ -16955,46 +32562,108 @@ packages: node-emoji: 1.11.0 normalize-path: 3.0.0 object-hash: 2.2.0 - postcss: 8.4.13 + postcss: 8.4.21 postcss-js: 3.0.3 - postcss-load-config: 3.1.4_4jqnslpwnj4ifyjfqbkuebd4fy - postcss-nested: 5.0.6_postcss@8.4.13 - postcss-selector-parser: 6.0.10 + postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.9.1) + postcss-nested: 5.0.6(postcss@8.4.21) + postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 pretty-hrtime: 1.0.3 purgecss: 4.1.3 quick-lru: 5.1.1 reduce-css-calc: 2.1.8 - resolve: 1.22.0 + resolve: 1.22.1 tmp: 0.2.1 transitivePeerDependencies: - ts-node dev: false - /tapable/1.1.3: + /tailwindcss@3.3.3(ts-node@10.9.1): + resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.2.12 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.19.1 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.27 + postcss-import: 15.1.0(postcss@8.4.27) + postcss-js: 4.0.1(postcss@8.4.27) + postcss-load-config: 4.0.1(postcss@8.4.27)(ts-node@10.9.1) + postcss-nested: 6.0.1(postcss@8.4.27) + postcss-selector-parser: 6.0.11 + resolve: 1.22.2 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: false + + /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} - dev: true - /tapable/2.2.1: + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + + /tar-fs@2.0.1: + resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 dev: true - /tar/6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.1 + dev: false + + /tar@6.1.13: + resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} + engines: {node: '>=10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 - minipass: 3.1.6 + minipass: 4.2.1 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 dev: true - /telejson/5.3.3: - resolution: {integrity: sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==} + /telejson@6.0.8: + resolution: {integrity: sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==} dependencies: '@types/is-function': 1.0.1 global: 4.4.0 @@ -17006,12 +32675,12 @@ packages: memoizerific: 1.11.3 dev: true - /temp-dir/2.0.0: + /temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} dev: true - /tempy/0.6.0: + /tempy@0.6.0: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} dependencies: @@ -17021,37 +32690,24 @@ packages: unique-string: 2.0.0 dev: true - /terminal-link/2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + /term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.2.0 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 + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} 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.0 - webpack: 4.46.0 - webpack-sources: 1.4.3 - worker-farm: 1.7.0 + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 dev: true - /terser-webpack-plugin/4.2.3_webpack@4.46.0: + /terser-webpack-plugin@4.2.3(webpack@5.75.0): resolution: {integrity: sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==} engines: {node: '>= 10.13.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -17060,21 +32716,21 @@ packages: schema-utils: 3.1.1 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.13.1 - webpack: 4.46.0 + terser: 5.16.5 + webpack: 5.75.0(esbuild@0.15.18) webpack-sources: 1.4.3 transitivePeerDependencies: - bluebird dev: true - /terser-webpack-plugin/5.3.1_webpack@5.72.1: - resolution: {integrity: sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==} + /terser-webpack-plugin@5.3.6(esbuild@0.12.29)(webpack@5.75.0): + resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' esbuild: '*' uglify-js: '*' - webpack: ^5.1.0 + webpack: 5.75.0 peerDependenciesMeta: '@swc/core': optional: true @@ -17083,22 +32739,22 @@ packages: uglify-js: optional: true dependencies: + '@jridgewell/trace-mapping': 0.3.17 + esbuild: 0.12.29 jest-worker: 27.5.1 schema-utils: 3.1.1 - serialize-javascript: 6.0.0 - source-map: 0.6.1 - terser: 5.13.1 - webpack: 5.72.1 - dev: true + serialize-javascript: 6.0.1 + terser: 5.16.5 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) - /terser-webpack-plugin/5.3.1_webpack@5.73.0: - resolution: {integrity: sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==} + /terser-webpack-plugin@5.3.6(esbuild@0.15.18)(webpack@5.75.0): + resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' esbuild: '*' uglify-js: '*' - webpack: ^5.1.0 + webpack: 5.75.0 peerDependenciesMeta: '@swc/core': optional: true @@ -17107,132 +32763,179 @@ packages: uglify-js: optional: true dependencies: + '@jridgewell/trace-mapping': 0.3.17 + esbuild: 0.15.18 jest-worker: 27.5.1 schema-utils: 3.1.1 - serialize-javascript: 6.0.0 - source-map: 0.6.1 - terser: 5.13.1 - webpack: 5.73.0_webpack-cli@4.9.2 - dev: true + serialize-javascript: 6.0.1 + terser: 5.16.5 + webpack: 5.75.0(esbuild@0.15.18) - /terser/4.8.0: - resolution: {integrity: sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==} + /terser@4.8.1: + resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - acorn: 8.7.1 + acorn: 8.8.2 commander: 2.20.3 source-map: 0.6.1 source-map-support: 0.5.21 dev: true - /terser/5.13.1: - resolution: {integrity: sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==} + /terser@5.16.5: + resolution: {integrity: sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==} engines: {node: '>=10'} hasBin: true dependencies: - acorn: 8.7.1 + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.2 commander: 2.20.3 - source-map: 0.8.0-beta.0 source-map-support: 0.5.21 - dev: true - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.0 - minimatch: 3.0.4 + glob: 7.2.3 + minimatch: 3.1.2 dev: true - /text-extensions/1.9.0: + /text-decoding@1.0.0: + resolution: {integrity: sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==} + dev: false + + /text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - /throat/6.0.1: - resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} + /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: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} dev: true - /throttle-debounce/3.0.1: + /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} engines: {node: '>=10'} - dev: true + dev: false - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + /throttle-debounce@5.0.0: + resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} + engines: {node: '>=12.22'} + dev: false - /through2-filter/3.0.0: + /through2-filter@3.0.0: resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} dependencies: through2: 2.0.5 xtend: 4.0.2 dev: true - /through2/2.0.5: + /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 dev: true - /through2/4.0.2: + /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: - readable-stream: 3.6.0 - dev: true + readable-stream: 3.6.1 + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - /thunky/1.1.0: + /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'} + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: - setimmediate: 1.0.5 - dev: true + es5-ext: 0.10.62 + next-tick: 1.1.0 - /timsort/0.3.0: + /timsort@0.3.0: resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} - dev: false - /tiny-invariant/1.2.0: - resolution: {integrity: sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==} + /tiny-human-time@1.2.0: + resolution: {integrity: sha512-ubFNn/t40vgIvRgQhu3jp/ouBczBube3r50JYvzGb/Am1T37hCSKVNBFlx99McaWgheQE4nmMOj82WHDrGoqDA==} + engines: {node: '>=4'} + + /tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + dev: false - /tiny-warning/1.0.3: + /tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} dev: false - /tlds/1.231.0: + /tinycolor2@1.4.2: + resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==} + dev: false + + /tinycon@0.6.8: + resolution: {integrity: sha512-bF8Lxm4JUXF6Cw0XlZdugJ44GV575OinZ0Pt8vQPr8ooNqd2yyNkoFdCHzmdpHlgoqfSLfcyk4HDP1EyllT+ug==} + dev: false + + /tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + dependencies: + '@popperjs/core': 2.11.7 + dev: false + + /title-case@2.1.1: + resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: false + + /title-case@3.0.3: + resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + dependencies: + tslib: 2.5.0 + dev: false + + /tlds@1.231.0: resolution: {integrity: sha512-L7UQwueHSkGxZHQBXHVmXW64oi+uqNtzFt2x6Ssk7NVnpIbw16CRs4eb/jmKOZ9t2JnqZ/b3Cfvo97lnXqKrhw==} hasBin: true dev: false - /tmp/0.0.33: + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - dev: false - /tmp/0.2.1: + /tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} dependencies: rimraf: 3.0.2 dev: false - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-absolute-glob/2.0.2: + /to-absolute-glob@2.0.2: resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} engines: {node: '>=0.10.0'} dependencies: @@ -17240,22 +32943,22 @@ packages: is-negated-glob: 1.0.0 dev: true - /to-arraybuffer/1.0.1: - resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} + /to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - /to-object-path/0.3.0: + /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: + /to-regex-range@2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: @@ -17263,13 +32966,13 @@ packages: repeat-string: 1.6.1 dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /to-regex/3.0.2: + /to-regex@3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} dependencies: @@ -17279,77 +32982,251 @@ packages: safe-regex: 1.1.0 dev: true - /to-through/2.0.0: + /to-through@2.0.0: resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} engines: {node: '>= 0.10'} dependencies: through2: 2.0.5 dev: true - /toggle-selection/1.0.6: + /toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + + /token-types@4.2.1: + resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} + engines: {node: '>=10'} + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 dev: true - /toposort/2.0.2: + /toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} dev: false - /totalist/1.1.0: + /totalist@1.1.0: resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} engines: {node: '>=6'} + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + 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 - /tough-cookie/4.0.0: - resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} + /tough-cookie@4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} dependencies: - psl: 1.8.0 - punycode: 2.1.1 - universalify: 0.1.2 + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46/1.0.1: + /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: - punycode: 2.1.1 + punycode: 2.3.0 + dev: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.0 + dev: true + + /tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + dependencies: + punycode: 2.3.0 + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trim-newlines@1.0.0: + resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /trim-trailing-lines@1.1.4: + resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} + + /trim@0.0.1: + resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} + + /trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /ts-debounce@4.0.0: + resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==} + dev: false + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + + /ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + + /ts-jest@27.1.4(@babel/core@7.21.0)(@types/jest@26.0.24)(esbuild@0.12.29)(jest@27.5.1)(typescript@4.9.4): + resolution: {integrity: sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: '*' + jest: ^27.0.0 + typescript: 4.9.4 + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.0 + '@types/jest': 26.0.24 + bs-logger: 0.2.6 + esbuild: 0.12.29 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1(ts-node@10.9.1) + jest-util: 27.5.1 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 4.9.4 + yargs-parser: 20.2.9 dev: true - /tr46/2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} + /ts-jest@27.1.4(@babel/core@7.21.0)(@types/jest@27.5.2)(esbuild@0.15.18)(jest@27.5.1)(typescript@4.9.4): + resolution: {integrity: sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: '*' + jest: ^27.0.0 + typescript: 4.9.4 + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true dependencies: - punycode: 2.1.1 - dev: true - - /trim-newlines/3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - - /trim-trailing-lines/1.1.4: - resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} - dev: true - - /trim/0.0.1: - resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} + '@babel/core': 7.21.0 + '@types/jest': 27.5.2 + bs-logger: 0.2.6 + esbuild: 0.15.18 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1(ts-node@10.9.1) + jest-util: 27.5.1 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 4.9.4 + yargs-parser: 20.2.9 dev: true - /trough/1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - - /ts-dedent/2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} + /ts-jest@27.1.4(@babel/core@7.21.0)(@types/jest@29.4.0)(esbuild@0.12.29)(jest@27.5.1)(typescript@4.9.4): + resolution: {integrity: sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: '*' + jest: ^27.0.0 + typescript: 4.9.4 + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.0 + '@types/jest': 29.4.0 + bs-logger: 0.2.6 + esbuild: 0.12.29 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1(ts-node@10.9.1) + jest-util: 27.5.1 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 4.9.4 + yargs-parser: 20.2.9 dev: true - /ts-jest/27.1.4_ibhx3ehxrt2kgmkik4bkzmyeei: + /ts-jest@27.1.4(@babel/core@7.21.0)(@types/jest@29.5.1)(esbuild@0.15.18)(jest@27.5.1)(typescript@4.9.4): resolution: {integrity: sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -17359,7 +33236,7 @@ packages: babel-jest: '>=27.0.0 <28' esbuild: '*' jest: ^27.0.0 - typescript: '>=3.8 <5.0' + typescript: 4.9.4 peerDependenciesMeta: '@babel/core': optional: true @@ -17370,50 +33247,64 @@ packages: esbuild: optional: true dependencies: - '@types/jest': 27.5.1 + '@babel/core': 7.21.0 + '@types/jest': 29.5.1 bs-logger: 0.2.6 + esbuild: 0.15.18 fast-json-stable-stringify: 2.1.0 - jest: 27.5.1_ts-node@10.7.0 + jest: 27.5.1(ts-node@10.9.1) jest-util: 27.5.1 json5: 2.2.1 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.3.7 - typescript: 4.6.4 + semver: 7.5.4 + typescript: 4.9.4 yargs-parser: 20.2.9 dev: true - /ts-node/10.7.0_ixcth6kbstn6no7hiktnzckliq: - resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} + /ts-morph@16.0.0: + resolution: {integrity: sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==} + dependencies: + '@ts-morph/common': 0.17.0 + code-block-writer: 11.0.3 + dev: false + + /ts-nkeys@1.0.16: + resolution: {integrity: sha512-1qrhAlavbm36wtW+7NtKOgxpzl+70NTF8xlz9mEhiA5zHMlMxjj3sEVKWm3pGZhHXE0Q3ykjrj+OSRVaYw+Dqg==} + dependencies: + tweetnacl: 1.0.3 + + /ts-node@10.9.1(@types/node@18.11.9)(typescript@4.9.4): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' + '@types/node': 18.11.9 + typescript: 4.9.4 peerDependenciesMeta: '@swc/core': optional: true '@swc/wasm': optional: true dependencies: - '@cspotcode/source-map-support': 0.7.0 - '@tsconfig/node10': 1.0.8 - '@tsconfig/node12': 1.0.9 - '@tsconfig/node14': 1.0.1 - '@tsconfig/node16': 1.0.2 - '@types/node': 15.14.9 - acorn: 8.7.1 + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.11.9 + acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.6.4 + typescript: 4.9.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-pnp/1.2.0_typescript@4.6.4: + /ts-pnp@1.2.0(typescript@4.9.4): resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} engines: {node: '>=6'} peerDependencies: @@ -17422,130 +33313,259 @@ packages: typescript: optional: true dependencies: - typescript: 4.6.4 + typescript: 4.9.4 dev: true - /tsconfig-paths-webpack-plugin/3.5.2: - resolution: {integrity: sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==} + /tsconfig-paths-webpack-plugin@4.0.0: + resolution: {integrity: sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==} + engines: {node: '>=10.13.0'} dependencies: chalk: 4.1.2 - enhanced-resolve: 5.9.3 - tsconfig-paths: 3.14.1 + enhanced-resolve: 5.12.0 + tsconfig-paths: 4.2.0 dev: true - /tsconfig-paths/3.14.1: + /tsconfig-paths@3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: '@types/json5': 0.0.29 - json5: 1.0.1 - minimist: 1.2.6 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 strip-bom: 3.0.0 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib/2.0.1: + /tslib@2.0.1: resolution: {integrity: sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==} dev: false - /tslib/2.4.0: + /tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false - /tsutils/3.21.0_typescript@4.6.4: + /tsutils@3.21.0(typescript@4.9.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + typescript: 4.9.4 dependencies: tslib: 1.14.1 - typescript: 4.6.4 + typescript: 4.9.4 dev: true - /tty-browserify/0.0.0: - resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} + /ttl@1.3.1: + resolution: {integrity: sha512-+bGy9iDAqg3WSfc2ZrprToSPJhZjqy7vUv9wupQzsiv+BVPVx1T2a6G4T0290SpQj+56Toaw9BiLO5j5Bd7QzA==} + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 dev: true - /type-check/0.3.2: + /turndown-plugin-gfm@1.0.2: + resolution: {integrity: sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==} + dev: false + + /turndown@7.1.1: + resolution: {integrity: sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==} + dependencies: + domino: 2.1.6 + dev: false + + /tushan@0.3.11(prop-types@15.8.1)(ts-node@10.9.1): + resolution: {integrity: sha512-4nTzGcgmoXt99uxSIFN05dm9APtDipCFkwMj2wcMrWABJqI72g4yt+3irUJ8BGCbD4jJA0skM8IfUS9Lx42fTg==} + dependencies: + '@arco-design/web-react': 2.51.0(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query': 4.33.0(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-devtools': 4.33.0(@tanstack/react-query@4.33.0)(react-dom@18.2.0)(react@18.2.0) + '@types/jsonexport': 3.0.2 + '@types/lodash-es': 4.17.7 + '@types/node': 18.11.9 + '@types/qs': 6.9.7 + '@types/react': 18.0.20 + '@types/react-dom': 18.0.11 + '@types/react-helmet': 6.1.6 + '@types/styled-components': 5.1.26 + axios: 0.27.2 + clsx: 1.2.1 + eventemitter-strict: 1.0.1 + i18next: 22.5.1 + i18next-browser-languagedetector: 7.1.0 + immer: 9.0.21 + jsonexport: 3.2.0 + lodash-es: 4.17.21 + postcss: 8.4.27 + qs: 6.11.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet: 6.1.0(react@18.2.0) + react-i18next: 12.3.1(i18next@22.5.1)(react-dom@18.2.0)(react@18.2.0) + react-is: 18.2.0 + react-json-view: 1.21.3(@types/react@18.0.20)(react-dom@18.2.0)(react@18.2.0) + react-router: 6.11.0(react@18.2.0) + react-router-dom: 6.11.0(react-dom@18.2.0)(react@18.2.0) + recharts: 2.7.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + styled-components: 5.3.10(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + tailwindcss: 3.3.3(ts-node@10.9.1) + url-regex: 5.0.0 + zustand: 4.3.6(immer@9.0.21)(react@18.2.0) + transitivePeerDependencies: + - debug + - encoding + - prop-types + - react-native + - ts-node + dev: false + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + /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-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.16.0: + /type-fest@0.12.0: + resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.15.1: + resolution: {integrity: sha512-n+UXrN8i5ioo7kqT/nF8xsEzLaqFra7k32SEsSPwvXVGyAcRgV/FUQN/sgfptJTR1oRmmq7z4IXMFSM7im7C9A==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} dev: true - /type-fest/0.18.1: + /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-fest/0.6.0: + /type-fest@0.3.1: + resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} + engines: {node: '>=6'} + dev: false + + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest/0.8.1: + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + /type-fest@3.6.0: + resolution: {integrity: sha512-RqTRtKTzvPpNdDUp1dVkKQRunlPITk4mXeqFlAZoJsS+fLRn8AdPK0TcQDumGayhU7fjlBfiBjsq3pe3rIfXZQ==} + engines: {node: '>=14.16'} dev: true - /type-is/1.6.18: + /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 - /typedarray-to-buffer/3.1.5: + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + + /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 + + /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 - dev: true - /typedarray/0.0.6: + /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typescript/4.6.4: - resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} + /typescript@4.9.4: + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true - /uglify-js/3.15.5: - resolution: {integrity: sha512-hNM5q5GbBRB5xB+PMqVRcgYe4c8jbyZ1pzZhS6jbq54/4F2gFK869ZheiE5A8/t+W5jtTNpWef/5Q9zk639FNQ==} + /ua-parser-js@0.7.33: + resolution: {integrity: sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==} + dev: false + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true - dev: true optional: true - /unbox-primitive/1.0.2: + /uid2@1.0.0: + resolution: {integrity: sha512-+I6aJUv63YAcY9n4mQreLUt0d4lvwkkopDNmpomkAUz0fAkEMV9pRWxN0EjhW1YfRhcuyHg2v3mwddCDW1+LFQ==} + engines: {node: '>= 4.0.0'} + dev: false + + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -17553,59 +33573,77 @@ packages: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - /unc-path-regex/0.1.2: + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: true + + /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true - /unfetch/4.2.0: + /unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: true - /unherit/1.1.3: + /unherit@1.1.3: resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} dependencies: inherits: 2.0.4 xtend: 4.0.2 - dev: true - /unicode-canonical-property-names-ecmascript/2.0.0: + /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: + /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.0.0 - dev: true + unicode-property-aliases-ecmascript: 2.1.0 - /unicode-match-property-value-ecmascript/2.0.0: - resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==} + /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.0.0: - resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==} + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - dev: true - /unified/9.2.0: + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.6 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unified@9.2.0: resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} dependencies: + '@types/unist': 2.0.6 bail: 1.0.5 extend: 3.0.2 is-buffer: 2.0.5 is-plain-obj: 2.1.0 trough: 1.0.5 vfile: 4.2.1 - dev: true - /unified/9.2.2: + /unified@9.2.2: resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} dependencies: + '@types/unist': 2.0.6 bail: 1.0.5 extend: 3.0.2 is-buffer: 2.0.5 @@ -17614,7 +33652,7 @@ packages: vfile: 4.2.1 dev: false - /union-value/1.0.1: + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} dependencies: @@ -17624,172 +33662,326 @@ packages: set-value: 2.0.1 dev: true - /unionfs/4.4.0: - resolution: {integrity: sha512-N+TuJHJ3PjmzIRCE1d2N3VN4qg/P78eh/nxzwHnzpg3W2Mvf8Wvi7J1mvv6eNkb8neUeSdFSQsKna0eXVyF4+w==} - dependencies: - fs-monkey: 1.0.3 - dev: true - - /uniq/1.0.1: + /uniq@1.0.1: resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} - dev: false - /uniqs/2.0.0: + /uniqs@2.0.0: resolution: {integrity: sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==} - dev: false - /unique-filename/1.1.1: + /unique-filename@1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: unique-slug: 2.0.2 dev: true - /unique-slug/2.0.2: + /unique-slug@2.0.2: resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} dependencies: imurmurhash: 0.1.4 dev: true - /unique-stream/2.3.1: + /unique-stream@2.3.1: resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} dependencies: json-stable-stringify-without-jsonify: 1.0.1 through2-filter: 3.0.0 dev: true - /unique-string/2.0.0: + /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} dependencies: crypto-random-string: 2.0.0 + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 dev: true - /unist-builder/2.0.3: + /unist-builder@2.0.3: resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} - /unist-util-generated/1.1.6: + /unist-util-generated@1.1.6: resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} - /unist-util-is/4.1.0: + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: false + + /unist-util-is@4.1.0: resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - /unist-util-position/3.1.0: + /unist-util-is@5.2.0: + resolution: {integrity: sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ==} + dev: false + + /unist-util-position@3.1.0: resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} - /unist-util-remove-position/2.0.1: + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.0 + dev: false + + /unist-util-remove-position@2.0.1: resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==} dependencies: unist-util-visit: 2.0.3 - dev: true - /unist-util-remove/2.1.0: + /unist-util-remove@2.1.0: resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} dependencies: unist-util-is: 4.1.0 - dev: true - /unist-util-stringify-position/2.0.3: + /unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: '@types/unist': 2.0.6 - /unist-util-visit-parents/3.1.1: + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.6 + dev: false + + /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} dependencies: '@types/unist': 2.0.6 unist-util-is: 4.1.0 - /unist-util-visit/2.0.3: + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.2.0 + dev: false + + /unist-util-visit@2.0.3: resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} dependencies: '@types/unist': 2.0.6 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - /universalify/0.1.2: + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.2.0 + unist-util-visit-parents: 5.1.3 + dev: false + + /universal-github-app-jwt@1.1.0: + resolution: {integrity: sha512-3b+ocAjjz4JTyqaOT+NNBd5BtTuvJTxWElIoeHSVelUV9J3Jp7avmQTdLKCaoqi/5Ox2o/q+VK19TJ233rVXVQ==} + dependencies: + '@types/jsonwebtoken': 8.5.9 + jsonwebtoken: 8.5.1 + dev: false + + /universal-user-agent@6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/2.0.0: + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - /unload/2.2.0: - resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /unquote@1.1.1: + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + + /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 + + /untildify@2.1.0: + resolution: {integrity: sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + os-homedir: 1.0.2 + dev: true + optional: true + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.0.10(browserslist@4.21.3): + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.3 + escalade: 3.1.1 + picocolors: 1.0.0 + + /update-browserslist-db@1.0.10(browserslist@4.21.5): + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + + /update-dotenv@1.1.1(dotenv@8.6.0): + resolution: {integrity: sha512-3cIC18In/t0X/yH793c00qqxcKD8jVCgNOPif/fGQkFpYMGecM9YAc+kaAKXuZsM2dE9I9wFI7KvAuNX22SGMQ==} + peerDependencies: + dotenv: '*' + dependencies: + dotenv: 8.6.0 + dev: false + + /update-notifier@4.1.3: + resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==} + engines: {node: '>=8'} + dependencies: + boxen: 4.2.0 + chalk: 3.0.0 + configstore: 5.0.1 + has-yarn: 2.1.0 + import-lazy: 2.1.0 + is-ci: 2.0.0 + is-installed-globally: 0.3.2 + is-npm: 4.0.0 + is-yarn-global: 0.3.0 + latest-version: 5.1.0 + pupa: 2.1.1 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + dev: true + + /update-notifier@5.1.0: + resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} + engines: {node: '>=10'} + dependencies: + boxen: 5.1.2 + chalk: 4.1.2 + configstore: 5.0.1 + has-yarn: 2.1.0 + import-lazy: 2.1.0 + is-ci: 2.0.0 + is-installed-globally: 0.4.0 + is-npm: 5.0.0 + is-yarn-global: 0.3.0 + latest-version: 5.1.0 + pupa: 2.1.1 + semver: 7.5.4 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + dev: false + + /update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + dependencies: + boxen: 7.0.1 + chalk: 5.1.2 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.5.4 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + dev: true + + /upper-case-first@1.1.2: + resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} dependencies: - '@babel/runtime': 7.17.9 - detect-node: 2.1.0 + upper-case: 1.1.3 dev: false - /unpipe/1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true + /upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + dependencies: + tslib: 2.5.0 + dev: false - /unquote/1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + /upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} dev: false - /unset-value/1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} 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 + tslib: 2.5.0 + dev: false - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.1.1 - dev: true + punycode: 2.3.0 - /urix/0.1.0: + /urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: true - /url-loader/4.1.1_lit45vopotvaqup7lrvlnvtxwy: - resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - file-loader: '*' - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true - dependencies: - file-loader: 6.2.0_webpack@4.46.0 - loader-utils: 2.0.2 - mime-types: 2.1.35 - schema-utils: 3.1.1 - webpack: 4.46.0 + /url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /url-loader/4.1.1_ljnyroaqobwke7fusd7ro2cgzm: + /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.75.0): resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: file-loader: '*' - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 peerDependenciesMeta: file-loader: optional: true dependencies: - file-loader: 6.2.0_webpack@5.73.0 - loader-utils: 2.0.2 + file-loader: 6.2.0(webpack@5.75.0) + loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.73.0_webpack-cli@4.9.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + + /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-regex/5.0.0: + /url-regex@5.0.0: resolution: {integrity: sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g==} engines: {node: '>=8'} dependencies: @@ -17797,21 +33989,50 @@ packages: tlds: 1.231.0 dev: false - /url/0.11.0: + /url-to-options@1.0.1: + resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} + engines: {node: '>= 4'} + dev: true + + /url@0.11.0: resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} dependencies: punycode: 1.3.2 querystring: 0.2.0 + dev: false + + /use-callback-ref@1.3.0(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': 18.0.20 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.20 + react: 18.2.0 + tslib: 2.5.0 + dev: false - /use-composed-ref/1.3.0_react@17.0.2: + /use-composed-ref@1.3.0(react@17.0.2): resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 17.0.2 - dev: true + dev: false - /use-isomorphic-layout-effect/1.1.2_react@17.0.2: + /use-composed-ref@1.3.0(react@18.2.0): + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.0.20)(react@17.0.2): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -17820,10 +34041,24 @@ packages: '@types/react': optional: true dependencies: + '@types/react': 18.0.20 react: 17.0.2 - dev: true + dev: false + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.20 + react: 18.2.0 + dev: false - /use-latest/1.2.1_react@17.0.2: + /use-latest@1.2.1(@types/react@18.0.20)(react@17.0.2): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -17832,131 +34067,240 @@ packages: '@types/react': optional: true dependencies: + '@types/react': 18.0.20 react: 17.0.2 - use-isomorphic-layout-effect: 1.1.2_react@17.0.2 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.20)(react@17.0.2) + dev: false + + /use-latest@1.2.1(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.20 + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.20)(react@18.2.0) + dev: false + + /use-previous@1.1.0(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-t6ltKuYIpvcqD+VBnlUOaT+N94bN7HwUdB1u7rSpCIh9XvMJQIjsw/G8DoJlSDh029khFQ2L8q88oUWfKoWy5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.20)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /use-query-params@2.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MPBwXVZYzFeJEdjv0YgPNFsafUOM8WTpwBEZfNEMlyzbTsf2c+ZpOBkdM95/w4rxzk4eVO3E4DW7v33+VDbiQw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + serialize-query-params: 2.0.2 dev: true - /use/3.1.1: + /use-sidecar@1.1.2(@types/react@18.0.20)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': 18.0.20 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.20 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.5.0 + dev: false + + /use-sync-external-store@1.2.0(react@17.0.2): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 17.0.2 + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + + /use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify/1.0.0: + /util.promisify@1.0.0: resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} dependencies: - define-properties: 1.1.4 - object.getownpropertydescriptors: 2.1.3 + define-properties: 1.2.0 + object.getownpropertydescriptors: 2.1.5 dev: true - /util.promisify/1.0.1: + /util.promisify@1.0.1: resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} dependencies: - define-properties: 1.1.4 - es-abstract: 1.20.0 + define-properties: 1.2.0 + es-abstract: 1.21.1 has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.3 - dev: false - - /util/0.10.3: - resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==} - dependencies: - inherits: 2.0.1 - dev: true + object.getownpropertydescriptors: 2.1.5 - /util/0.11.1: - resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} + /util@0.12.4: + resolution: {integrity: sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==} dependencies: - inherits: 2.0.3 - dev: true + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.10 + safe-buffer: 5.2.1 + which-typed-array: 1.1.9 + dev: false - /utila/0.4.0: + /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: true - /utils-merge/1.0.1: + /utility-types@3.10.0: + resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: '>= 4'} + + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - dev: true - /uuid-browser/3.1.0: + /uuid-browser@3.1.0: resolution: {integrity: sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==} dev: true - /uuid/3.4.0: + /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: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true dev: true - /v8-compile-cache-lib/3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false - /v8-compile-cache/2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - /v8-to-istanbul/8.1.1: + /v8-to-istanbul@8.1.1: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} dependencies: '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.8.0 - source-map: 0.7.3 + convert-source-map: 1.9.0 + source-map: 0.7.4 dev: true - /v8-to-istanbul/9.0.0: - resolution: {integrity: sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==} + /v8-to-istanbul@9.0.1: + resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.17 '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.8.0 + convert-source-map: 1.9.0 dev: true - /validate-npm-package-license/3.0.4: + /v8flags@4.0.0: + resolution: {integrity: sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==} + engines: {node: '>= 10.13.0'} + dev: false + + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 dev: true - /value-equal/1.0.1: + /validator@13.7.0: + resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} + engines: {node: '>= 0.10'} + dev: true + + /value-equal@1.0.1: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} dev: false - /value-or-function/3.0.0: + /value-or-function@3.0.0: resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} engines: {node: '>= 0.10'} dev: true - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - dev: true - /vendors/1.0.4: + /vendors@1.0.4: resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} - dev: false - /vfile-location/3.2.0: - resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} + /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 - /vfile-message/2.0.4: + /vfile-location@3.2.0: + resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} + + /vfile-location@4.0.1: + resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==} + dependencies: + '@types/unist': 2.0.6 + vfile: 5.3.7 + dev: false + + /vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} dependencies: '@types/unist': 2.0.6 unist-util-stringify-position: 2.0.3 - /vfile/4.2.1: + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile@4.2.1: resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} dependencies: '@types/unist': 2.0.6 @@ -17964,7 +34308,35 @@ packages: unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - /vinyl-fs/3.0.3: + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /victory-vendor@36.6.11: + resolution: {integrity: sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==} + dependencies: + '@types/d3-array': 3.0.5 + '@types/d3-ease': 3.0.0 + '@types/d3-interpolate': 3.0.1 + '@types/d3-scale': 4.0.3 + '@types/d3-shape': 3.1.1 + '@types/d3-time': 3.0.0 + '@types/d3-timer': 3.0.0 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + dev: false + + /vinyl-fs@3.0.3: resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} engines: {node: '>= 0.10'} dependencies: @@ -17974,9 +34346,9 @@ packages: is-valid-glob: 1.0.0 lazystream: 1.0.1 lead: 1.0.0 - object.assign: 4.1.2 + object.assign: 4.1.4 pumpify: 1.5.1 - readable-stream: 2.3.7 + readable-stream: 2.3.8 remove-bom-buffer: 3.0.0 remove-bom-stream: 1.2.0 resolve-options: 1.1.0 @@ -17987,12 +34359,12 @@ packages: vinyl-sourcemap: 1.1.0 dev: true - /vinyl-sourcemap/1.1.0: + /vinyl-sourcemap@1.1.0: resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} engines: {node: '>= 0.10'} dependencies: append-buffer: 1.0.2 - convert-source-map: 1.8.0 + convert-source-map: 1.9.0 graceful-fs: 4.2.10 normalize-path: 2.1.1 now-and-later: 2.0.1 @@ -18000,7 +34372,7 @@ packages: vinyl: 2.2.1 dev: true - /vinyl/2.2.1: + /vinyl@2.2.1: resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} engines: {node: '>= 0.10'} dependencies: @@ -18012,109 +34384,180 @@ packages: replace-ext: 1.0.1 dev: true - /vm-browserify/1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + /vite-express@0.8.0(patch_hash=u6touqej4dt3zxnslnszarl7vq)(express@4.18.2)(vite@4.2.0): + resolution: {integrity: sha512-6rTyHMnOpi6+7XIH49MZNKOh4Rv684pKj2fSiJ+mI0xKgomBQkEhzL+Y/6mAmvWcStXSCf4lr7ZR+rRVuVaNCg==} + peerDependencies: + express: ^4.18.2 + vite: ^4.0.0 + dependencies: + express: 4.18.2 + node-fetch: 2.6.9 + picocolors: 1.0.0 + vite: 4.2.0(@types/node@18.11.9) + transitivePeerDependencies: + - encoding + dev: false + patched: true + + /vite@4.2.0(@types/node@18.11.9): + resolution: {integrity: sha512-AbDTyzzwuKoRtMIRLGNxhLRuv1FpRgdIw+1y6AQG73Q5+vtecmvzKo/yk8X/vrHDpETRTx01ABijqUHIzBXi0g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': 18.11.9 + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.11.9 + esbuild: 0.17.18 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.20.7 + optionalDependencies: + fsevents: 2.3.2 + + /vm2@3.9.14: + resolution: {integrity: sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + acorn: 8.8.2 + acorn-walk: 8.2.0 dev: true - /void-elements/3.1.0: + /void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} dev: false - /w3c-hr-time/1.0.2: + /w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} dependencies: browser-process-hrtime: 1.0.0 dev: true - /w3c-xmlserializer/2.0.0: + /w3c-keyname@2.2.6: + resolution: {integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==} + dev: false + + /w3c-xmlserializer@2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} engines: {node: '>=10'} dependencies: xml-name-validator: 3.0.0 dev: true - /walker/1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /warning/4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + /wait-on@6.0.1: + resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} + engines: {node: '>=10.0.0'} + hasBin: true dependencies: - loose-envify: 1.4.0 - dev: true + axios: 0.25.0 + joi: 17.8.3 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.0 + transitivePeerDependencies: + - debug + dev: false - /watchpack-chokidar2/2.0.1: - resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} - requiresBuild: true + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: - chokidar: 2.1.8 - transitivePeerDependencies: - - supports-color + makeerror: 1.0.12 dev: true - optional: true - /watchpack/1.7.5: - resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} + /ware@1.3.0: + resolution: {integrity: sha512-Y2HUDMktriUm+SR2gZWxlrszcgtXExlhQYZ8QJNYbl22jum00KIUcHJ/h/sdAXhWTJcbSkiMYN9Z2tWbWYSrrw==} dependencies: - graceful-fs: 4.2.10 - neo-async: 2.6.2 - optionalDependencies: - chokidar: 3.5.3 - watchpack-chokidar2: 2.0.1 - transitivePeerDependencies: - - supports-color + wrap-fn: 0.1.5 dev: true - /watchpack/2.3.1: - resolution: {integrity: sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==} + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.10 - dev: true - /wbuf/1.7.3: + /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: minimalistic-assert: 1.0.1 - dev: true - /wcwidth/1.0.1: + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: - defaults: 1.0.3 + defaults: 1.0.4 + + /web-encoding@1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + dependencies: + util: 0.12.4 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 dev: false - /web-namespaces/1.1.4: + /web-namespaces@1.1.4: resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} dev: true - /webidl-conversions/3.0.1: + /web-vitals@3.1.1: + resolution: {integrity: sha512-qvllU+ZeQChqzBhZ1oyXmWsjJ8a2jHYpH8AMaVuf29yscOPZfTQTjQFRX6+eADTdsDE8IanOZ0cetweHMs8/2A==} + dev: false + + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions/4.0.2: + /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true - /webidl-conversions/5.0.0: + /webidl-conversions@5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} dev: true - /webidl-conversions/6.1.0: + /webidl-conversions@6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} dev: true - /webpack-bundle-analyzer/4.5.0: - resolution: {integrity: sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==} + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + /webpack-bundle-analyzer@4.8.0: + resolution: {integrity: sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==} engines: {node: '>= 10.13.0'} hasBin: true dependencies: - acorn: 8.7.1 + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.8.2 acorn-walk: 8.2.0 chalk: 4.1.2 commander: 7.2.0 @@ -18122,20 +34565,19 @@ packages: lodash: 4.17.21 opener: 1.5.2 sirv: 1.0.19 - ws: 7.5.7 + ws: 7.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /webpack-cli/4.9.2_w5nksobufzg2ereh4ivwj2odyu: - resolution: {integrity: sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==} + /webpack-cli@4.10.0(webpack-bundle-analyzer@4.8.0)(webpack-dev-server@4.11.1)(webpack@5.75.0): + resolution: {integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: '@webpack-cli/generators': '*' '@webpack-cli/migrate': '*' - webpack: 4.x.x || 5.x.x + webpack: 5.75.0 webpack-bundle-analyzer: '*' webpack-dev-server: '*' peerDependenciesMeta: @@ -18149,56 +34591,102 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.1.1_gkh3o7gdsall36kyfdv2sybo54 - '@webpack-cli/info': 1.4.1_webpack-cli@4.9.2 - '@webpack-cli/serve': 1.6.1_efhxflzxrvzsrtpw5o3zelaodm - colorette: 2.0.16 + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.75.0) + '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) + '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@4.11.1) + colorette: 2.0.19 commander: 7.2.0 - execa: 5.1.1 - fastest-levenshtein: 1.0.12 + cross-spawn: 7.0.3 + fastest-levenshtein: 1.0.16 import-local: 3.1.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.73.0_webpack-cli@4.9.2 - webpack-bundle-analyzer: 4.5.0 - webpack-dev-server: 4.9.0_gkh3o7gdsall36kyfdv2sybo54 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + webpack-bundle-analyzer: 4.8.0 + webpack-dev-server: 4.11.1(webpack-cli@4.10.0)(webpack@5.75.0) webpack-merge: 5.8.0 - dev: true - /webpack-dev-middleware/3.7.3_webpack@4.46.0: + /webpack-dev-middleware@3.7.3(webpack@5.75.0): resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.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: 5.75.0(esbuild@0.15.18) webpack-log: 2.0.0 dev: true - /webpack-dev-middleware/5.3.1_webpack@5.73.0: - resolution: {integrity: sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==} + /webpack-dev-middleware@5.3.3(webpack@5.75.0): + resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + webpack: 5.75.0 dependencies: - colorette: 2.0.16 - memfs: 3.4.1 + colorette: 2.0.19 + memfs: 3.4.13 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.73.0_webpack-cli@4.9.2 - dev: true + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + + /webpack-dev-server@4.11.1(webpack-cli@4.10.0)(webpack@5.75.0): + resolution: {integrity: sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: 5.75.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.10 + '@types/connect-history-api-fallback': 1.3.5 + '@types/express': 4.17.17 + '@types/serve-index': 1.9.1 + '@types/serve-static': 1.15.1 + '@types/sockjs': 0.3.33 + '@types/ws': 8.5.4 + ansi-html-community: 0.0.8 + bonjour-service: 1.1.0 + chokidar: 3.5.3 + colorette: 2.0.19 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.18.2 + graceful-fs: 4.2.10 + html-entities: 2.3.3 + http-proxy-middleware: 2.0.6(@types/express@4.17.17) + ipaddr.js: 2.0.1 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.0.0 + selfsigned: 2.1.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-bundle-analyzer@4.8.0)(webpack-dev-server@4.11.1)(webpack@5.75.0) + webpack-dev-middleware: 5.3.3(webpack@5.75.0) + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate - /webpack-dev-server/4.9.0_gkh3o7gdsall36kyfdv2sybo54: - resolution: {integrity: sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==} + /webpack-dev-server@4.11.1(webpack@5.75.0): + resolution: {integrity: sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==} engines: {node: '>= 12.13.0'} hasBin: true peerDependencies: - webpack: ^4.37.0 || ^5.0.0 + webpack: 5.75.0 webpack-cli: '*' peerDependenciesMeta: webpack-cli: @@ -18206,60 +34694,59 @@ packages: dependencies: '@types/bonjour': 3.5.10 '@types/connect-history-api-fallback': 1.3.5 - '@types/express': 4.17.13 + '@types/express': 4.17.17 '@types/serve-index': 1.9.1 + '@types/serve-static': 1.15.1 '@types/sockjs': 0.3.33 - '@types/ws': 8.5.3 + '@types/ws': 8.5.4 ansi-html-community: 0.0.8 - bonjour-service: 1.0.12 + bonjour-service: 1.1.0 chokidar: 3.5.3 - colorette: 2.0.16 + colorette: 2.0.19 compression: 1.7.4 - connect-history-api-fallback: 1.6.0 + connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.18.1 + express: 4.18.2 graceful-fs: 4.2.10 html-entities: 2.3.3 - http-proxy-middleware: 2.0.6_@types+express@4.17.13 + http-proxy-middleware: 2.0.6(@types/express@4.17.17) ipaddr.js: 2.0.1 - open: 8.4.0 + open: 8.4.2 p-retry: 4.6.2 rimraf: 3.0.2 schema-utils: 4.0.0 - selfsigned: 2.0.1 + selfsigned: 2.1.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.73.0_webpack-cli@4.9.2 - webpack-cli: 4.9.2_w5nksobufzg2ereh4ivwj2odyu - webpack-dev-middleware: 5.3.1_webpack@5.73.0 - ws: 8.6.0 + webpack: 5.75.0(esbuild@0.15.18) + webpack-dev-middleware: 5.3.3(webpack@5.75.0) + ws: 8.13.0 transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - dev: true + dev: false - /webpack-filter-warnings-plugin/1.2.1_webpack@4.46.0: + /webpack-filter-warnings-plugin@1.2.1(webpack@5.75.0): resolution: {integrity: sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==} engines: {node: '>= 4.3 < 5.0.0 || >= 5.10'} peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + webpack: 5.75.0 dependencies: - webpack: 4.46.0 + webpack: 5.75.0(esbuild@0.15.18) dev: true - /webpack-hot-middleware/2.25.1: - resolution: {integrity: sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==} + /webpack-hot-middleware@2.25.2: + resolution: {integrity: sha512-CVgm3NAQyfdIonRvXisRwPTUYuSbyZ6BY7782tMeUzWOO7RmVI2NaBYuCp41qyD4gYCkJyTneAJdK69A13B0+A==} dependencies: ansi-html-community: 0.0.8 html-entities: 2.3.3 - querystring: 0.2.0 strip-ansi: 6.0.1 dev: true - /webpack-log/2.0.0: + /webpack-log@2.0.0: resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} engines: {node: '>= 6'} dependencies: @@ -18267,135 +34754,56 @@ packages: uuid: 3.4.0 dev: true - /webpack-merge/5.8.0: + /webpack-merge@5.8.0: resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} engines: {node: '>=10.0.0'} dependencies: clone-deep: 4.0.1 wildcard: 2.0.0 - dev: true - /webpack-sources/1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + /webpack-retry-chunk-load-plugin@3.1.1(webpack@5.75.0): + resolution: {integrity: sha512-BKq/7EcelyWUUI6SeBaUKB1G+fSZP0rlxIwRQ+aO6mK5tffljaHdpJ4I2q54rpaaKjSbwbZRQlaITXe93SL9nA==} + peerDependencies: + webpack: 5.75.0 dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 + prettier: 2.8.4 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) dev: true - /webpack-sources/2.3.1: - resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} - engines: {node: '>=10.13.0'} + /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-sources/3.2.3: + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - dev: true - /webpack-test-utils/1.1.0_webpack@5.72.1: - resolution: {integrity: sha512-zJaJZsa3v8jFx41uiVSF6V/8wd4zuX/DtDZkm7t8f8WlxP0W3Iwj3BikZx4C45EX7+yTUBWmKbkknoSsaIhFmw==} + /webpack-stats-viewer-plugin@1.0.2(webpack@5.75.0): + resolution: {integrity: sha512-Ls1CncDcLg+7B2P7NHi9tAYVlPtVS8YZ6HYIApVbafx4Bd6RbwQ+eiOBWUPs6ij+Rihh1lR3YACTaz+IvHHtWQ==} + engines: {node: '>= 14.0'} peerDependencies: - webpack: ^4.40.0 || ^5.0.0 + webpack: 5.75.0 dependencies: - fs-require: 1.4.0 - memfs: 3.4.1 - unionfs: 4.4.0 - webpack: 5.72.1 + chalk: 4.1.2 + fs-extra: 10.1.0 + lodash: 4.17.21 + opener: 1.5.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) dev: true - /webpack-virtual-modules/0.2.2: + /webpack-virtual-modules@0.2.2: resolution: {integrity: sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==} dependencies: - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - 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.0 - memory-fs: 0.4.1 - micromatch: 3.1.10 - 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 + debug: 3.2.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: true - /webpack/5.72.1: - resolution: {integrity: sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.3 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.7.1 - acorn-import-assertions: 1.8.0_acorn@8.7.1 - browserslist: 4.20.3 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.9.3 - es-module-lexer: 0.9.3 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.1.1 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.1_webpack@5.72.1 - watchpack: 2.3.1 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /webpack/5.72.1_webpack-cli@4.9.2: - resolution: {integrity: sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==} + /webpack@5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0): + resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -18404,16 +34812,16 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.3 + '@types/eslint-scope': 3.7.4 '@types/estree': 0.0.51 '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.7.1 - acorn-import-assertions: 1.8.0_acorn@8.7.1 - browserslist: 4.20.3 + acorn: 8.8.2 + acorn-import-assertions: 1.8.0(acorn@8.8.2) + browserslist: 4.21.5 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.9.3 + enhanced-resolve: 5.12.0 es-module-lexer: 0.9.3 eslint-scope: 5.1.1 events: 3.3.0 @@ -18425,18 +34833,17 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.1_webpack@5.72.1 - watchpack: 2.3.1 - webpack-cli: 4.9.2_w5nksobufzg2ereh4ivwj2odyu + terser-webpack-plugin: 5.3.6(esbuild@0.12.29)(webpack@5.75.0) + watchpack: 2.4.0 + webpack-cli: 4.10.0(webpack-bundle-analyzer@4.8.0)(webpack-dev-server@4.11.1)(webpack@5.75.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true - /webpack/5.73.0_webpack-cli@4.9.2: - resolution: {integrity: sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==} + /webpack@5.75.0(esbuild@0.15.18): + resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -18445,16 +34852,16 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.3 + '@types/eslint-scope': 3.7.4 '@types/estree': 0.0.51 '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.7.1 - acorn-import-assertions: 1.8.0_acorn@8.7.1 - browserslist: 4.20.3 + acorn: 8.8.2 + acorn-import-assertions: 1.8.0(acorn@8.8.2) + browserslist: 4.21.5 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.9.3 + enhanced-resolve: 5.12.0 es-module-lexer: 0.9.3 eslint-scope: 5.1.1 events: 3.3.0 @@ -18466,60 +34873,69 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.1_webpack@5.73.0 - watchpack: 2.3.1 - webpack-cli: 4.9.2_w5nksobufzg2ereh4ivwj2odyu + terser-webpack-plugin: 5.3.6(esbuild@0.15.18)(webpack@5.75.0) + watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - dev: true - /webpackbar/5.0.2_webpack@5.73.0: + /webpackbar@5.0.2(webpack@5.75.0): resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} engines: {node: '>=12'} peerDependencies: - webpack: 3 || 4 || 5 + webpack: 5.75.0 dependencies: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 - std-env: 3.1.1 - webpack: 5.73.0_webpack-cli@4.9.2 - dev: true + std-env: 3.3.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) + + /webrtc-adapter@8.2.3: + resolution: {integrity: sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==} + engines: {node: '>=6.0.0', npm: '>=3.10.0'} + dependencies: + sdp: 3.2.0 + dev: false - /websocket-driver/0.7.4: + /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} dependencies: - http-parser-js: 0.5.6 + http-parser-js: 0.5.8 safe-buffer: 5.2.1 websocket-extensions: 0.1.4 - dev: true - /websocket-extensions/0.1.4: + /websocket-extensions@0.1.4: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} - dev: true - /whatwg-encoding/1.0.5: + /whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: iconv-lite: 0.4.24 dev: true - /whatwg-mimetype/2.3.0: + /whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true - /whatwg-url/5.0.0: + /whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url/7.1.0: + /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 @@ -18527,7 +34943,7 @@ packages: webidl-conversions: 4.0.2 dev: true - /whatwg-url/8.7.0: + /whatwg-url@8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} engines: {node: '>=10'} dependencies: @@ -18536,7 +34952,7 @@ packages: webidl-conversions: 6.1.0 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -18545,232 +34961,276 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which/1.3.1: + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + 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 + + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 - dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true dependencies: isexe: 2.0.0 - dev: true - /wide-align/1.1.5: + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: string-width: 4.2.3 dev: true - /widest-line/3.1.0: + /widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} dependencies: string-width: 4.2.3 + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + + /wildcard-match@5.1.2: + resolution: {integrity: sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==} dev: true - /wildcard/2.0.0: + /wildcard@2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} + + /wildemitter@1.2.1: + resolution: {integrity: sha512-UMmSUoIQSir+XbBpTxOTS53uJ8s/lVhADCkEbhfRjUGFDPme/XGOb0sBWLx5sTz7Wx/2+TlAw1eK9O5lw5PiEw==} + dev: false + + /windows-release@5.1.0: + resolution: {integrity: sha512-CddHecz5dt0ngTjGPP1uYr9Tjl4qq5rEKNk8UGb8XCdngNXI+GRYvqelD055FdiUgqODZz3R/5oZWYldPtXQpA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + execa: 5.1.1 dev: true - /word-wrap/1.2.3: + /word-count@0.2.2: + resolution: {integrity: sha512-tPRTbQ+nTCPY3F0z1f/y0PX22ScE6l/4/8j9KqA3h77JhlZ/w6cbVS8LIO5Pq/aV96SWBOoiE2IEgzxF0Cn+kA==} + dev: false + + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} - dev: true - /wordwrap/1.0.0: + /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - /workbox-background-sync/6.5.3: - resolution: {integrity: sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==} + /workbox-background-sync@6.5.4: + resolution: {integrity: sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==} dependencies: - idb: 6.1.5 - workbox-core: 6.5.3 + idb: 7.1.1 + workbox-core: 6.5.4 dev: true - /workbox-broadcast-update/6.5.3: - resolution: {integrity: sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==} + /workbox-broadcast-update@6.5.4: + resolution: {integrity: sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==} dependencies: - workbox-core: 6.5.3 + workbox-core: 6.5.4 dev: true - /workbox-build/6.5.3: - resolution: {integrity: sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w==} + /workbox-build@6.5.4: + resolution: {integrity: sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==} engines: {node: '>=10.0.0'} dependencies: - '@apideck/better-ajv-errors': 0.3.3_ajv@8.11.0 - '@babel/core': 7.17.10 - '@babel/preset-env': 7.17.10_@babel+core@7.17.10 - '@babel/runtime': 7.17.9 - '@rollup/plugin-babel': 5.3.1_ddp4whfhauf2n5cf6yj7gaerwe - '@rollup/plugin-node-resolve': 11.2.1_rollup@2.72.1 - '@rollup/plugin-replace': 2.4.2_rollup@2.72.1 + '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@babel/core': 7.21.0 + '@babel/preset-env': 7.20.2(@babel/core@7.21.0) + '@babel/runtime': 7.21.0 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.21.0)(rollup@2.79.1) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.11.0 + ajv: 8.12.0 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 - glob: 7.2.0 + glob: 7.2.3 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: 2.72.1 - rollup-plugin-terser: 7.0.2_rollup@2.72.1 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2(rollup@2.79.1) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 tempy: 0.6.0 upath: 1.2.0 - workbox-background-sync: 6.5.3 - workbox-broadcast-update: 6.5.3 - workbox-cacheable-response: 6.5.3 - workbox-core: 6.5.3 - workbox-expiration: 6.5.3 - workbox-google-analytics: 6.5.3 - workbox-navigation-preload: 6.5.3 - workbox-precaching: 6.5.3 - workbox-range-requests: 6.5.3 - workbox-recipes: 6.5.3 - workbox-routing: 6.5.3 - workbox-strategies: 6.5.3 - workbox-streams: 6.5.3 - workbox-sw: 6.5.3 - workbox-window: 6.5.3 + workbox-background-sync: 6.5.4 + workbox-broadcast-update: 6.5.4 + workbox-cacheable-response: 6.5.4 + workbox-core: 6.5.4 + workbox-expiration: 6.5.4 + workbox-google-analytics: 6.5.4 + workbox-navigation-preload: 6.5.4 + workbox-precaching: 6.5.4 + workbox-range-requests: 6.5.4 + workbox-recipes: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + workbox-streams: 6.5.4 + workbox-sw: 6.5.4 + workbox-window: 6.5.4 transitivePeerDependencies: - '@types/babel__core' - supports-color dev: true - /workbox-cacheable-response/6.5.3: - resolution: {integrity: sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==} + /workbox-cacheable-response@6.5.4: + resolution: {integrity: sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==} dependencies: - workbox-core: 6.5.3 + workbox-core: 6.5.4 dev: true - /workbox-core/6.5.3: - resolution: {integrity: sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==} + /workbox-core@6.5.4: + resolution: {integrity: sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==} dev: true - /workbox-expiration/6.5.3: - resolution: {integrity: sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==} + /workbox-expiration@6.5.4: + resolution: {integrity: sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==} dependencies: - idb: 6.1.5 - workbox-core: 6.5.3 + idb: 7.1.1 + workbox-core: 6.5.4 dev: true - /workbox-google-analytics/6.5.3: - resolution: {integrity: sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==} + /workbox-google-analytics@6.5.4: + resolution: {integrity: sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==} dependencies: - workbox-background-sync: 6.5.3 - workbox-core: 6.5.3 - workbox-routing: 6.5.3 - workbox-strategies: 6.5.3 + workbox-background-sync: 6.5.4 + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 dev: true - /workbox-navigation-preload/6.5.3: - resolution: {integrity: sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==} + /workbox-navigation-preload@6.5.4: + resolution: {integrity: sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==} dependencies: - workbox-core: 6.5.3 + workbox-core: 6.5.4 dev: true - /workbox-precaching/6.5.3: - resolution: {integrity: sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==} + /workbox-precaching@6.5.4: + resolution: {integrity: sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==} dependencies: - workbox-core: 6.5.3 - workbox-routing: 6.5.3 - workbox-strategies: 6.5.3 + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 dev: true - /workbox-range-requests/6.5.3: - resolution: {integrity: sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==} + /workbox-range-requests@6.5.4: + resolution: {integrity: sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==} dependencies: - workbox-core: 6.5.3 + workbox-core: 6.5.4 dev: true - /workbox-recipes/6.5.3: - resolution: {integrity: sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig==} + /workbox-recipes@6.5.4: + resolution: {integrity: sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==} dependencies: - workbox-cacheable-response: 6.5.3 - workbox-core: 6.5.3 - workbox-expiration: 6.5.3 - workbox-precaching: 6.5.3 - workbox-routing: 6.5.3 - workbox-strategies: 6.5.3 + workbox-cacheable-response: 6.5.4 + workbox-core: 6.5.4 + workbox-expiration: 6.5.4 + workbox-precaching: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 dev: true - /workbox-routing/6.5.3: - resolution: {integrity: sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==} + /workbox-routing@6.5.4: + resolution: {integrity: sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==} dependencies: - workbox-core: 6.5.3 + workbox-core: 6.5.4 dev: true - /workbox-strategies/6.5.3: - resolution: {integrity: sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==} + /workbox-strategies@6.5.4: + resolution: {integrity: sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==} dependencies: - workbox-core: 6.5.3 + workbox-core: 6.5.4 dev: true - /workbox-streams/6.5.3: - resolution: {integrity: sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==} + /workbox-streams@6.5.4: + resolution: {integrity: sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==} dependencies: - workbox-core: 6.5.3 - workbox-routing: 6.5.3 + workbox-core: 6.5.4 + workbox-routing: 6.5.4 dev: true - /workbox-sw/6.5.3: - resolution: {integrity: sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A==} + /workbox-sw@6.5.4: + resolution: {integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==} dev: true - /workbox-webpack-plugin/6.5.3_webpack@5.73.0: - resolution: {integrity: sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA==} + /workbox-webpack-plugin@6.5.4(webpack@5.75.0): + resolution: {integrity: sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==} engines: {node: '>=10.0.0'} peerDependencies: - webpack: ^4.4.0 || ^5.9.0 + webpack: 5.75.0 dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.73.0_webpack-cli@4.9.2 + webpack: 5.75.0(esbuild@0.12.29)(webpack-cli@4.10.0) webpack-sources: 1.4.3 - workbox-build: 6.5.3 + workbox-build: 6.5.4 transitivePeerDependencies: - '@types/babel__core' - supports-color dev: true - /workbox-window/6.5.3: - resolution: {integrity: sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw==} - dependencies: - '@types/trusted-types': 2.0.2 - workbox-core: 6.5.3 - dev: true - - /worker-farm/1.7.0: - resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} + /workbox-window@6.5.4: + resolution: {integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==} dependencies: - errno: 0.1.8 + '@types/trusted-types': 2.0.3 + workbox-core: 6.5.4 dev: true - /worker-rpc/0.1.1: + /worker-rpc@0.1.1: resolution: {integrity: sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==} dependencies: microevent.ts: 0.1.1 dev: true - /wrap-ansi/6.2.0: + /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 + + /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: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -18778,20 +35238,40 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy/1.0.2: + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.0.1 + + /wrap-fn@0.1.5: + resolution: {integrity: sha512-xDLdGx0M8JQw9QDAC9s5NUxtg9MI09F6Vbxa2LYoSoCvzJnx2n81YMIfykmXEGsUvuLaxnblJTzhSOjUOX37ag==} + dependencies: + co: 3.1.0 + dev: true + + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /write-file-atomic/3.0.3: + /write-file-atomic@1.3.4: + resolution: {integrity: sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==} + dependencies: + graceful-fs: 4.2.10 + imurmurhash: 0.1.4 + slide: 1.1.6 + + /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 - signal-exit: 3.0.6 + signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - /ws/7.5.7: - resolution: {integrity: sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==} + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -18801,10 +35281,9 @@ packages: optional: true utf-8-validate: optional: true - dev: true - /ws/8.2.3: - resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} + /ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -18816,8 +35295,20 @@ packages: optional: true dev: false - /ws/8.6.0: - resolution: {integrity: sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==} + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.2.3: + resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -18827,50 +35318,167 @@ packages: optional: true utf-8-validate: optional: true + + /x-default-browser@0.4.0: + resolution: {integrity: sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==} + hasBin: true + optionalDependencies: + default-browser-id: 1.0.4 + dev: true + + /xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + + /xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} dev: true - /xml-name-validator/3.0.0: + /xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + dependencies: + sax: 1.2.4 + dev: false + + /xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} dev: true - /xmlchars/2.2.0: + /xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xmlhttprequest-ssl/2.0.0: + /xmlhttprequest-ssl@2.0.0: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} + + /xregexp@2.0.0: + resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} + dev: true + + /xss@1.0.14: + resolution: {integrity: sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==} + engines: {node: '>= 0.10.0'} + hasBin: true + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 dev: false - /xtend/4.0.2: + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - /y18n/4.0.3: + /y-prosemirror@1.1.3(prosemirror-model@1.18.1)(prosemirror-state@1.4.1)(prosemirror-view@1.28.2)(y-protocols@1.0.5)(yjs@13.5.41): + resolution: {integrity: sha512-FZW/mm8SxHy/iO4RG40LAIrzzoh6qDNQBdrK20JJSh7Rq41CifVhsydMbara44gGJkGRC5s4CQtJAZUqzVM4rw==} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 + dependencies: + lib0: 0.2.52 + prosemirror-model: 1.18.1 + prosemirror-state: 1.4.1 + prosemirror-view: 1.28.2 + y-protocols: 1.0.5 + yjs: 13.5.41 + dev: false + + /y-protocols@1.0.5: + resolution: {integrity: sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A==} + dependencies: + lib0: 0.2.52 + dev: false + + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - /yargs-parser/20.2.9: + /yaml@2.0.0-1: + resolution: {integrity: sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==} + engines: {node: '>= 6'} + dev: true + + /yaml@2.2.1: + resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} + engines: {node: '>= 14'} + dev: true + + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + dev: false + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + 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'} - /yargs/16.2.0: + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.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: 4.2.3 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -18882,37 +35490,114 @@ packages: y18n: 5.0.8 yargs-parser: 20.2.9 - /yeast/0.1.2: - resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} + /yargs@17.5.1: + resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} + engines: {node: '>=12'} + 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: 21.1.1 + dev: false + + /yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + 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: 21.1.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yjs@13.5.41: + resolution: {integrity: sha512-4eSTrrs8OeI0heXKKioRY4ag7V5Bk85Z4MeniUyown3o3y0G7G4JpAZWrZWfTp7pzw2b53GkAQWKqHsHi9j9JA==} + dependencies: + lib0: 0.2.52 + dev: false + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} dev: false - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - dev: true - /yoctodelay/1.2.0: + /yoctodelay@1.2.0: resolution: {integrity: sha512-12y/P9MSig9/5BEhBgylss+fkHiCRZCvYR81eH35NW9uw801cvJt31EAV+WOLcwZRZbLiIQl/hxcdXXXFmGvXg==} engines: {node: '>=4'} dev: false - /yup/0.32.11: + /yoga-layout-prebuilt@1.10.0: + resolution: {integrity: sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==} + engines: {node: '>=8'} + dependencies: + '@types/yoga-layout': 1.9.2 + dev: false + + /yup@0.32.11: resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.17.9 - '@types/lodash': 4.14.178 + '@babel/runtime': 7.21.0 + '@types/lodash': 4.14.196 lodash: 4.17.21 lodash-es: 4.17.21 nanoclone: 0.2.1 - property-expr: 2.0.4 + property-expr: 2.0.5 toposort: 2.0.2 dev: false - /zwitch/1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.7.0 + optionalDependencies: + commander: 9.5.0 dev: true + + /zustand@4.3.6(immer@9.0.21)(react@18.2.0): + resolution: {integrity: sha512-6J5zDxjxLE+yukC2XZWf/IyWVKnXT9b9HUv09VJ/bwGCpKNcaTqp7Ws28Xr8jnbvnZcdRaidztAPsXFBIqufiw==} + engines: {node: '>=12.7.0'} + peerDependencies: + immer: 9.0.21 + react: '>=16.8' + peerDependenciesMeta: + immer: + optional: true + react: + optional: true + dependencies: + immer: 9.0.21 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + + /zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1a8e4ade95d..07fed42c217 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,13 @@ packages: - # all packages in subdirs of packages/ and components/ - - 'web' - - 'shared' - - 'web/plugins/**' - - 'packages/**' + - 'apps/*' + - 'packages/*' + - 'client/web' + - 'client/shared' + - 'client/web/plugins/**' + - 'client/packages/**' + - 'server' + - 'server/admin' + - 'server/packages/**' + - 'server/plugins/**' + - 'server/test/demo/**' + - 'website' diff --git a/server/.dockerignore b/server/.dockerignore new file mode 100644 index 00000000000..399cb73e29d --- /dev/null +++ b/server/.dockerignore @@ -0,0 +1,4 @@ +.env +node_modules +logs +dist diff --git a/server/.env.example b/server/.env.example new file mode 100644 index 00000000000..96966a096c3 --- /dev/null +++ b/server/.env.example @@ -0,0 +1,40 @@ +############################ +# 该环境变量用于单机运行 +############################ + +PORT=11000 +SECRET= +# 示例: mongodb://user:pass@127.0.0.1:27017/tailchat +MONGO_URL= +REDIS_URL=redis://localhost:6379/ +TRANSPORTER= + +# 填写服务端可访问的接口地址 +API_URL= + +# 文件存储 +MINIO_URL=127.0.0.1:19000 +MINIO_USER=tailchat +MINIO_PASS=com.msgbyte.tailchat + +# SMTP 服务 +# 示例: "Tailchat" example@163.com +SMTP_SENDER= +# 示例: smtp://username:password@smtp.example.com/?pool=true +SMTP_URI= + +# 视频会议服务(optional) 不包含结尾的/ +TAILCHAT_MEETING_URL= + +# Admin 后台密码 +ADMIN_USER=tailchat +ADMIN_PASS=com.msgbyte.tailchat + +# GETUI Push +GETUI_APPID= +GETUI_APPKEY= +GETUI_MASTERSECRET= + +# Tianji +TIANJI_SCRIPT_URL= +TIANJI_WEBSITE_ID= diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 00000000000..8cf25450bee --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,116 @@ +config/local.* +data/ +__uploads/ + +# Swagger +public/swagger.json + +# 插件 +public/plugins/ +public/registry.json +public/registry-be.json + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port diff --git a/server/.npmrc b/server/.npmrc new file mode 100644 index 00000000000..baf6234f533 --- /dev/null +++ b/server/.npmrc @@ -0,0 +1,6 @@ +# https://npmmirror.com/ +registry = https://registry.npmmirror.com +ignore-workspace-root-check = true +strict-peer-dependencies = false # 因为一些旧依赖(特别是mongoose相关) 比较糟糕,因此关掉 +# For docker: https://pnpm.io/npmrc#unsafe-perm +unsafe-perm = true diff --git a/server/README.md b/server/README.md new file mode 100644 index 00000000000..d5f531349e0 --- /dev/null +++ b/server/README.md @@ -0,0 +1,95 @@ +# tailchat-server + +## Build development environment + +Checkout more detail in [https://tailchat.msgbyte.com/docs/deployment/dev](https://tailchat.msgbyte.com/docs/deployment/dev) + +#### 服务端插件安装方式 + +安装所有插件 +``` +pnpm plugin:install all +``` + +安装单个插件 +``` +pnpm plugin:install com.msgbyte.tasks +``` + +## 单节点部署 + +#### docker-compose 一键部署 + +请确保已经安装了: +- docker +- docker-compose(或者docker compose plugin) + + +在项目根目录下执行 +```bash +docker compose build # 需要编译 +docker compose up -d +``` + +## DevOps + +### Database management + +Checkout more detail in [https://tailchat.msgbyte.com/docs/devops/mongodb](https://tailchat.msgbyte.com/docs/devops/mongodb) + +### 通过docker volume + +#### 备份 +```bash +docker run -it --rm --volumes-from -v ${PWD}:/opt/backup --name export busybox sh + +# 进入容器 +tar -zcvf /opt/backup/data.tar + +exit +``` +此处, 如果是minio则为`/data/`如果是mongo则为`/data/db` + +#### 恢复 +```bash +docker run -it --rm --volumes-from -v ${PWD}:/opt/backup --name importer busybox sh +tar -zxvf /opt/backup/data.tar +exit +``` + + +## Benchmark + +### Case 1 + +### Case 2 + + diff --git a/server/admin/index.html b/server/admin/index.html new file mode 100644 index 00000000000..7b82032cea6 --- /dev/null +++ b/server/admin/index.html @@ -0,0 +1,13 @@ + + + + + + + Tailchat Admin + + +
+ + + diff --git a/server/admin/nodemon.json b/server/admin/nodemon.json new file mode 100644 index 00000000000..4fecdee34fa --- /dev/null +++ b/server/admin/nodemon.json @@ -0,0 +1,7 @@ +{ + "verbose": true, + "watch": ["./src/server"], + "ext": "ts", + "delay": 1000, + "exec": "ts-node ./src/server/index.ts" +} diff --git a/server/admin/package.json b/server/admin/package.json new file mode 100644 index 00000000000..4267f06702e --- /dev/null +++ b/server/admin/package.json @@ -0,0 +1,50 @@ +{ + "name": "tailchat-admin", + "private": true, + "version": "0.0.0", + "author": "moonrailgun", + "scripts": { + "dev": "nodemon", + "start": "cross-env NODE_ENV=production node dist/admin/src/server/index.js", + "build": "pnpm build:client && pnpm build:server", + "build:client": "vite build", + "build:server": "tsc -p tsconfig.server.json" + }, + "dependencies": { + "@bytemd/plugin-gfm": "^1.21.0", + "@bytemd/react": "^1.21.0", + "@fastify/busboy": "^1.1.0", + "@loadable/component": "^5.15.3", + "axios": "^1.4.0", + "bytemd": "^1.21.0", + "compression": "^1.7.4", + "dayjs": "^1.11.7", + "express": "^4.18.2", + "express-mongoose-ra-json-server": "^0.1.0", + "filesize": "^8.0.7", + "jsonwebtoken": "^8.5.1", + "lodash": "^4.17.21", + "md5": "^2.3.0", + "morgan": "^1.10.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailchat-server-sdk": "workspace:^", + "tushan": "^0.3.11", + "vite-express": "0.8.0" + }, + "devDependencies": { + "@types/compression": "^1.7.2", + "@types/express": "^4.17.15", + "@types/loadable__component": "^5.13.4", + "@types/md5": "^2.3.2", + "@types/morgan": "^1.9.4", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@vitejs/plugin-react": "^3.1.0", + "cross-env": "^7.0.3", + "nodemon": "^2.0.22", + "ts-node": "^10.9.1", + "typescript": "^4.9.3", + "vite": "^4.2.0" + } +} diff --git a/server/admin/public/favicon.ico b/server/admin/public/favicon.ico new file mode 100644 index 00000000000..94ac22cf74e Binary files /dev/null and b/server/admin/public/favicon.ico differ diff --git a/server/admin/src/client/App.tsx b/server/admin/src/client/App.tsx new file mode 100644 index 00000000000..9f8be26c69c --- /dev/null +++ b/server/admin/src/client/App.tsx @@ -0,0 +1,127 @@ +import { + Category, + createTextField, + CustomRoute, + jsonServerProvider, + ListTable, + Resource, + Tushan, +} from 'tushan'; +import { + IconCompass, + IconDashboard, + IconEmail, + IconExperiment, + IconFile, + IconMessage, + IconNotification, + IconSettings, + IconStorage, + IconUser, + IconUserGroup, + IconWifi, +} from 'tushan/icon'; +import { authHTTPClient, authProvider } from './auth'; +import { Dashboard } from './components/Dashboard'; +import { discoverFields, mailFields, messageFields } from './fields'; +import { i18n } from './i18n'; +import { GroupList } from './resources/group'; +import { UserList } from './resources/user'; +import { FileList } from './resources/file'; +import { TailchatAnalytics } from './routes/analytics'; +import { CacheManager } from './routes/cache'; +import { TailchatNetwork } from './routes/network'; +import { SocketIOAdmin } from './routes/socketio'; +import { SystemConfig } from './routes/system'; +import { SystemNotify } from './routes/system/notify'; + +const dataProvider = jsonServerProvider('/admin/api', authHTTPClient); + +function App() { + return ( + } + dataProvider={dataProvider} + authProvider={authProvider} + i18n={i18n} + > + }> + + + + } list={} /> + + } + list={ + + } + /> + + } list={} /> + + } list={} /> + + } + list={} + /> + + + } + list={ + + } + /> + + + }> + + + + }> + + + + }> + + + + }> + + + + }> + + + + ); +} + +export default App; diff --git a/server/admin/src/client/auth.ts b/server/admin/src/client/auth.ts new file mode 100644 index 00000000000..fb0375ffcd7 --- /dev/null +++ b/server/admin/src/client/auth.ts @@ -0,0 +1,15 @@ +import { + AuthProvider, + createAuthHttpClient, + createAuthProvider, + HTTPClient, +} from 'tushan'; + +export const authStorageKey = 'tailchat:admin:auth'; + +export const authProvider: AuthProvider = createAuthProvider({ + authStorageKey, + loginUrl: '/admin/api/login', +}); + +export const authHTTPClient: HTTPClient = createAuthHttpClient(authStorageKey); diff --git a/server/admin/src/client/components/Dashboard.tsx b/server/admin/src/client/components/Dashboard.tsx new file mode 100644 index 00000000000..74542dbe506 --- /dev/null +++ b/server/admin/src/client/components/Dashboard.tsx @@ -0,0 +1,303 @@ +import { IconFile, IconMessage, IconUser, IconUserGroup } from 'tushan/icon'; +import React from 'react'; +import { + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer, + AreaChart, + Area, +} from 'tushan/chart'; +import { + Card, + Link, + Space, + Grid, + Divider, + Typography, + useUserStore, + createSelector, + useTranslation, + useGetList, + useAsync, +} from 'tushan'; +import { request } from '../request'; + +const { GridItem } = Grid; + +export const Dashboard: React.FC = React.memo(() => { + const { userIdentity } = useUserStore(createSelector('userIdentity')); + const { t } = useTranslation(); + + return ( +
+
+ + + + {t('tushan.dashboard.welcome', { + name: userIdentity.fullName, + })} + + + + + + + + + + {t('custom.dashboard.newUserCount')} + + + + + + {t('custom.dashboard.messageCount')} + + + + + + + + + {t('tushan.dashboard.tip.docs')} + + + + + {t('custom.dashboard.tip.github')} + + + + + {t('custom.dashboard.tip.tushan')} + + + + +
+
+ ); +}); +Dashboard.displayName = 'Dashboard'; + +const DashboardSummary: React.FC = React.memo(() => { + const { t } = useTranslation(); + + const { total: usersNum } = useGetList('users', { + pagination: { page: 1, perPage: 1 }, + }); + const { total: groupNum } = useGetList('groups', { + pagination: { page: 1, perPage: 1 }, + }); + const { total: fileNum } = useGetList('file', { + pagination: { page: 1, perPage: 1 }, + }); + const { total: messagesNum } = useGetList('messages', { + pagination: { page: 1, perPage: 1 }, + }); + + return ( + + + } + title={t('tushan.dashboard.user')} + count={usersNum} + /> + + + + + + } + title={t('tushan.dashboard.group')} + count={groupNum} + /> + + + + + + } + title={t('custom.dashboard.file')} + count={fileNum} + /> + + + + + + } + title={t('custom.dashboard.messages')} + count={messagesNum} + /> + + + ); +}); +DashboardSummary.displayName = 'DashboardSummary'; + +const DashboardItem: React.FC< + React.PropsWithChildren<{ + title: string; + href?: string; + }> +> = React.memo((props) => { + const { t } = useTranslation(); + + return ( + + {t('tushan.dashboard.more')} + + ) + } + bordered={false} + style={{ overflow: 'hidden' }} + > + {props.children} + + ); +}); +DashboardItem.displayName = 'DashboardItem'; + +const DataItem: React.FC<{ + icon: React.ReactElement; + title: string; + count: number; +}> = React.memo((props) => { + return ( + +
+ {props.icon} +
+
+
{props.title}
+
{props.count}
+
+
+ ); +}); +DataItem.displayName = 'DataItem'; + +const UserCountChart: React.FC = React.memo(() => { + const id = 'userCount'; + const color = '#82ca9d'; + const { t } = useTranslation(); + const { value: newUserCountSummary } = useAsync(async () => { + const { data } = await request.get<{ + summary: { + count: number; + date: string; + }[]; + }>('/user/count/summary'); + + return data.summary; + }, []); + + return ( + + + + + + + + + + + + + + + + ); +}); +UserCountChart.displayName = 'UserCountChart'; + +const MessageCountChart: React.FC = React.memo(() => { + const id = 'messageCount'; + const color = '#8884d8'; + const { t } = useTranslation(); + const { value: messageCountSummary } = useAsync(async () => { + const { data } = await request.get<{ + summary: { + count: number; + date: string; + }[]; + }>('/message/count/summary'); + + return data.summary; + }, []); + + return ( + + + + + + + + + + + + + + + + ); +}); +MessageCountChart.displayName = 'MessageCountChart'; diff --git a/server/admin/src/client/components/MarkdownEditor/editor.tsx b/server/admin/src/client/components/MarkdownEditor/editor.tsx new file mode 100644 index 00000000000..09e51b1cd94 --- /dev/null +++ b/server/admin/src/client/components/MarkdownEditor/editor.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { Editor } from '@bytemd/react'; +import { plugins } from './plugins'; +import 'bytemd/dist/index.css'; +import './style.less'; + +interface MarkdownEditorProps { + value: string; + onChange: (val: string) => void; +} +export const MarkdownEditor: React.FC = React.memo( + (props) => { + return ( + + ); + } +); +MarkdownEditor.displayName = 'MarkdownEditor'; diff --git a/server/admin/src/client/components/MarkdownEditor/index.tsx b/server/admin/src/client/components/MarkdownEditor/index.tsx new file mode 100644 index 00000000000..71da4f65ed7 --- /dev/null +++ b/server/admin/src/client/components/MarkdownEditor/index.tsx @@ -0,0 +1,5 @@ +import loadable from '@loadable/component'; + +export const MarkdownEditor = loadable(() => + import('./editor').then((module) => module.MarkdownEditor) +); diff --git a/server/admin/src/client/components/MarkdownEditor/plugins.ts b/server/admin/src/client/components/MarkdownEditor/plugins.ts new file mode 100644 index 00000000000..5c20381c804 --- /dev/null +++ b/server/admin/src/client/components/MarkdownEditor/plugins.ts @@ -0,0 +1,6 @@ +import gfm from '@bytemd/plugin-gfm'; + +export const plugins = [ + gfm(), + // Add more plugins here +]; diff --git a/server/admin/src/client/components/MarkdownEditor/style.less b/server/admin/src/client/components/MarkdownEditor/style.less new file mode 100644 index 00000000000..fcd2847a376 --- /dev/null +++ b/server/admin/src/client/components/MarkdownEditor/style.less @@ -0,0 +1,8 @@ +.bytemd .bytemd-toolbar-right [bytemd-tippy-path='5'] { + // Hidden github icon + display: none; +} + +.bytemd-fullscreen.bytemd { + z-index: 99; +} diff --git a/server/admin/src/client/components/TagItems.tsx b/server/admin/src/client/components/TagItems.tsx new file mode 100644 index 00000000000..64f693adf73 --- /dev/null +++ b/server/admin/src/client/components/TagItems.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { styled, Tag } from 'tushan'; + +const Root = styled.div` + * { + margin-right: 4px; + margin-bottom: 4px; + } +`; + +export const TagItems: React.FC<{ + items: string[]; +}> = React.memo((props) => { + return ( + + {props.items.map((item, i) => ( + {item} + ))} + + ); +}); +TagItems.displayName = 'TagItems'; diff --git a/server/admin/src/client/components/TailchatImage.tsx b/server/admin/src/client/components/TailchatImage.tsx new file mode 100644 index 00000000000..9a4461a186b --- /dev/null +++ b/server/admin/src/client/components/TailchatImage.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { parseUrlStr } from '../utils'; +import { Image as OriginImage, ImageProps, styled } from 'tushan'; + +const Image = styled(OriginImage)` + img { + max-width: 100%; + max-height: 100%; + } +`; + +export const TailchatImage: React.FC = React.memo((props) => { + return ; +}); +TailchatImage.displayName = 'TailchatImage'; diff --git a/server/admin/src/client/components/field/filesize.tsx b/server/admin/src/client/components/field/filesize.tsx new file mode 100644 index 00000000000..960963b6632 --- /dev/null +++ b/server/admin/src/client/components/field/filesize.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import filesize from 'filesize'; +import { createFieldFactory, FieldDetailComponent } from 'tushan'; + +export const FileSizeFieldDetail: FieldDetailComponent = React.memo((props) => { + return {filesize(Number(props.value))}; +}); +FileSizeFieldDetail.displayName = 'FileSizeFieldDetail'; + +export const createFileSizeField = createFieldFactory({ + detail: FileSizeFieldDetail, + edit: FileSizeFieldDetail, +}); diff --git a/server/admin/src/client/components/field/imageUrl.tsx b/server/admin/src/client/components/field/imageUrl.tsx new file mode 100644 index 00000000000..2ce4427b97e --- /dev/null +++ b/server/admin/src/client/components/field/imageUrl.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { createFieldFactory, FieldDetailComponent, Image, Link } from 'tushan'; + +export const ImageUrlFieldDetail: FieldDetailComponent = React.memo((props) => { + const url = props.value; + const isImage = ['.png', '.jpg', '.gif', '.jpeg', '.webp'].some((ext) => + String(url).endsWith(ext) + ); + + if (isImage) { + return ; + } + + return ( + + {props.value} + + ); +}); +ImageUrlFieldDetail.displayName = 'ImageUrlFieldDetail'; + +export const createImageUrlField = createFieldFactory({ + detail: ImageUrlFieldDetail, + edit: ImageUrlFieldDetail, +}); diff --git a/server/admin/src/client/components/field/user.tsx b/server/admin/src/client/components/field/user.tsx new file mode 100644 index 00000000000..f9916ece1f0 --- /dev/null +++ b/server/admin/src/client/components/field/user.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { + createFieldFactory, + FieldDetailComponent, + ReferenceFieldDetail, + ReferenceFieldOptions, +} from 'tushan'; + +const SYSTEM_USERID = '000000000000000000000000'; + +export const UserFieldDetail: FieldDetailComponent = React.memo((props) => { + if (props.value === SYSTEM_USERID) { + return
System
; + } + + return ; +}); +UserFieldDetail.displayName = 'UserFieldDetail'; + +export const createUserField = createFieldFactory({ + detail: UserFieldDetail, + edit: UserFieldDetail, +}); diff --git a/server/admin/src/client/fields.ts b/server/admin/src/client/fields.ts new file mode 100644 index 00000000000..100c77c7113 --- /dev/null +++ b/server/admin/src/client/fields.ts @@ -0,0 +1,228 @@ +import { + createEmailField, + createTextField, + createBooleanField, + createAvatarField, + createJSONField, + createDateTimeField, + createUrlField, + emailValidator, + createNumberField, + createReferenceField, + createTextAreaField, +} from 'tushan'; +import { createFileSizeField } from './components/field/filesize'; +import { createUserField } from './components/field/user'; +import { parseUrlStr } from './utils'; +import { createImageUrlField } from './components/field/imageUrl'; + +export const userFields = [ + createTextField('id', { + list: { + sort: true, + }, + }), + createEmailField('email', { + edit: { + rules: [ + { + required: true, + }, + { + validator: emailValidator, + }, + ], + }, + }), + createTextField('nickname'), + createTextField('discriminator', { + edit: { + rules: [ + { + required: true, + }, + { + match: /\d{4}/, + }, + ], + }, + }), + createBooleanField('temporary'), + createAvatarField('avatar', { + preRenderTransform: (val) => + typeof val === 'string' ? parseUrlStr(val) : val, + }), + createTextField('type', { + edit: { + hidden: true, + }, + }), + createBooleanField('emailVerified'), + createBooleanField('banned', { + edit: { + hidden: true, + }, + }), + createJSONField('settings', { + list: { + width: 200, + }, + }), + createDateTimeField('createdAt', { + format: 'iso', + edit: { + hidden: true, + }, + }), +]; + +export const messageFields = [ + createTextField('id', { + list: { + sort: true, + }, + }), + createTextAreaField('content', { + list: { + width: 400, + ellipsis: true, + }, + }), + createUserField('author', { + reference: 'users', + displayField: 'nickname', + list: { + width: 80, + }, + }), + createReferenceField('groupId', { + reference: 'groups', + displayField: 'name', + list: { + width: 80, + }, + }), + createTextField('converseId'), + createBooleanField('hasRecall'), + createJSONField('reactions'), + createDateTimeField('createdAt', { + format: 'iso', + edit: { + hidden: true, + }, + }), +]; + +export const groupFields = [ + createTextField('id'), + createTextField('name'), + createReferenceField('owner', { + reference: 'users', + displayField: (record) => `${record.nickname}#${record.discriminator}`, + list: { + width: 160, + }, + }), + createTextField('members.length', { + edit: { + hidden: true, + }, + }), + createTextField('panels.length', { + edit: { + hidden: true, + }, + }), + createJSONField('roles', { + edit: { + hidden: true, + }, + }), + createJSONField('fallbackPermissions', { + edit: { + hidden: true, + }, + }), + createDateTimeField('createdAt', { + format: 'iso', + edit: { + hidden: true, + }, + }), +]; + +export const fileFields = [ + createTextField('objectName', { + list: { + width: 320, + }, + }), + createImageUrlField('url', { + preRenderTransform: parseUrlStr, + list: { + width: 140, + }, + }), + createTextField('usage', { + list: { + width: 100, + }, + }), + createFileSizeField('size', { + list: { + width: 120, + sort: true, + }, + }), + createTextField('metaData.content-type'), + createTextField('etag', { + list: { + width: 300, + }, + }), + createUserField('userId', { + reference: 'users', + displayField: 'nickname', + list: { + width: 200, + ellipsis: true, + }, + }), + createDateTimeField('createdAt', { + list: { + sort: true, + }, + }), +]; + +export const mailFields = [ + createTextField('to'), + createTextField('subject'), + createTextField('host'), + createNumberField('port'), + createBooleanField('secure'), + createBooleanField('is_success'), + createJSONField('data'), + createTextField('error'), + createDateTimeField('createdAt'), +]; + +export const discoverFields = [ + createReferenceField('groupId', { + reference: 'groups', + displayField: 'name', + }), + createBooleanField('active', { + edit: { + default: true, + }, + }), + createNumberField('order', { + edit: { + default: 0, + }, + list: { + sort: true, + }, + }), +]; diff --git a/server/admin/src/client/global.css b/server/admin/src/client/global.css new file mode 100644 index 00000000000..c4018518a8b --- /dev/null +++ b/server/admin/src/client/global.css @@ -0,0 +1,7 @@ +.arco-table-th { + white-space: nowrap; +} +.arco-table-td { + /* white-space: nowrap; */ + overflow: hidden; +} diff --git a/server/admin/src/client/i18n/en.ts b/server/admin/src/client/i18n/en.ts new file mode 100644 index 00000000000..edaa2bacac9 --- /dev/null +++ b/server/admin/src/client/i18n/en.ts @@ -0,0 +1,102 @@ +import { i18nEnTranslation } from 'tushan/client/i18n/resources/en'; + +export const enTranslation = { + ...i18nEnTranslation, + resources: { + p_discover: { + name: 'Discover', + fields: { + groupId: 'Group ID', + active: 'Is Active', + order: 'Order', + }, + }, + }, + custom: { + action: { + resetPassword: 'Reset Password', + resetPasswordTip: + 'After resetting the password, the password becomes: 123456789, please change the password in time', + banUser: 'Ban User', + banUserDesc: + 'Banning a user disconnects the user from the current connection and prevents future logins', + unbanUser: 'Unban User', + unbanUserDesc: 'After lifting the ban, the user can login normally', + addGroupMember: 'Add Group Member', + addGroupMemberTitle: 'Select Member and append into group member', + addGroupMemberRequiredTip: 'You need select group member', + selectUser: 'Select User', + }, + dashboard: { + file: 'File', + messages: 'Messages', + newUserCount: 'New User Count', + messageCount: 'Message Count', + tip: { + github: + 'Tailchat: The next-generation noIM Application in your own workspace', + }, + }, + file: { + fileTotalSize: 'File Total Size', + }, + analytics: { + activeGroupTop5: 'Active Group Top 5', + activeUserTop5: 'Active User Top 5', + largeGroupTop5: 'Large Group Top 5', + fileStorageUserTop5: 'File Storage User Top 5', + }, + network: { + nodeList: 'Node List', + id: 'ID', + hostname: 'Host Name', + cpuUsage: 'CPU Usage', + ipList: 'IP List', + sdkVersion: 'SDK Version', + serviceList: 'Service List', + actionList: 'Action List', + eventList: 'Event List', + }, + socketio: { + tip1: 'The server URL is:', + tip2: 'The account password is the account password of Tailchat Admin', + tip3: 'NOTICE: please check "Advanced options" then select "websocket only" and "MessagePack parser"', + btn: 'Open the Admin platform', + }, + config: { + uploadFileLimit: 'Upload file limit (Byte)', + emailVerification: 'Mandatory Email Verification', + allowGuestLogin: 'Allow Guest Login', + allowUserRegister: 'Allow User Register', + allowCreateGroup: 'Allow Create Group', + serverName: 'Server Name', + serverEntryImage: 'Server Entry Page Image', + configPanel: 'Config', + announcementPanel: 'Announcement', + announcementEnable: 'Is Enable Announcement', + announcementText: 'Announcement Text', + announcementLink: 'Announcement Link', + announcementLinkTip: + 'This content is optional, and it is the address to announce more content', + }, + cache: { + cleanTitle: 'Are you sure you want to clear the cache?', + cleanDesc: + 'Please be cautious in the production environment, clearing the cache may lead to increased pressure on the database in a short period of time', + cleanConfigBtn: 'Clean Client Config Cache', + cleanAllBtn: 'Clean All Cache', + }, + 'system-notify': { + create: 'Create System Notify', + tip: 'The system notification will be sent to the corresponding user in the form of inbox', + title: 'Title', + content: 'Content', + scope: 'Notify Scope', + allUser: 'All User', + allUserTip: + 'All users excluding temporary users. Also, if there are many users, it may not be possible to notify all users at once', + specifiedUser: 'Specified User', + notifySuccess: 'Sent successfully, sent to ${data.userIds.length} users', + }, + }, +}; diff --git a/server/admin/src/client/i18n/index.ts b/server/admin/src/client/i18n/index.ts new file mode 100644 index 00000000000..6a6b90591f2 --- /dev/null +++ b/server/admin/src/client/i18n/index.ts @@ -0,0 +1,18 @@ +import type { TushanContextProps } from 'tushan'; +import { enTranslation } from './en'; +import { zhTranslation } from './zh'; + +export const i18n: TushanContextProps['i18n'] = { + languages: [ + { + key: 'en', + label: 'English', + translation: enTranslation, + }, + { + key: 'zh', + label: '简体中文', + translation: zhTranslation, + }, + ], +}; diff --git a/server/admin/src/client/i18n/zh.ts b/server/admin/src/client/i18n/zh.ts new file mode 100644 index 00000000000..a950a9ab48b --- /dev/null +++ b/server/admin/src/client/i18n/zh.ts @@ -0,0 +1,192 @@ +import { i18nZhTranslation } from 'tushan/client/i18n/resources/zh'; + +export const zhTranslation = { + ...i18nZhTranslation, + resources: { + analytics: { + name: '分析', + }, + users: { + name: '用户管理', + fields: { + id: '用户ID', + email: '邮箱', + avatar: '头像', + username: '用户名', + password: '密码', + nickname: '昵称', + discriminator: '标识符', + temporary: '是否游客', + type: '用户类型', + emailVerified: '邮箱校验', + settings: '用户设置', + banned: '是否被封禁', + createdAt: '创建时间', + }, + }, + messages: { + name: '消息管理', + fields: { + content: '内容', + author: '作者', + groupId: '群组ID', + converseId: '会话ID', + hasRecall: '撤回', + reactions: '消息反应', + createdAt: '创建时间', + }, + }, + groups: { + name: '群组管理', + fields: { + id: '群组ID', + name: '群组名称', + avatar: '头像', + owner: '管理员', + 'members.length': '成员数量', + 'panels.length': '面板数量', + roles: '角色', + config: '配置信息', + fallbackPermissions: '默认权限', + createdAt: '创建时间', + updatedAt: '更新时间', + }, + }, + file: { + name: '文件管理', + fields: { + objectName: '对象存储名', + url: '文件路径', + size: '文件大小', + usage: '使用场景', + 'metaData.content-type': '文件类型', + userId: '存储用户', + createdAt: '创建时间', + }, + }, + mail: { + name: '邮件历史', + fields: { + userId: '用户ID', + to: '目标邮箱', + subject: '邮件主题', + host: '发信主机', + port: '发信端口', + secure: '是否加密', + is_success: '是否成功', + data: '数据', + error: '错误信息', + createdAt: '创建时间', + }, + }, + p_discover: { + name: '探索', + fields: { + groupId: '群组ID', + active: '是否活跃', + order: '排序', + }, + }, + system: { + name: '系统设置', + }, + network: { + name: '微服务网络', + }, + socketio: { + name: 'Socket.IO 长链接', + }, + cache: { + name: '缓存管理', + }, + 'system-notify': { + name: '系统通知', + }, + }, + category: { + plugins: '插件', + }, + custom: { + action: { + resetPassword: '重置密码', + resetPasswordTip: '重置密码后密码变为: 123456789, 请及时修改密码', + banUser: '封禁用户', + banUserDesc: '封禁用户会将用户从当前连接断开并阻止之后的登录操作', + unbanUser: '解除封禁用户', + unbanUserDesc: '解除封禁后用户可以正常登录', + addGroupMember: '增加群组成员', + addGroupMemberTitle: '选择用户并添加为群组成员', + addGroupMemberRequiredTip: '你需要选择用户', + selectUser: '选择用户', + }, + dashboard: { + file: '文件', + messages: '消息数', + newUserCount: '用户新增', + messageCount: '消息数', + tip: { + github: 'Tailchat 是在你私有空间内的下一代noIM应用', + tushan: 'Tailchat Admin后台 由 tushan 提供技术支持', + }, + }, + file: { + fileTotalSize: '文件总大小', + }, + analytics: { + activeGroupTop5: '前 5 名活跃群组', + activeUserTop5: '前 5 名活跃用户', + largeGroupTop5: '最大的 5 个群组', + fileStorageUserTop5: '文件存储用量最大 5 名用户', + }, + network: { + nodeList: '节点列表', + id: 'ID', + hostname: '主机名', + cpuUsage: 'CPU占用', + ipList: 'IP地址列表', + sdkVersion: 'SDK版本', + serviceList: '服务列表', + actionList: '操作列表', + eventList: '事件列表', + }, + socketio: { + tip1: '服务器URL为:', + tip2: '账号密码为Tailchat后台的账号密码', + tip3: '注意: 请打开 "Advanced options" 并选中 "websocket only" 与 "MessagePack parser"', + btn: '打开管理平台', + }, + config: { + uploadFileLimit: '上传文件限制(Byte)', + emailVerification: '邮箱强制验证', + allowGuestLogin: '允许访客登录', + allowUserRegister: '允许用户注册', + allowCreateGroup: '允许创建群组', + serverName: '服务器名', + serverEntryImage: '服务器登录图', + configPanel: '配置', + announcementPanel: '公告', + announcementEnable: '是否启用公告', + announcementText: '公告文本', + announcementLink: '公告链接', + announcementLinkTip: '该内容可选,为公告更多内容的地址', + }, + cache: { + cleanTitle: '确定要清理缓存么?', + cleanDesc: '生产环境请谨慎操作, 清理缓存可能会导致短时间内数据库压力增加', + cleanConfigBtn: '清理配置缓存', + cleanAllBtn: '清理所有缓存', + }, + 'system-notify': { + create: '创建系统通知', + tip: '系统通知将会以收件箱的形式发送给对应的用户', + title: '标题', + content: '内容', + scope: '通知范围', + allUser: '所有用户', + allUserTip: + '所有用户不包含临时用户。另外,如果用户很多,可能会无法立即通知所有用户', + specifiedUser: '指定用户', + notifySuccess: '发送成功,已发送给 ${count} 名用户', + }, + }, +}; diff --git a/server/admin/src/client/main.tsx b/server/admin/src/client/main.tsx new file mode 100644 index 00000000000..97733c6a58d --- /dev/null +++ b/server/admin/src/client/main.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './global.css'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + +); diff --git a/server/admin/src/client/request.ts b/server/admin/src/client/request.ts new file mode 100644 index 00000000000..8c5d69afd88 --- /dev/null +++ b/server/admin/src/client/request.ts @@ -0,0 +1,41 @@ +import axios from 'axios'; +import { authStorageKey } from './auth'; +import _set from 'lodash/set'; + +/** + * 创建请求实例 + */ +function createRequest() { + const ins = axios.create({ + baseURL: '/admin/api', + }); + + ins.interceptors.request.use(async (val) => { + try { + const { token } = JSON.parse( + window.localStorage.getItem(authStorageKey) ?? '{}' + ); + _set(val, ['headers', 'Authorization'], `Bearer ${token}`); + + return val; + } catch (err) { + throw err; + } + }); + + return ins; +} + +export const request = createRequest(); + +export async function callAction( + actionName: string, + params: Record +) { + const { data } = await request.post('/callAction', { + action: actionName, + params, + }); + + return data; +} diff --git a/server/admin/src/client/resources/file.tsx b/server/admin/src/client/resources/file.tsx new file mode 100644 index 00000000000..86fc3b5af3b --- /dev/null +++ b/server/admin/src/client/resources/file.tsx @@ -0,0 +1,88 @@ +import filesize from 'filesize'; +import React, { useState } from 'react'; +import { + createTextField, + createSelectField, + ListTable, + useAsync, + useTranslation, + Typography, + styled, + Checkbox, +} from 'tushan'; +import { fileFields } from '../fields'; +import { request } from '../request'; + +const Row = styled.div` + display: flex; + gap: 20px; + justify-content: end; +`; + +export const FileList: React.FC = React.memo(() => { + const { t } = useTranslation(); + const [isOnlyChatFiles, setIsOnlyChatFiles] = useState(false); + const { value: totalSize = 0 } = useAsync(async () => { + const { data } = await request.get('/file/filesizeSum'); + + return data.totalSize ?? 0; + }, []); + + return ( + <> + + { + setIsOnlyChatFiles(!isOnlyChatFiles); + }} + > + Only show chat files + + + {t('custom.file.fileTotalSize')}: {filesize(totalSize)} + + + + + + ); +}); +FileList.displayName = 'FileList'; diff --git a/server/admin/src/client/resources/group.tsx b/server/admin/src/client/resources/group.tsx new file mode 100644 index 00000000000..93f244f2e95 --- /dev/null +++ b/server/admin/src/client/resources/group.tsx @@ -0,0 +1,100 @@ +import React, { useState } from 'react'; +import { + createTextField, + Identifier, + ListTable, + Message, + Modal, + ReferenceFieldEdit, + useEvent, + useTranslation, +} from 'tushan'; +import { groupFields } from '../fields'; +import { callAction } from '../request'; + +export const GroupList: React.FC = React.memo(() => { + const { t } = useTranslation(); + const [modal, contextHolder] = Modal.useModal(); + return ( + <> + {contextHolder} + [ + { + key: 'addGroupMember', + label: t('custom.action.addGroupMember'), + onClick: () => { + let userId: Identifier; + const { close } = modal.confirm({ + title: t('custom.action.addGroupMemberTitle'), + content: ( +
+
{t('custom.action.selectUser')}:
+ (userId = val)} /> +
+ ), + onOk: async () => { + if (!userId) { + Message.error( + t('custom.action.addGroupMemberRequiredTip') + ); + return; + } + + try { + await callAction('group.addMember', { + groupId: record.id, + userId, + }); + Message.success(t('tushan.common.success')); + close(); + } catch (err) { + console.error(err); + Message.error(String(err)); + } + }, + }); + }, + }, + ], + }} + /> + + ); +}); +GroupList.displayName = 'GroupList'; + +export const UserSelector: React.FC<{ onChange: (val: Identifier) => void }> = + React.memo((props) => { + const [userId, setUserId] = useState(''); + + const handleChange = useEvent((val: Identifier) => { + setUserId(val); + props.onChange(val); + }); + + return ( + + `${record.nickname}#${record.discriminator}`, + reference: 'users', + }} + /> + ); + }); +UserSelector.displayName = 'UserSelector'; diff --git a/server/admin/src/client/resources/user.tsx b/server/admin/src/client/resources/user.tsx new file mode 100644 index 00000000000..d52131a89c8 --- /dev/null +++ b/server/admin/src/client/resources/user.tsx @@ -0,0 +1,115 @@ +import React from 'react'; +import { + createTextField, + ListTable, + Message, + Modal, + useRefreshList, + useResourceContext, + useTranslation, + useUpdate, +} from 'tushan'; +import { userFields } from '../fields'; +import { request } from '../request'; + +export const UserList: React.FC = React.memo(() => { + const { t } = useTranslation(); + const [update] = useUpdate(); + const resource = useResourceContext(); + const refreshUser = useRefreshList(resource); + + return ( + [ + { + key: 'resetPassword', + label: t('custom.action.resetPassword'), + onClick: () => { + const { close } = Modal.confirm({ + title: t('tushan.common.confirmTitle'), + content: t('custom.action.resetPasswordTip'), + onConfirm: async () => { + try { + await update(resource, { + id: record.id, + data: { + password: + '$2a$10$eSebpg0CEvsbDC7j1NxB2epMUkYwKhfT8vGdPQYkfeXYMqM8HjnpW', // 123456789 + }, + }); + Message.success(t('tushan.common.success')); + close(); + } catch (err) { + console.error(err); + Message.error(String(err)); + } + }, + }); + }, + }, + !record.banned + ? { + key: 'banUser', + label: t('custom.action.banUser'), + onClick: () => { + const { close } = Modal.confirm({ + title: t('tushan.common.confirmTitle'), + content: t('custom.action.banUserDesc'), + onConfirm: async () => { + try { + await request.post('/user/ban', { + userId: record.id, + }); + Message.success(t('tushan.common.success')); + refreshUser(); + close(); + } catch (err) { + console.error(err); + Message.error(String(err)); + } + }, + }); + }, + } + : { + key: 'unbanUser', + label: t('custom.action.unbanUser'), + onClick: () => { + const { close } = Modal.confirm({ + title: t('tushan.common.confirmTitle'), + content: t('custom.action.unbanUserDesc'), + onConfirm: async () => { + try { + await request.post('/user/unban', { + userId: record.id, + }); + Message.success(t('tushan.common.success')); + refreshUser(); + close(); + } catch (err) { + console.error(err); + Message.error(String(err)); + } + }, + }); + }, + }, + ], + }} + /> + ); +}); +UserList.displayName = 'UserList'; diff --git a/server/admin/src/client/routes/analytics/index.tsx b/server/admin/src/client/routes/analytics/index.tsx new file mode 100644 index 00000000000..860b9751667 --- /dev/null +++ b/server/admin/src/client/routes/analytics/index.tsx @@ -0,0 +1,203 @@ +import fileSize from 'filesize'; +import React from 'react'; +import { + Card, + Grid, + Tooltip, + Typography, + useAsync, + useTranslation, +} from 'tushan'; +import { + Bar, + BarChart, + CartesianGrid, + ResponsiveContainer, + XAxis, + YAxis, +} from 'tushan/chart'; +import { request } from '../../request'; + +export const TailchatAnalytics: React.FC = React.memo(() => { + const { t } = useTranslation(); + + return ( +
+ + + + + {t('custom.analytics.activeGroupTop5')} + + + + + + + + + + {t('custom.analytics.activeUserTop5')} + + + + + + + + + + + + {t('custom.analytics.largeGroupTop5')} + + + + + + + + + + {t('custom.analytics.fileStorageUserTop5')} + + + + + + +
+ ); +}); +TailchatAnalytics.displayName = 'TailchatAnalytics'; + +const ActiveGroupChart: React.FC = React.memo(() => { + const { value } = useAsync(async () => { + const { data } = await request.get<{ + activeGroups: { + groupId: string; + groupName: string; + messageCount: number; + }[]; + }>('/analytics/activeGroups'); + + return data.activeGroups; + }, []); + + return ( + + + + + + + + + + ); +}); +ActiveGroupChart.displayName = 'ActiveGroupChart'; + +const ActiveUserChart: React.FC = React.memo(() => { + const { value } = useAsync(async () => { + const { data } = await request.get<{ + activeUsers: { + groupId: string; + groupName: string; + messageCount: number; + }[]; + }>('/analytics/activeUsers'); + + return data.activeUsers; + }, []); + + return ( + + + + + + + + + + ); +}); +ActiveUserChart.displayName = 'ActiveUserChart'; + +const LargeGroupChart: React.FC = React.memo(() => { + const { value } = useAsync(async () => { + const { data } = await request.get<{ + largeGroups: { + name: string; + memberCount: number; + }[]; + }>('/analytics/largeGroups'); + + return data.largeGroups; + }, []); + + return ( + + + + + + + + + + ); +}); +LargeGroupChart.displayName = 'LargeGroupChart'; + +const FileStorageChart: React.FC = React.memo(() => { + const { value } = useAsync(async () => { + const { data } = await request.get<{ + fileStorageUserTop: { + userId: string; + userName: string; + fileStorageTotal: number; + }[]; + }>('/analytics/fileStorageUserTop'); + + return data.fileStorageUserTop; + }, []); + + return ( + + + + fileSize(val)} + /> + + + + + + ); +}); +FileStorageChart.displayName = 'FileStorageChart'; diff --git a/server/admin/src/client/routes/cache.tsx b/server/admin/src/client/routes/cache.tsx new file mode 100644 index 00000000000..46a295ff10b --- /dev/null +++ b/server/admin/src/client/routes/cache.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { + Button, + Card, + Message, + Popconfirm, + Space, + useAsyncRequest, + useTranslation, +} from 'tushan'; +import { request } from '../request'; + +/** + * 缓存管理 + */ +export const CacheManager: React.FC = React.memo(() => { + const { t } = useTranslation(); + const [, cleanCache] = useAsyncRequest(async (target?: string) => { + const { data } = await request.post('/cache/clean', { + target, + }); + + if (!data.success) { + Message.error(t('tushan.common.failed') + ':' + data.msg); + throw new Error(data.msg); + } + + Message.success(t('tushan.common.success')); + }); + + return ( + + + cleanCache('config.client')} + > + + + + cleanCache()} + > + + + + + ); +}); +CacheManager.displayName = 'CacheManager'; diff --git a/server/admin/src/client/routes/network/index.tsx b/server/admin/src/client/routes/network/index.tsx new file mode 100644 index 00000000000..cfcfb157f22 --- /dev/null +++ b/server/admin/src/client/routes/network/index.tsx @@ -0,0 +1,94 @@ +import React from 'react'; +import { request } from '../../request'; +import _uniq from 'lodash/uniq'; +import { TagItems } from '../../components/TagItems'; +import { + Card, + Spin, + Table, + Typography, + useAsync, + useTranslation, +} from 'tushan'; + +/** + * Tailchat 网络状态 + */ +export const TailchatNetwork: React.FC = React.memo(() => { + const { value: data, loading } = useAsync(async () => { + const { data } = await request('/network/all'); + + return data; + }); + const { t } = useTranslation(); + + if (loading) { + return ; + } + + return ( + + + {t('custom.network.nodeList')} + + +
( +
+ {id} + {item.local && (*)} +
+ ), + }, + { + dataIndex: 'hostname', + title: 'Host', + }, + { + dataIndex: 'cpu', + title: 'CPU', + render: (usage) => usage + '%', + }, + { + dataIndex: 'ipList', + title: 'IP', + render: (ips) => , + }, + { + dataIndex: 'client.version', + title: 'Client Version', + }, + ]} + data={data.nodes ?? []} + /> + + + {t('custom.network.serviceList')} + + +
+ (data.services ?? [])} /> +
+ + + {t('custom.network.actionList')} + +
+ (data.actions ?? [])} /> +
+ + + {t('custom.network.eventList')} + + +
+ (data.events ?? [])} /> +
+ + ); +}); +TailchatNetwork.displayName = 'TailchatNetwork'; diff --git a/server/admin/src/client/routes/socketio.tsx b/server/admin/src/client/routes/socketio.tsx new file mode 100644 index 00000000000..505ed92f2d1 --- /dev/null +++ b/server/admin/src/client/routes/socketio.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Button, Card, Typography, useTranslation } from 'tushan'; + +/** + * SocketIO 管理 + */ +export const SocketIOAdmin: React.FC = React.memo(() => { + const protocol = window.location.protocol === 'https:' ? 'wss' : 'ws'; + const { t } = useTranslation(); + + return ( + +
+ + {t('custom.socketio.tip1')}{' '} + + {protocol}://{window.location.host} + + + {t('custom.socketio.tip2')} + {t('custom.socketio.tip3')} +
+ + +
+ ); +}); +SocketIOAdmin.displayName = 'SocketIOAdmin'; diff --git a/server/admin/src/client/routes/system/index.tsx b/server/admin/src/client/routes/system/index.tsx new file mode 100644 index 00000000000..51af0b799cf --- /dev/null +++ b/server/admin/src/client/routes/system/index.tsx @@ -0,0 +1,245 @@ +import React, { useEffect } from 'react'; +import { request } from '../../request'; +import { + useAsyncRequest, + useEditValue, + Button, + Input, + Spin, + Message, + Form, + Upload, + useTranslation, + Card, + Tabs, + Switch, +} from 'tushan'; +import _get from 'lodash/get'; +import { IconCheck, IconClose, IconDelete } from 'tushan/icon'; +import { TailchatImage } from '../../components/TailchatImage'; + +/** + * Tailchat 系统设置 + */ +export const SystemConfig: React.FC = React.memo(() => { + const [{ value: config = {}, loading, error }, fetchConfig] = useAsyncRequest( + async () => { + const { data } = await request.get('/config/client'); + + return data.config ?? {}; + } + ); + const { t } = useTranslation(); + + useEffect(() => { + fetchConfig(); + }, []); + + const [serverName, setServerName, saveServerName] = useEditValue( + config?.serverName, + async (val) => { + if (val === config?.serverName) { + return; + } + + try { + await request.patch('/config/client', { + key: 'serverName', + value: val, + }); + fetchConfig(); + Message.success(t('tushan.common.success')); + } catch (err) { + console.log(err); + Message.error(String(err)); + } + } + ); + + const [{}, handleChangeServerEntryImage] = useAsyncRequest( + async (file: File | null) => { + if (file) { + const formdata = new FormData(); + formdata.append('file', file); + formdata.append('usage', 'server'); + + const { data } = await request.put('/file/upload', formdata, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + + const fileInfo = data.files[0]; + + if (!fileInfo) { + throw new Error('not get file'); + } + + const url = fileInfo.url; + await request.patch('/config/client', { + key: 'serverEntryImage', + value: url, + }); + fetchConfig(); + } else { + // delete + await request.patch('/config/client', { + key: 'serverEntryImage', + value: '', + }); + fetchConfig(); + } + } + ); + + const [{}, handleChangeAnnouncement] = useAsyncRequest( + async (values: { enable: boolean; link: string; text: string }) => { + console.log(values); + const { enable = false, link = '', text = '' } = values; + + if (enable) { + await request.patch('/config/client', { + key: 'announcement', + value: { + id: Date.now(), + text, + link, + }, + }); + } else { + await request.patch('/config/client', { + key: 'announcement', + value: false, + }); + } + + Message.success(t('tushan.common.success')); + } + ); + + if (loading) { + return ; + } + + if (error) { + console.log('error', error); + return
{String(error)}
; + } + + return ( + + + +
+ + {config.uploadFileLimit} + + + + {config.emailVerification ? : } + + + + {!config.disableGuestLogin ? : } + + + + {!config.disableUserRegister ? : } + + + + {!config.disableCreateGroup ? : } + + + + setServerName(val)} + onBlur={() => saveServerName()} + placeholder="Tailchat" + /> + + + +
+ {config?.serverEntryImage ? ( +
+
+ +
+ + +
+ ) : ( + { + handleChangeServerEntryImage(file.originFile); + }} + /> + )} +
+
+ +
+ + +
+ + + + + + + + + + + + + +
+
+
+ ); +}); +SystemConfig.displayName = 'SystemConfig'; + +export const SwitchFormInput: React.FC<{ + value?: boolean; + onChange?: (val: boolean) => void; +}> = React.memo((props) => { + return ; +}); +SwitchFormInput.displayName = 'SwitchFormInput'; diff --git a/server/admin/src/client/routes/system/notify.tsx b/server/admin/src/client/routes/system/notify.tsx new file mode 100644 index 00000000000..c462d97a091 --- /dev/null +++ b/server/admin/src/client/routes/system/notify.tsx @@ -0,0 +1,147 @@ +import React from 'react'; +import { + Button, + Input, + Form, + useTranslation, + Typography, + Card, + Radio, + ReferenceFieldEdit, + useAsyncRequest, + Tooltip, + Message, +} from 'tushan'; +import { IconExclamationCircle } from 'tushan/icon'; +import { MarkdownEditor } from '../../components/MarkdownEditor'; +import { request } from '../../request'; + +/** + * Tailchat 系统通知 + * + * 发送markdown格式的消息到指定用户的收件箱 + */ +export const SystemNotify: React.FC = React.memo(() => { + const { t } = useTranslation(); + const [form] = Form.useForm(); + const scope: 'all' | 'specified' = Form.useWatch('scope', form); + + const [{ loading }, handleSubmit] = useAsyncRequest(async (values) => { + const { data } = await request.post('/users/system/notify', { + scope: values.scope, + specifiedUser: values.specifiedUser, + title: values.title, + content: values.content, + }); + + Message.success( + t('custom.system-notify.notifySuccess', { count: data.userIds.length }) + ); + }); + + return ( + + + {t('custom.system-notify.create')} + + + {t('custom.system-notify.tip')} + + +
+ + + + + + + + + + + + {t('custom.system-notify.allUser')} + + + + + + + {t('custom.system-notify.specifiedUser')} + + + + + {scope === 'specified' && ( + + + + )} + + + + + +
+ ); +}); +SystemNotify.displayName = 'SystemNotify'; + +export const MarkdownFormInput: React.FC<{ + value?: string; + onChange?: (val: string) => void; +}> = React.memo((props) => { + const value = props.value || ''; + + const handleChange = (newValue) => { + props.onChange && props.onChange(newValue); + }; + + return ; +}); +MarkdownFormInput.displayName = 'MarkdownFormInput'; + +export const UserSelectedFormInput: React.FC<{ + value?: string; + onChange?: (val: string) => void; +}> = React.memo((props) => { + const value = props.value || ''; + + const handleChange = (newValue) => { + props.onChange && props.onChange(newValue); + }; + + /** + * Wait for ReferenceMany + */ + return ( + + ); +}); +UserSelectedFormInput.displayName = 'UserSelectedFormInput'; diff --git a/server/admin/src/client/utils.ts b/server/admin/src/client/utils.ts new file mode 100644 index 00000000000..bfb26b3780e --- /dev/null +++ b/server/admin/src/client/utils.ts @@ -0,0 +1,13 @@ +/** + * parse url, and replace some constants with variable + * @param originUrl 原始Url + * @returns 解析后的url + */ +export function parseUrlStr(originUrl: string): string { + return String(originUrl).replace( + '{BACKEND}', + process.env.NODE_ENV === 'development' + ? 'http://localhost:11000/' + : window.location.origin + ); +} diff --git a/server/admin/src/client/vite-env.d.ts b/server/admin/src/client/vite-env.d.ts new file mode 100644 index 00000000000..11f02fe2a00 --- /dev/null +++ b/server/admin/src/client/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/server/admin/src/server/broker.ts b/server/admin/src/server/broker.ts new file mode 100644 index 00000000000..12585c5a26d --- /dev/null +++ b/server/admin/src/server/broker.ts @@ -0,0 +1,28 @@ +import { TcBroker, SYSTEM_USERID } from 'tailchat-server-sdk'; +import brokerConfig from '../../../moleculer.config'; + +const transporter = process.env.TRANSPORTER; +export const broker = new TcBroker({ + ...brokerConfig, + metrics: false, + logger: false, + transporter, +}); + +broker.start().then(() => { + console.log('Connnected to Tailchat network, TRANSPORTER: ', transporter); +}); + +export function callBrokerAction( + actionName: string, + params: any, + opts?: Record +): Promise { + return broker.call(actionName, params, { + ...opts, + meta: { + ...opts?.meta, + userId: SYSTEM_USERID, + }, + }); +} diff --git a/server/admin/src/server/index.ts b/server/admin/src/server/index.ts new file mode 100644 index 00000000000..87eb17222c9 --- /dev/null +++ b/server/admin/src/server/index.ts @@ -0,0 +1,63 @@ +import express from 'express'; +import ViteExpress from 'vite-express'; +import mongoose from 'mongoose'; +import compression from 'compression'; +import morgan from 'morgan'; +import path from 'path'; +import dotenv from 'dotenv'; +dotenv.config({ path: path.resolve(__dirname, '../../../.env') }); +import { apiRouter } from './router/api'; + +const app = express(); + +const port = Number(process.env.ADMIN_PORT || 3000); + +if (!process.env.MONGO_URL) { + console.error('Require env: MONGO_URL'); + process.exit(1); +} + +// 链接数据库 +mongoose.connect(process.env.MONGO_URL, (error: any) => { + if (!error) { + return console.info('Datebase connected'); + } + console.error('Datebase connect error', error); +}); + +app.use(compression()); +app.use(express.json()); + +// http://expressjs.com/en/advanced/best-practice-security.html#at-a-minimum-disable-x-powered-by-header +app.disable('x-powered-by'); + +// Remix fingerprints its assets so we can cache forever. +app.use( + '/build', + express.static('public/build', { immutable: true, maxAge: '1y' }) +); + +// Everything else (like favicon.ico) is cached for an hour. You may want to be +// more aggressive with this caching. +app.use(express.static('public', { maxAge: '1h' })); + +app.use(morgan('tiny')); + +app.use('/admin/api', apiRouter); + +app.use((err: any, req: any, res: any, next: any) => { + res.status(500); + res.json({ error: err.message }); +}); + +if (process.env.NODE_ENV === 'production') { + ViteExpress.config({ + mode: 'production', + }); +} + +ViteExpress.listen(app, port, () => { + console.log( + `Server is listening on port ${port}, visit with: http://localhost:${port}/admin/` + ); +}); diff --git a/server/admin/src/server/middleware/auth.ts b/server/admin/src/server/middleware/auth.ts new file mode 100644 index 00000000000..ee157f7032a --- /dev/null +++ b/server/admin/src/server/middleware/auth.ts @@ -0,0 +1,39 @@ +import type { NextFunction, Request, Response } from 'express'; +import jwt from 'jsonwebtoken'; +import md5 from 'md5'; + +export const adminAuth = { + username: process.env.ADMIN_USER, + password: process.env.ADMIN_PASS, +}; + +export const authSecret = + (process.env.SECRET || 'tailchat') + md5(JSON.stringify(adminAuth)); // 增加一个md5的盐值确保SECRET没有设置的情况下只修改了用户名密码也不会被人伪造token秘钥 + +export function auth() { + return (req: Request, res: Response, next: NextFunction) => { + try { + const authorization = req.headers.authorization; + if (!authorization) { + res.status(401).end('not found authorization in headers'); + return; + } + + const token = authorization.slice('Bearer '.length); + + const payload = jwt.verify(token, authSecret); + if (typeof payload === 'string') { + res.status(401).end('payload type error'); + return; + } + if (payload.platform !== 'admin') { + res.status(401).end('Payload invalid'); + return; + } + + next(); + } catch (err) { + res.status(401).end(String(err)); + } + }; +} diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/README.md b/server/admin/src/server/middleware/express-mongoose-ra-json-server/README.md new file mode 100644 index 00000000000..2faf8b58ef9 --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/README.md @@ -0,0 +1,4 @@ +fork from https://github.com/NathanAdhitya/express-mongoose-ra-json-server + +modify: +- count logic in get `/` diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/index.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/index.ts new file mode 100644 index 00000000000..c3e082b9be0 --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/index.ts @@ -0,0 +1,259 @@ +import { RequestHandler, Router } from 'express'; +import type { LeanDocument } from 'mongoose'; +import statusMessages from './statusMessages'; +import type { ADPBaseModel, ADPBaseSchema } from './utils/baseModel.interface'; +import castFilter from './utils/castFilter'; +import convertId from './utils/convertId'; +import filterGetList from './utils/filterGetList'; +import { filterReadOnly } from './utils/filterReadOnly'; +import parseQuery from './utils/parseQuery'; +import virtualId from './utils/virtualId'; + +// Export certain helper functions for custom reuse. +export { default as virtualId } from './utils/virtualId'; +export { default as convertId } from './utils/convertId'; +export { default as castFilter } from './utils/castFilter'; +export { default as parseQuery } from './utils/parseQuery'; +export { default as filterGetList } from './utils/filterGetList'; +export { filterReadOnly } from './utils/filterReadOnly'; +export { default as statusMessages } from './statusMessages'; + +export interface raExpressMongooseCapabilities { + list?: boolean; + get?: boolean; + create?: boolean; + update?: boolean; + delete?: boolean; +} + +export interface raExpressMongooseOptions { + /** Fields to search from ?q (used for autofill and search) */ + q?: string[]; + + /** Base name for ACLs (e.g. list operation does baseName.list) */ + aclName?: string; + + /** Fields to allow regex based search (non-exact search) */ + allowedRegexFields?: string[]; + + /** Read-only fields to filter out during create and update */ + readOnlyFields?: string[]; + + /** Function to transform inputs received in create and update */ + inputTransformer?: (input: Partial) => Promise>; + + /** Additional queries for list, e.g. deleted/hidden flag. */ + listQuery?: Record; + + /** Max rows from a get operation to prevent accidental server suicide (default 100) */ + maxRows?: number; + + /** Extra selects for mongoose queries (in the case that certain fields are hidden by default) */ + extraSelects?: string; + + /** Disable or enable certain parts. */ + capabilities?: raExpressMongooseCapabilities; + + /** Specify a custom express.js router */ + router?: Router; + + /** Specify an ACL middleware to check against permissions */ + ACLMiddleware?: (name: string) => RequestHandler; +} + +export function raExpressMongoose( + model: T, + options?: raExpressMongooseOptions +) { + const { + q, + allowedRegexFields = [], + readOnlyFields, + inputTransformer = (input: any) => input, + listQuery, + extraSelects, + maxRows = 100, + capabilities, + aclName, + router = Router(), + ACLMiddleware, + } = options ?? {}; + + const { + list: canList = true, + get: canGet = true, + create: canCreate = true, + update: canUpdate = true, + delete: canDelete = true, + } = capabilities ?? {}; + + /** getList, getMany, getManyReference */ + if (canList) + router.get( + '/', + aclName && ACLMiddleware + ? ACLMiddleware(`${aclName}.list`) + : (req, res, next) => next(), + async (req, res) => { + const filterQuery = { + ...listQuery, + ...parseQuery( + castFilter( + convertId(filterGetList(req.query)), + model, + allowedRegexFields + ), + model, + allowedRegexFields, + q + ), + }; + let query = model.find(filterQuery); + + if (req.query._sort && req.query._order) + query = query.sort({ + [typeof req.query._sort === 'string' + ? req.query._sort === 'id' + ? '_id' + : req.query._sort + : '_id']: req.query._order === 'ASC' ? 1 : -1, + }); + + if (req.query._start) + query = query.skip( + parseInt( + typeof req.query._start === 'string' ? req.query._start : '0' + ) + ); + + if (req.query._end) + query = query.limit( + Math.min( + parseInt( + typeof req.query._end === 'string' ? req.query._end : '0' + ) - + (req.query._start + ? parseInt( + typeof req.query._start === 'string' + ? req.query._start + : '0' + ) + : 0), + maxRows + ) + ); + else query = query.limit(maxRows); + + if (extraSelects) query = query.select(extraSelects); + + if (Object.keys(filterQuery).length === 0) { + res.set( + 'X-Total-Count', + (await model.estimatedDocumentCount()).toString() + ); + } else { + res.set( + 'X-Total-Count', + (await model.countDocuments(filterQuery)).toString() + ); + } + + return res.json( + virtualId((await query.lean()) as LeanDocument) + ); + } + ); + + /** getOne, getMany */ + if (canGet) + router.get( + '/:id', + aclName && ACLMiddleware + ? ACLMiddleware(`${aclName}.list`) + : (req, res, next) => next(), + async (req, res) => { + await model + .findById(req.params.id) + .select(extraSelects) + .lean() + .then((result) => res.json(virtualId(result))) + .catch((e) => { + return statusMessages.error(res, 400, e); + }); + } + ); + + /** create */ + if (canCreate) + router.post( + '/', + aclName && ACLMiddleware + ? ACLMiddleware(`${aclName}.create`) + : (req, res, next) => next(), + async (req, res) => { + // eslint-disable-next-line new-cap + const result = convertId( + await inputTransformer(filterReadOnly(req.body, readOnlyFields)) + ); + const newData = { + ...result, + }; + + const newEntry = new model(newData); + await newEntry + .save() + .then((result) => res.json(virtualId(result))) + .catch((e: any) => { + return statusMessages.error(res, 400, e, 'Bad request'); + }); + } + ); + + /** update */ + if (canUpdate) + router.put( + '/:id', + aclName && ACLMiddleware + ? ACLMiddleware(`${aclName}.edit`) + : (req, res, next) => next(), + async (req, res) => { + const updateData = { + ...(await convertId( + await inputTransformer(filterReadOnly(req.body, readOnlyFields)) + )), + }; + + await model + .findOneAndUpdate({ _id: req.params.id }, updateData, { + new: true, + runValidators: true, + }) + .lean() + .then((result) => res.json(virtualId(result))) + .catch((e) => { + return statusMessages.error(res, 400, e, 'Bad request'); + }); + } + ); + + /** + * delete + */ + if (canDelete) + router.delete( + '/:id', + aclName && ACLMiddleware + ? ACLMiddleware(`${aclName}.delete`) + : (req, res, next) => next(), + async (req, res) => { + await model + .findOneAndDelete({ _id: req.params.id }) + .then((result) => res.json(virtualId(result))) + .catch((e) => { + return statusMessages.error(res, 404, e, 'Element does not exist'); + }); + } + ); + + return router; +} diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/statusMessages.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/statusMessages.ts new file mode 100644 index 00000000000..5bc2b00043d --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/statusMessages.ts @@ -0,0 +1,24 @@ +/** + * @file statusMessages + * @description handles status messages / error responses + */ + +import type { Response } from 'express'; + +/** + * Handles rejections other than errors. 400, 401, etc. + */ +function reject(res: Response, status: number, reason?: any) { + return res.status(status).json({ message: reason ?? 'Invalid request' }); +} + +/** + * Handles errors + */ +function error(res: Response, status: number, e: Error, message?: string) { + if (process.env.NODE_ENV !== 'production') { + return res.status(status).json({ message, error: e.message }); + } +} + +export default { reject, error }; diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/baseModel.interface.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/baseModel.interface.ts new file mode 100644 index 00000000000..1f6a382a076 --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/baseModel.interface.ts @@ -0,0 +1,7 @@ +import type { Model, Document } from 'mongoose'; + +export interface ADPBaseSchema { + _id: string; +} + +export type ADPBaseModel = Model; diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/castFilter.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/castFilter.ts new file mode 100644 index 00000000000..0c1e1008d7c --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/castFilter.ts @@ -0,0 +1,35 @@ +import type { ADPBaseModel } from './baseModel.interface'; + +/** + * Turns all the params into their proper types, string into regexes. + * Only works with shallow objects. + * Mutates original object and returns mutated object. + */ +export default function castFilter( + obj: Record, + model: T, + allowedRegexes: string[] = [] +) { + const { path } = model.schema; + Object.keys(obj).forEach((key) => { + try { + obj[key] = path(key).cast(obj[key], null, null); + } catch (e) {} + + if (allowedRegexes.includes(key) && typeof obj[key] === 'string') { + obj[key] = new RegExp(escapeStringRegexp(obj[key])); + } + }); + + return obj; +} + +function escapeStringRegexp(string) { + if (typeof string !== 'string') { + throw new TypeError('Expected a string'); + } + + // Escape characters with special meaning either inside or outside character sets. + // Use a simple backslash escape when it’s always valid, and a `\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar. + return string.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d'); +} diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/convertId.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/convertId.ts new file mode 100644 index 00000000000..ae5b78606ea --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/convertId.ts @@ -0,0 +1,14 @@ +/** Turns id into _id for search queries */ +export default function convertId>(obj: T) { + if (obj.id) { + const newObject = { + _id: obj.id, + ...obj, + }; + + delete newObject.id; + return newObject; + } else { + return obj; + } +} diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/filterGetList.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/filterGetList.ts new file mode 100644 index 00000000000..470c948240b --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/filterGetList.ts @@ -0,0 +1,17 @@ +export const filterGetListParams = [ + '_sort', + '_order', + '_start', + '_end', +] as const; + +/** Removes _sort, _order, _start, _end from a query. */ +export default function filterGetList>( + obj: T +) { + const filtered: any = {}; + Object.entries(obj).forEach(([index, value]) => { + if (!filterGetListParams.includes(index as any)) filtered[index] = value; + }); + return filtered as Omit; +} diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/filterReadOnly.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/filterReadOnly.ts new file mode 100644 index 00000000000..57906468fb2 --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/filterReadOnly.ts @@ -0,0 +1,13 @@ +/** Makes sure that it does not modify crucial and sacred parts mutates the original object. */ +export function filterReadOnly( + obj: T, + readOnlyFields?: string[] +) { + if (!readOnlyFields) return obj as T; + + readOnlyFields.forEach((v) => { + delete obj[v]; + }); + + return obj as Partial; +} diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/parseQuery.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/parseQuery.ts new file mode 100644 index 00000000000..b589e4c643f --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/parseQuery.ts @@ -0,0 +1,38 @@ +import type { ADPBaseModel } from './baseModel.interface'; +import castFilter from './castFilter'; +import { isValidObjectId } from 'mongoose'; + +interface parseQueryParam { + q?: string; + $or?: any; +} + +/** + * Turns ?q into $or queries, deletes q + * @param {Object} results Original object with the q field + * @param {string[]} fields Fields to apply q to + */ +export default function parseQuery< + T extends parseQueryParam, + M extends ADPBaseModel +>( + result: T, + model: M, + allowedRegexes: string[], + fields?: string[] +): T & { $or?: any } { + if (!fields) return result; + if (result.q) { + if (!Array.isArray(result.$or)) result.$or = []; + fields.forEach((field) => { + if (field === '_id' && !isValidObjectId(result.q)) { + // Skip _id search in invalid objectid + return; + } + const newFilter = { [field]: result.q }; + result.$or.push(castFilter(newFilter, model, allowedRegexes)); + }); + delete result.q; + } + return result; +} diff --git a/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/virtualId.ts b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/virtualId.ts new file mode 100644 index 00000000000..308a2b0160f --- /dev/null +++ b/server/admin/src/server/middleware/express-mongoose-ra-json-server/utils/virtualId.ts @@ -0,0 +1,21 @@ +export default function virtualId( + arr: T[] +): Array; +export default function virtualId( + doc: T +): T & { id: string }; + +/** Virtual ID (_id to id) for react-admin */ +export default function virtualId(el: Array | T) { + if (Array.isArray(el)) { + return el.map((e) => { + return { + id: e._id, + ...e, + _id: undefined, + }; + }); + } + + return { id: el._id, ...el, _id: undefined }; +} diff --git a/server/admin/src/server/router/analytics.ts b/server/admin/src/server/router/analytics.ts new file mode 100644 index 00000000000..509aa939597 --- /dev/null +++ b/server/admin/src/server/router/analytics.ts @@ -0,0 +1,218 @@ +import { Router } from 'express'; +import { auth } from '../middleware/auth'; +import messageModel from '../../../../models/chat/message'; +import groupModel from '../../../../models/group/group'; +import fileModel from '../../../../models/file'; +import dayjs from 'dayjs'; +import { db } from 'tailchat-server-sdk'; + +const router = Router(); + +router.get('/activeGroups', auth(), async (req, res) => { + // 返回最近7天的最活跃的群组 + const day = 7; + const aggregateRes: { _id: string; count: number }[] = await messageModel + .aggregate([ + { + $match: { + createdAt: { + $gte: dayjs().subtract(day, 'd').startOf('d').toDate(), + $lt: dayjs().endOf('d').toDate(), + }, + }, + }, + { + $group: { + _id: '$groupId' as any, + count: { + $sum: 1, + }, + }, + }, + { + $sort: { + count: -1, + }, + }, + { + $limit: 5, + }, + { + $lookup: { + from: 'groups', + localField: '_id', + foreignField: '_id', + as: 'groupInfo', + }, + }, + { + $project: { + _id: 0, + groupId: '$_id', + messageCount: '$count', + groupName: { + $arrayElemAt: ['$groupInfo.name', 0], + }, + }, + }, + ]) + .exec(); + + const activeGroups = aggregateRes; + + res.json({ activeGroups }); +}); + +router.get('/activeUsers', auth(), async (req, res) => { + // 返回最近7天的最活跃的用户 + const day = 7; + const aggregateRes: { _id: string; count: number }[] = await messageModel + .aggregate([ + { + $match: { + author: { + $ne: new db.Types.ObjectId('000000000000000000000000'), + }, + createdAt: { + $gte: dayjs().subtract(day, 'd').startOf('d').toDate(), + $lt: dayjs().endOf('d').toDate(), + }, + }, + }, + { + $group: { + _id: '$author' as any, + count: { + $sum: 1, + }, + }, + }, + { + $sort: { + count: -1, + }, + }, + { + $limit: 5, + }, + { + $lookup: { + from: 'users', + localField: '_id', + foreignField: '_id', + as: 'userInfo', + }, + }, + { + $project: { + _id: 0, + userId: '$_id', + messageCount: '$count', + userName: { + $concat: [ + { + $arrayElemAt: ['$userInfo.nickname', 0], + }, + '#', + { + $arrayElemAt: ['$userInfo.discriminator', 0], + }, + ], + // $arrayElemAt: ['$userInfo.nickname', 0], + }, + }, + }, + ]) + .exec(); + + const activeUsers = aggregateRes; + + res.json({ activeUsers }); +}); + +router.get('/largeGroups', auth(), async (req, res) => { + // 返回最大的 5 个群组 + const limit = 5; + const aggregateRes: { _id: string; count: number }[] = await groupModel + .aggregate([ + { + $project: { + name: 1, + memberCount: { + $size: '$members', + }, + }, + }, + { + $sort: { + memberCount: -1, + }, + }, + { + $limit: limit, + }, + ]) + .exec(); + + const largeGroups = aggregateRes; + + res.json({ largeGroups }); +}); + +router.get('/fileStorageUserTop', auth(), async (req, res) => { + // 返回最大的 5 个群组 + const limit = 5; + const aggregateRes: { _id: string; count: number }[] = await fileModel + .aggregate([ + { + $group: { + _id: '$userId', + total: { + $sum: '$size', + }, + } as any, + }, + { + $sort: { + total: -1, + }, + }, + { + $limit: limit, + }, + { + $lookup: { + from: 'users', + localField: '_id', + foreignField: '_id', + as: 'userInfo', + }, + }, + { + $project: { + _id: 0, + userId: '$_id', + fileStorageTotal: '$total', + userName: { + $concat: [ + { + $arrayElemAt: ['$userInfo.nickname', 0], + }, + '#', + { + $arrayElemAt: ['$userInfo.discriminator', 0], + }, + ], + // $arrayElemAt: ['$userInfo.nickname', 0], + }, + }, + }, + ]) + .exec(); + + const fileStorageUserTop = aggregateRes; + + res.json({ fileStorageUserTop }); +}); + +export { router as analyticsRouter }; diff --git a/server/admin/src/server/router/api.ts b/server/admin/src/server/router/api.ts new file mode 100644 index 00000000000..5fa8330e6c9 --- /dev/null +++ b/server/admin/src/server/router/api.ts @@ -0,0 +1,376 @@ +import { Router } from 'express'; +import jwt from 'jsonwebtoken'; +import { broker, callBrokerAction } from '../broker'; +import { adminAuth, auth, authSecret } from '../middleware/auth'; +import { configRouter } from './config'; +import { networkRouter } from './network'; +import { fileRouter } from './file'; +import dayjs from 'dayjs'; +import userModel from '../../../../models/user/user'; +import messageModel from '../../../../models/chat/message'; +import fileModel from '../../../../models/file'; +import groupModel from '../../../../models/group/group'; +import { + raExpressMongoose, + virtualId, +} from '../middleware/express-mongoose-ra-json-server'; +import { cacheRouter } from './cache'; +import discoverModel from '../../../../plugins/com.msgbyte.discover/models/discover'; +import { analyticsRouter } from './analytics'; +import _ from 'lodash'; + +const router = Router(); + +router.post('/login', (req, res) => { + if (!adminAuth.username || !adminAuth.password) { + res.status(401).end('Server not set env: ADMIN_USER, ADMIN_PASS'); + return; + } + + const { username, password } = req.body; + + if (username === adminAuth.username && password === adminAuth.password) { + // 用户名和密码都正确,返回token + const token = jwt.sign( + { + username, + platform: 'admin', + }, + authSecret, + { + expiresIn: '2h', + } + ); + + res.status(200).json({ + username, + token: token, + expiredAt: new Date().valueOf() + 2 * 60 * 60 * 1000, + }); + } else { + res.status(401).end('username or password incorrect'); + } +}); + +router.use('/analytics', analyticsRouter); +router.use('/network', networkRouter); +router.use('/config', configRouter); +router.use('/file', fileRouter); +router.use('/cache', cacheRouter); + +router.post('/callAction', auth(), async (req, res) => { + const { action, params } = req.body; + const ret = await callBrokerAction(action, params); + + res.json(ret); +}); + +router.get('/user/count/summary', auth(), async (req, res) => { + // 返回最近14天的用户数统计 + const day = 14; + const aggregateRes: { count: number; date: string }[] = await userModel + .aggregate([ + { + $match: { + createdAt: { + $gte: dayjs().subtract(day, 'd').startOf('d').toDate(), + $lt: dayjs().endOf('d').toDate(), + }, + }, + }, + { + $group: { + _id: { + createdAt: { + $dateToString: { + format: '%Y-%m-%d', + date: '$createdAt', + }, + }, + } as any, + count: { + $sum: 1, + }, + }, + }, + { + $project: { + date: '$_id.createdAt', + count: '$count', + }, + }, + ]) + .exec(); + + const summary = Array.from({ length: day }) + .map((_, d) => { + const date = dayjs().subtract(d, 'd').format('YYYY-MM-DD'); + + return { + date, + count: aggregateRes.find((r) => r.date === date)?.count ?? 0, + }; + }) + .reverse(); + + res.json({ summary }); +}); +router.post('/user/ban', auth(), async (req, res) => { + const { userId } = req.body; + + const ret = await broker.call('user.banUser', { + userId, + }); + + res.json({ + ret, + }); +}); +router.post('/user/unban', auth(), async (req, res) => { + const { userId } = req.body; + + const ret = await broker.call('user.unbanUser', { + userId, + }); + + res.json({ + ret, + }); +}); +router.post('/users/system/notify', auth(), async (req, res) => { + const { scope, specifiedUser, title, content } = req.body; + + let userIds = []; + + if (scope === 'all') { + const users = await userModel.find( + { + // false 或 null(正式用户或者老的用户) + temporary: { + $ne: true, + }, + }, + { + _id: 1, + } + ); + + userIds = users.map((u) => u._id); + } else if (scope === 'specified') { + userIds = Array.isArray(specifiedUser) ? specifiedUser : [specifiedUser]; + } + + broker.call('chat.inbox.batchAppend', { + userIds, + type: 'markdown', + payload: { + title, + content, + }, + }); + + res.json({ userIds }); +}); +router.use( + '/users', + auth(), + raExpressMongoose(userModel, { + q: ['_id', 'nickname', 'email'], + allowedRegexFields: ['nickname'], + }) +); +router.delete('/messages/:id', auth(), async (req, res) => { + try { + const messageId = req.params.id; + await callBrokerAction('chat.message.deleteMessage', { + messageId, + }); + + res.json({ id: messageId }); + } catch (err) { + console.error(err); + res.status(500).json({ message: (err as any).message }); + } +}); + +router.get('/message/count/summary', auth(), async (req, res) => { + // 返回最近14天的消息数统计 + const day = 14; + const aggregateRes: { count: number; date: string }[] = await messageModel + .aggregate([ + { + $match: { + createdAt: { + $gte: dayjs().subtract(day, 'd').startOf('d').toDate(), + $lt: dayjs().endOf('d').toDate(), + }, + }, + }, + { + $group: { + _id: { + createdAt: { + $dateToString: { + format: '%Y-%m-%d', + date: '$createdAt', + }, + }, + } as any, + count: { + $sum: 1, + }, + }, + }, + { + $project: { + date: '$_id.createdAt', + count: '$count', + }, + }, + ]) + .exec(); + + const summary = Array.from({ length: day }) + .map((_, d) => { + const date = dayjs().subtract(d, 'd').format('YYYY-MM-DD'); + + return { + date, + count: aggregateRes.find((r) => r.date === date)?.count ?? 0, + }; + }) + .reverse(); + + res.json({ summary }); +}); +router.use( + '/messages', + auth(), + raExpressMongoose(messageModel, { + q: ['content'], + allowedRegexFields: ['content'], + }) +); + +router.post('/groups/', auth(), async (req, res) => { + // create group + const { name, owner } = req.body; + + const group = await groupModel.createGroup({ + name, + owner, + }); + + res.json({ + id: group._id, + }); +}); +router.use( + '/groups', + auth(), + raExpressMongoose(groupModel, { + q: ['_id', 'name'], + capabilities: { + create: false, + }, + }) +); + +router.delete('/file/:id', auth(), async (req, res) => { + try { + const fileId = req.params.id; + + const record = await fileModel.findById(fileId); + if (record) { + await callBrokerAction('file.delete', { + objectName: record.objectName, + }); + } + + res.json({ id: fileId }); + } catch (err) { + console.error(err); + res.status(500).json({ message: (err as any).message }); + } +}); +router.use( + '/file', + auth(), + async (req, res, next) => { + const onlyChatFile = req.query.meta === 'onlyChat'; + + if (!onlyChatFile) { + return next(); + } + + // only return chatted file rather than all file + const result = await fileModel + .aggregate() + .lookup({ + from: 'users', + localField: 'url', + foreignField: 'avatar', + as: 'avatarMatchedUser', + }) + .lookup({ + from: 'groups', + localField: 'url', + foreignField: 'avatar', + as: 'avatarMatchedGroup', + }) + .lookup({ + from: 'groups', + localField: 'url', + foreignField: 'config.groupBackgroundImage', + as: 'backgroundMatchedGroup', + }) + .match({ + 'avatarMatchedUser.0': { $exists: false }, + 'avatarMatchedGroup.0': { $exists: false }, + 'backgroundMatchedGroup.0': { $exists: false }, + }) + .project({ + avatarMatchedUser: 0, + avatarMatchedGroup: 0, + backgroundMatchedGroup: 0, + }) + .facet({ + metadata: [{ $count: 'total' }], + data: [ + { + $sort: { + [typeof req.query._sort === 'string' + ? req.query._sort === 'id' + ? '_id' + : req.query._sort + : '_id']: req.query._order === 'ASC' ? 1 : -1, + }, + }, + { $skip: Number(req.query._start) }, + { $limit: Number(req.query._end) - Number(req.query._start) }, + ], + }) + .exec(); + + const list = _.get(result, '0.data'); + const total = _.get(result, '0.metadata.0.total'); + + return res.set('X-Total-Count', total).json(virtualId(list)).end(); + }, + raExpressMongoose(fileModel, { + q: ['objectName'], + allowedRegexFields: ['objectName'], + capabilities: { + delete: false, + }, + maxRows: 2000, + }) +); +router.use( + '/mail', + auth(), + raExpressMongoose(require('../../../../models/user/mail').default) +); +router.use('/p_discover', auth(), raExpressMongoose(discoverModel)); + +export { router as apiRouter }; diff --git a/server/admin/src/server/router/cache.ts b/server/admin/src/server/router/cache.ts new file mode 100644 index 00000000000..24cd08356f8 --- /dev/null +++ b/server/admin/src/server/router/cache.ts @@ -0,0 +1,32 @@ +import { Router } from 'express'; +import { broker } from '../broker'; +import { auth } from '../middleware/auth'; + +const router = Router(); + +/** + * 清理所有缓存 + */ +router.post('/clean', auth(), async (req, res, next) => { + try { + if (!broker.cacher) { + res.json({ + success: false, + message: 'Not found cacher', + }); + return; + } + + const { target = undefined } = req.body; + + await broker.cacher.clean(target); + + res.json({ + success: true, + }); + } catch (err) { + next(err); + } +}); + +export { router as cacheRouter }; diff --git a/server/admin/src/server/router/config.ts b/server/admin/src/server/router/config.ts new file mode 100644 index 00000000000..134bc0a7a2f --- /dev/null +++ b/server/admin/src/server/router/config.ts @@ -0,0 +1,38 @@ +/** + * Network 相关接口 + */ + +import { Router } from 'express'; +import { broker } from '../broker'; +import { auth } from '../middleware/auth'; + +const router = Router(); + +router.get('/client', auth(), async (req, res, next) => { + try { + const config = await broker.call('config.client'); + + res.json({ + config, + }); + } catch (err) { + next(err); + } +}); + +router.patch('/client', auth(), async (req, res, next) => { + try { + await broker.call('config.setClientConfig', { + key: req.body.key, + value: req.body.value, + }); + + res.json({ + success: true, + }); + } catch (err) { + next(err); + } +}); + +export { router as configRouter }; diff --git a/server/admin/src/server/router/file.ts b/server/admin/src/server/router/file.ts new file mode 100644 index 00000000000..d432036ef1b --- /dev/null +++ b/server/admin/src/server/router/file.ts @@ -0,0 +1,82 @@ +/** + * Network 相关接口 + */ + +import { Router } from 'express'; +import { callBrokerAction } from '../broker'; +import { auth } from '../middleware/auth'; +import Busboy from '@fastify/busboy'; +import fileModel from '../../../../models/file'; + +const router = Router(); + +router.put('/upload', auth(), async (req, res) => { + const busboy = new Busboy({ headers: req.headers as any }); + + const promises: Promise[] = []; + busboy.on('file', (fieldname, file, filename, encoding, mimetype) => { + promises.push( + callBrokerAction('file.save', file, { + filename: filename, + }) + .then((data) => { + console.log(data); + return data; + }) + .catch((err) => { + file.resume(); // Drain file stream to continue processing form + busboy.emit('error', err); + return err; + }) + ); + }); + + busboy.on('finish', async () => { + /* istanbul ignore next */ + if (promises.length == 0) { + res.status(500).json('File missing in the request'); + return; + } + + try { + const files = await Promise.all(promises); + + res.json({ files }); + } catch (err) { + console.error(err); + res.status(500).json(String(err)); + } + }); + + busboy.on('error', (err) => { + console.error(err); + req.unpipe(busboy); + req.resume(); + res.status(500).json({ err }); + }); + + req.pipe(busboy); +}); + +router.get('/filesizeSum', auth(), async (req, res) => { + const ret = await fileModel.aggregate([ + { + $group: { + _id: '$objectName' as any, + size: { $first: '$size' }, + }, + }, + { + $group: { + _id: null, + totalSize: { $sum: '$size' }, + }, + }, + ]); + + const totalSize = ret[0].totalSize; + + res.json({ totalSize }); +}); + +export { router as fileRouter }; diff --git a/server/admin/src/server/router/network.ts b/server/admin/src/server/router/network.ts new file mode 100644 index 00000000000..1e56b3f9bf4 --- /dev/null +++ b/server/admin/src/server/router/network.ts @@ -0,0 +1,37 @@ +/** + * Network 相关接口 + */ + +import { Router } from 'express'; +import { broker } from '../broker'; +import { auth } from '../middleware/auth'; +import _ from 'lodash'; + +const router = Router(); + +router.get('/all', auth(), async (req, res) => { + res.json({ + nodes: Array.from(new Map(broker.registry.nodes.nodes).values()).map( + (item) => + _.pick(item, [ + 'id', + 'available', + 'local', + 'ipList', + 'hostname', + 'cpu', + 'client', + ]) + ), + events: broker.registry.events.events.map((item: any) => item.name), + services: broker.registry.services.services.map((item: any) => item.name), + actions: Array.from(new Map(broker.registry.actions.actions).keys()), + }); +}); + +router.get('/ping', auth(), async (req, res) => { + const pong = await broker.ping(); + res.json(pong); +}); + +export { router as networkRouter }; diff --git a/server/admin/tsconfig.json b/server/admin/tsconfig.json new file mode 100644 index 00000000000..293ba9620a4 --- /dev/null +++ b/server/admin/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "jsx": "react-jsx", + "forceConsistentCasingInFileNames": true, + "importsNotUsedAsValues": "error", + "module": "CommonJS", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true + }, + "include": ["src"] +} diff --git a/server/admin/tsconfig.server.json b/server/admin/tsconfig.server.json new file mode 100644 index 00000000000..7d15171ea42 --- /dev/null +++ b/server/admin/tsconfig.server.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "include": ["./src/server/**/*.ts", "../models/**/*.ts"], + "exclude": ["node_modules/**/*", "dist"], + "compilerOptions": { + "rootDirs": ["./", "../"], + "outDir": "./dist", + "skipLibCheck": true, + "isolatedModules": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "target": "ES2019", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "importsNotUsedAsValues": "error", + "experimentalDecorators": true, + "noEmit": false + } +} diff --git a/server/admin/vite.config.ts b/server/admin/vite.config.ts new file mode 100644 index 00000000000..0a0e1e342d4 --- /dev/null +++ b/server/admin/vite.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig(({ mode }) => ({ + base: '/admin', + plugins: [react()], + server: { + // just for link tushan + fs: { + strict: mode === 'development' ? false : true, + }, + }, +})); diff --git a/server/devops/README.md b/server/devops/README.md new file mode 100644 index 00000000000..3e706497f25 --- /dev/null +++ b/server/devops/README.md @@ -0,0 +1,12 @@ +# 可选启用 + +WIP + +该文件夹用于运维 + +## 用法 Usage + +```bash +cd ./devops +docker compose -f ../docker-compose.yml -f docker-compose.devops.yml up -d +``` diff --git a/server/devops/config/grafana-dashboards.yml b/server/devops/config/grafana-dashboards.yml new file mode 100644 index 00000000000..256c0aff386 --- /dev/null +++ b/server/devops/config/grafana-dashboards.yml @@ -0,0 +1,6 @@ +- name: 'default' + org_id: 1 + folder: '' + type: 'file' + options: + folder: '/var/lib/grafana/dashboards' diff --git a/server/devops/config/grafana-dashboards/tailchat-server.json b/server/devops/config/grafana-dashboards/tailchat-server.json new file mode 100644 index 00000000000..76692d15a1b --- /dev/null +++ b/server/devops/config/grafana-dashboards/tailchat-server.json @@ -0,0 +1,826 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.5.4" + }, + { + "type": "panel", + "id": "piechart", + "name": "Pie chart", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "displayName": "内存使用率(Byte)", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "os_memory_used{namespace=\"tailchat\"}", + "instant": false, + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "内存使用率", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "displayName": "CPU 使用率", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "os_cpu_utilization", + "refId": "A" + } + ], + "title": "CPU 利用率", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 16, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 6, + "options": { + "displayLabels": [ + "value", + "name" + ], + "legend": { + "displayMode": "list", + "placement": "right", + "values": [] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.5.4", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_request_total", + "format": "time_series", + "instant": true, + "legendFormat": "{{action}}({{caller}})", + "range": false, + "refId": "A" + } + ], + "title": "请求分布", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 7, + "x": 12, + "y": 9 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_request_active", + "instant": false, + "legendFormat": "{{action}}", + "range": true, + "refId": "A" + } + ], + "title": "当前正在处理中的请求", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 19, + "y": 9 + }, + "id": 10, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.5.4", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_transporter_packets_received_bytes", + "instant": true, + "range": false, + "refId": "A" + } + ], + "title": "接收包流量", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 19, + "y": 13 + }, + "id": 11, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.5.4", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_transporter_packets_sent_bytes", + "instant": true, + "range": false, + "refId": "A" + } + ], + "title": "发送包流量", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "displayName": "在线人数", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 12, + "y": 17 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "tailchat_socketio_online_count", + "refId": "A" + } + ], + "title": "当前在线人数", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 21, + "y": 17 + }, + "id": 15, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.5.4", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_registry_nodes_online_total", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "在线", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_registry_nodes_total", + "hide": false, + "instant": true, + "legendFormat": "总共", + "range": false, + "refId": "A" + } + ], + "title": "节点数", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 21, + "y": 21 + }, + "id": 16, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.5.4", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_registry_services_total", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "服务数", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_registry_events_total", + "hide": false, + "instant": true, + "legendFormat": "事件数", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "moleculer_registry_actions_total", + "hide": false, + "instant": true, + "legendFormat": "操作数", + "range": false, + "refId": "C" + } + ], + "title": "服务数", + "type": "stat" + } + ], + "refresh": false, + "schemaVersion": 36, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "tailchat-server", + "uid": "H3miszjnk", + "version": 14, + "weekStart": "" +} diff --git a/server/devops/config/grafana-prometheus-datasource.yml b/server/devops/config/grafana-prometheus-datasource.yml new file mode 100644 index 00000000000..7282ceebf01 --- /dev/null +++ b/server/devops/config/grafana-prometheus-datasource.yml @@ -0,0 +1,28 @@ +apiVersion: 1 + +deleteDatasources: +- name: Prometheus + orgId: 1 + +datasources: +- name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + password: + user: + database: prometheus + basicAuth: false + basicAuthUser: + basicAuthPassword: + withCredentials: + isDefault: true + jsonData: + tlsAuth: false + tlsAuthWithCACert: false + secureJsonData: + tlsCACert: "" + tlsClientCert: "" + tlsClientKey: "" + version: 1 + editable: true diff --git a/server/devops/config/prometheus.yml b/server/devops/config/prometheus.yml new file mode 100644 index 00000000000..0676968e955 --- /dev/null +++ b/server/devops/config/prometheus.yml @@ -0,0 +1,27 @@ +# global config +global: + scrape_interval: 120s # By default, scrape targets every 15 seconds. + evaluation_interval: 120s # By default, scrape targets every 15 seconds. + # scrape_timeout is set to the global default (10s). + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'tailchat-devops' + +# Load and evaluate rules in this file every 'evaluation_interval' seconds. +rule_files: +# - "alert.rules" +# - "first.rules" +# - "second.rules" + +scrape_configs: +- job_name: 'prometheus' + scrape_interval: 15s + static_configs: + - targets: ['localhost:9090'] +- job_name: 'tailchat-server' + scrape_interval: 15s + metrics_path: /metrics + scheme: http + static_configs: + - targets: ['tailchat-server:13030'] diff --git a/server/devops/docker-compose.devops.yml b/server/devops/docker-compose.devops.yml new file mode 100644 index 00000000000..40876af5f8e --- /dev/null +++ b/server/devops/docker-compose.devops.yml @@ -0,0 +1,46 @@ +version: "3.3" + +services: + # 应用网关 + prometheus: + image: prom/prometheus:v2.26.0 + user: root + container_name: tailchat-prometheus + restart: unless-stopped + volumes: + - ./config/prometheus.yml:/etc/prometheus/prometheus.yml + - ./data/prometheus:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + ports: + - 9090 + links: + - service-gateway:tailchat-server + depends_on: + - service-gateway + networks: + - internal + + grafana: + image: grafana/grafana:7.5.3 + user: root + container_name: tailchat-grafana + restart: unless-stopped + links: + - prometheus:prometheus + ports: + - 13000:3000 + volumes: + - ./config/grafana-prometheus-datasource.yml:/etc/grafana/provisioning/datasources/prometheus.yml + # - ./config/grafana-dashboards.yml:/etc/grafana/provisioning/dashboards/all.yml + # - ./config/grafana-dashboards:/var/lib/grafana/dashboards + - ./data/grafana:/var/lib/grafana + environment: + - GF_SECURITY_ADMIN_USER=tailchat + - GF_SECURITY_ADMIN_PASSWORD=tailchat + - GF_USERS_ALLOW_SIGN_UP=false + depends_on: + - prometheus + networks: + - internal diff --git a/server/jest.config.js b/server/jest.config.js new file mode 100644 index 00000000000..f588df47f67 --- /dev/null +++ b/server/jest.config.js @@ -0,0 +1,14 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + setupFiles: [ + '/test/setup.ts' + ], + testPathIgnorePatterns: ['/node_modules/', '/dist/'], + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.json', + }, + }, +}; diff --git a/server/lib/__tests__/const.spec.ts b/server/lib/__tests__/const.spec.ts new file mode 100644 index 00000000000..7a1ebe7c365 --- /dev/null +++ b/server/lib/__tests__/const.spec.ts @@ -0,0 +1,29 @@ +import { NAME_REGEXP } from '../const'; + +describe('NAME_REGEXP', () => { + describe('allow', () => { + test.each([ + 'test', + 'test01', + '你好世界', + '你好world', + '最大八个汉字内容', + 'maxis16charactor', + '1234567812345678', + ])('%s', (input) => { + expect(NAME_REGEXP.test(input)).toBe(true); + }); + }); + + describe('deny', () => { + test.each([ + '世 界', + '你好 world', + '超过了八个汉字内容', + 'overmax16charactor', + '12345678123456781', + ])('%s', (input) => { + expect(NAME_REGEXP.test(input)).toBe(false); + }); + }); +}); diff --git a/server/lib/__tests__/utils.spec.ts b/server/lib/__tests__/utils.spec.ts new file mode 100644 index 00000000000..4bb8de35507 --- /dev/null +++ b/server/lib/__tests__/utils.spec.ts @@ -0,0 +1,66 @@ +import { + checkPathMatch, + generateRandomStr, + getEmailAddress, + isValidStr, + sleep, +} from '../utils'; + +describe('getEmailAddress', () => { + test.each([ + ['foo@example.com', 'foo'], + ['foo.bar@example.com', 'foo.bar'], + ['foo$bar@example.com', 'foo$bar'], + ])('%s', (input, output) => { + expect(getEmailAddress(input)).toBe(output); + }); +}); + +describe('generateRandomStr', () => { + test('should generate string with length 10(default)', () => { + expect(generateRandomStr()).toHaveLength(10); + }); + + test('should generate string with manual length', () => { + expect(generateRandomStr(4)).toHaveLength(4); + }); +}); + +describe('isValidStr', () => { + test.each<[any, boolean]>([ + [false, false], + [true, false], + [0, false], + [1, false], + ['', false], + [{}, false], + [[], false], + ['foo', true], + ])('%p is %p', (input, output) => { + expect(isValidStr(input)).toBe(output); + }); +}); + +test('sleep', async () => { + const start = new Date().valueOf(); + await sleep(1000); + const end = new Date().valueOf(); + + const duration = end - start; + expect(duration).toBeGreaterThanOrEqual(1000); + expect(duration).toBeLessThan(1050); +}); + +describe('checkPathMatch', () => { + const testList = ['/foo/bar']; + + test.each([ + ['/foo/bar', true], + ['/foo/bar?query=1', true], + ['/foo', false], + ['/foo/baz', false], + ['/foo/baz?bar=', false], + ])('%s', (input, output) => { + expect(checkPathMatch(testList, input)).toBe(output); + }); +}); diff --git a/server/lib/const.ts b/server/lib/const.ts new file mode 100644 index 00000000000..a2a892b853a --- /dev/null +++ b/server/lib/const.ts @@ -0,0 +1,46 @@ +export const NAME_REGEXP = + /^([0-9a-zA-Z]{1,2}|[\u4e00-\u9eff]|[\u3040-\u309Fー]|[\u30A0-\u30FF]){1,8}$/; + +/** + * TODO: 待实现权限相关逻辑 + * + * 标准群组权限 + * key为权限 + * value为默认值 + */ +export const BUILTIN_GROUP_PERM = { + /** + * 查看频道 + */ + displayChannel: true, + + /** + * 管理频道 + */ + manageChannel: false, + + /** + * 管理角色 + */ + manageRole: false, + + /** + * 管理群组 + */ + manageGroup: false, + + /** + * 发送消息 + */ + sendMessage: true, + + /** + * 发送图片 + */ + sendImage: true, +}; + +/** + * 系统用户id + */ +export const SYSTEM_USERID = '000000000000000000000000'; diff --git a/server/lib/crypto/__tests__/__snapshots__/des.spec.ts.snap b/server/lib/crypto/__tests__/__snapshots__/des.spec.ts.snap new file mode 100644 index 00000000000..e575da384e1 --- /dev/null +++ b/server/lib/crypto/__tests__/__snapshots__/des.spec.ts.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`des encrypt D 1`] = `"ihmnn4VBPYE="`; + +exports[`des encrypt bar 1`] = `"p/PIC32MPm4="`; + +exports[`des encrypt foo 1`] = `"NP3+ABhEiY4="`; + +exports[`des encrypt 你 1`] = `"O5kF0LXzjpE="`; diff --git a/server/lib/crypto/__tests__/des.spec.ts b/server/lib/crypto/__tests__/des.spec.ts new file mode 100644 index 00000000000..5a818bb2022 --- /dev/null +++ b/server/lib/crypto/__tests__/des.spec.ts @@ -0,0 +1,17 @@ +import { desEncrypt, desDecrypt } from '../des'; + +describe('des', () => { + const key = '12345678'; + + describe('encrypt', () => { + test.each([['foo'], ['bar'], ['你'], ['D']])('%s', (input) => { + expect(desEncrypt(input, key)).toMatchSnapshot(); + }); + }); + + describe('decrypt', () => { + test.each([['foo'], ['bar'], ['你'], ['D']])('%s', (input) => { + expect(desDecrypt(desEncrypt(input, key), key)).toBe(input); + }); + }); +}); diff --git a/server/lib/crypto/des.ts b/server/lib/crypto/des.ts new file mode 100644 index 00000000000..86e92c91f07 --- /dev/null +++ b/server/lib/crypto/des.ts @@ -0,0 +1,24 @@ +import crypto from 'crypto'; +import { config } from 'tailchat-server-sdk'; + +// DES 加密 +export function desEncrypt(message: string, key: string = config.secret) { + key = + key.length >= 8 ? key.slice(0, 8) : key.concat('0'.repeat(8 - key.length)); + const keyHex = new Buffer(key); + const cipher = crypto.createCipheriv('des-cbc', keyHex, keyHex); + let c = cipher.update(message, 'utf8', 'base64'); + c += cipher.final('base64'); + return c; +} + +// DES 解密 +export function desDecrypt(text: string, key: string = config.secret) { + key = + key.length >= 8 ? key.slice(0, 8) : key.concat('0'.repeat(8 - key.length)); + const keyHex = new Buffer(key); + const cipher = crypto.createDecipheriv('des-cbc', keyHex, keyHex); + let c = cipher.update(text, 'base64', 'utf8'); + c += cipher.final('utf8'); + return c; +} diff --git a/server/lib/utils.ts b/server/lib/utils.ts new file mode 100644 index 00000000000..0dc0a6a89f0 --- /dev/null +++ b/server/lib/utils.ts @@ -0,0 +1,80 @@ +import randomString from 'crypto-random-string'; +import _ from 'lodash'; +import urlRegex from 'url-regex'; + +/** + * 返回电子邮箱的地址 + * @param email 电子邮箱 + * @returns 电子邮箱 + */ +export function getEmailAddress(email: string) { + return email.split('@')[0]; +} + +/** + * 生成随机字符串 + * @param length 随机字符串长度 + */ +export function generateRandomStr(length = 10): string { + return randomString({ length }); +} + +export function generateRandomNumStr(length = 6) { + return randomString({ + length, + type: 'numeric', + }); +} + +/** + * 是否一个可用的字符串 + * 定义为有长度的字符串 + */ +export function isValidStr(str: unknown): str is string { + return typeof str == 'string' && str !== ''; +} + +/** + * 判断是否是一个可用的url + */ +export function isValidUrl(str: unknown): str is string { + return typeof str == 'string' && urlRegex({ exact: true }).test(str); +} + +/** + * 检测一个地址是否是一个合法的资源地址 + */ +export function isValidStaticAssetsUrl(str: unknown): str is string { + if (typeof str !== 'string') { + return false; + } + + const filename = _.last(str.split('/')); + if (filename.indexOf('.') === -1) { + return false; + } + + return true; +} + +/** + * 休眠一定时间 + */ +export function sleep(ms: number): Promise { + return new Promise((resolve) => + setTimeout(() => { + resolve(); + }, ms) + ); +} + +/** + * 检查url地址是否匹配 + */ +export function checkPathMatch(urlList: string[], url: string): boolean { + const fuzzList = urlList.map((url) => url.replaceAll('/', '.')); + const fuzzUrl = url.split('?')[0].replaceAll('/', '.'); + + // 考虑到serviceName中间可能会有. 且注册的时候不可能把所有情况都列出来,因此进行模糊处理 + return fuzzList.includes(fuzzUrl); +} diff --git a/server/locales/en-US/translation.json b/server/locales/en-US/translation.json new file mode 100644 index 00000000000..bbfa0091ead --- /dev/null +++ b/server/locales/en-US/translation.json @@ -0,0 +1,79 @@ +{ + "k127fc33c": "User banned", + "k158d2868": "No delete permission", + "k160ba1aa": "No permission to edit group panel", + "k16605863": "Token content is incorrect", + "k16ec3222": "No permission to edit invite code", + "k17f8532": "No message found", + "k1b3d8c72": "Group not found", + "k1bdc50f": "Please enter a username with a unique identifier such as: Nickname#0000", + "k206592b2": "Email has been verified", + "k21e507de": "Unable to delete private message", + "k236bb718": "Email sending failed", + "k2bb4fb6d": "OTP incorrect", + "k313eb9b3": "User does not exist, please check your username", + "k3b35c0b0": "No permission to create invitation codes", + "k3b4422dc": "This user is not a temporary user", + "k3b44c0a": "Messages cannot be searched if you are not a member of the group", + "k3d0d56b": "Invalid group invitation: group id is empty", + "k4241451e": "Not member of this group", + "k429851b9": "No operation authority", + "k42cdd273": "Username already exists!", + "k43ef8fbe": "{{nickname}} automatically join this group through the system settings", + "k45c8d1bf": "Claimed user does not exist", + "k4640b9fc": "No edit group identity group permissions", + "k493e44f1": "Can't add myself as a friend", + "k4fd701fe": "Email does not exist", + "k5191530a": "Cannot send duplicate friend requests", + "k590cb8b6": "Account does not exist", + "k5f7a33eb": "The server does not allow guests to login", + "k64a3c830": "User does not exist", + "k66e25a3": "No current session privileges", + "k674f3f65": "Email verification failed, please enter correct email OTP", + "k719464e0": "This message has been recall", + "k721cca1f": "User does not exist, please check your email", + "k7f4ea7c": "The file address is not a valid resource address", + "k82f5a5d4": "Password incorrect", + "k89bf46fc": "Unable to recall messages from {{minutes}} minutes ago", + "k8c49f532": "Failed to set nickname, no friendship information found", + "k986040de": "No group found", + "k9891f980": "{{nickname}} joined the group through the public community", + "k996e99cb": "This group is not a public group and cannot be joined directly", + "k9e276b5": "The administrator forbids the function of adding friends", + "ka3eb52f8": "Call ended, duration: {{num}} minutes", + "ka5b432c0": "Too frequent requests can share the same OTP within 10 minutes", + "ka6ee6909": "No session information found", + "ka8b712f7": "Email already exists!", + "kb143afe": "This data is not allowed to be modified", + "kb32d3d62": "Anonymous", + "kb5971793": "Username or email is empty", + "kb8be9969": "Recall failed, no permission", + "kba207c17": "No permission to view", + "kbb1ef795": "Verification failed, OTP has expired", + "kbb96754b": "Group OP not allowed to be kicked out", + "kbe05914c": "{{user}} invited {{others}} to join the session", + "kbf66da60": "The number of members is abnormal, and the converse cannot be created", + "kc1e668f5": "Not allowed to kick yourself out", + "kc4b77045": "{{nickname}} join this group with invite code from {{creator}}", + "kcb07c88f": "Personal message subscription created, subscribeId: {{subscribeId}}", + "kce1dbb11": "Creating groups has been disabled by administrator", + "kcfcea753": "This panel was not found", + "kd08fb1bf": "Unable to get robot ID", + "kd1af615e": "Panel not exist", + "kd3052d25": "No modification permission", + "kd389d15d": "This message was not found", + "kd470bc32": "The robot service of this application has not been activated", + "kde0762c6": "This invite code has been used up", + "ke050bc7a": "Username does not exist", + "ke0d53ced": "The other party is already your friend and cannot be added again", + "ke19c80a5": "User has no upload permission", + "ke5849544": "Wrong password", + "ke82b4383": "You cannot send messages because you are banned", + "ke99cd649": "No access to converse information permission", + "ke9fabda8": "Token Invalid", + "kea5b4254": "This channel has opened a call", + "kebcb959": "The server does not allow new user register", + "kef3676e1": "The invitation code has expired", + "kf09c23d3": "Cannot edit if you are not the group owner", + "kf1a995fb": "No permission to edit group information" +} diff --git a/server/locales/zh-CN/translation.json b/server/locales/zh-CN/translation.json new file mode 100644 index 00000000000..e51e92d9044 --- /dev/null +++ b/server/locales/zh-CN/translation.json @@ -0,0 +1,79 @@ +{ + "k127fc33c": "用户被封禁", + "k158d2868": "没有删除权限", + "k160ba1aa": "没有编辑群组面板权限", + "k16605863": "Token 内容不正确", + "k16ec3222": "没有编辑邀请码权限", + "k17f8532": "没有找到消息", + "k1b3d8c72": "群组未找到", + "k1bdc50f": "请输入带唯一标识的用户名 如: Nickname#0000", + "k206592b2": "邮箱已认证", + "k21e507de": "无法删除私人信息", + "k236bb718": "邮件发送失败", + "k2bb4fb6d": "OTP 不正确", + "k313eb9b3": "用户不存在, 请检查您的用户名", + "k3b35c0b0": "没有创建邀请码权限", + "k3b4422dc": "该用户不是临时用户", + "k3b44c0a": "不是群组成员无法搜索消息", + "k3d0d56b": "群组邀请失效: 群组id为空", + "k4241451e": "不是该群组成员", + "k429851b9": "没有操作权限", + "k42cdd273": "用户名已存在!", + "k43ef8fbe": "{{nickname}} 通过系统自动加入群组", + "k45c8d1bf": "认领用户不存在", + "k4640b9fc": "没有编辑群组身份组权限", + "k493e44f1": "不能添加自己为好友", + "k4fd701fe": "邮箱不存在", + "k5191530a": "不能发送重复的好友请求", + "k590cb8b6": "账号不存在", + "k5f7a33eb": "服务器不允许游客登录", + "k64a3c830": "用户不存在", + "k66e25a3": "没有当前会话权限", + "k674f3f65": "邮箱校验失败, 请输入正确的邮箱OTP", + "k719464e0": "该消息已被撤回", + "k721cca1f": "用户不存在, 请检查您的邮箱", + "k7f4ea7c": "文件地址不是一个合法的资源地址", + "k82f5a5d4": "密码不正确", + "k89bf46fc": "无法撤回 {{minutes}} 分钟前的消息", + "k8c49f532": "设置昵称失败, 没有找到好友关系信息", + "k986040de": "没有找到群组", + "k9891f980": "{{nickname}} 通过公共社区加入群组", + "k996e99cb": "该群组并非公开群组, 无法直接加入", + "k9e276b5": "管理员禁止添加好友功能", + "ka3eb52f8": "通话已结束, 时长: {{num}}分钟", + "ka5b432c0": "过于频繁的请求,10 分钟内可以共用同一OTP", + "ka6ee6909": "没有找到会话信息", + "ka8b712f7": "邮箱已存在!", + "kb143afe": "该数据不允许修改", + "kb32d3d62": "匿名用户", + "kb5971793": "用户名或邮箱为空", + "kb8be9969": "撤回失败, 没有权限", + "kba207c17": "没有查看权限", + "kbb1ef795": "校验失败, OTP已过期", + "kbb96754b": "不允许踢出群组OP", + "kbe05914c": "{{user}} 邀请 {{others}} 加入会话", + "kbf66da60": "成员数异常,无法创建会话", + "kc1e668f5": "不允许踢出自己", + "kc4b77045": "{{nickname}} 通过 {{creator}} 的邀请码加入群组", + "kcb07c88f": "个人消息订阅已创建, subscribeId: {{subscribeId}}", + "kce1dbb11": "创建群组功能已被管理员禁用", + "kcfcea753": "没有找到该面板", + "kd08fb1bf": "无法获取到机器人ID", + "kd1af615e": "面板不存在", + "kd3052d25": "没有修改权限", + "kd389d15d": "该消息未找到", + "kd470bc32": "该应用的机器人服务尚未开通", + "kde0762c6": "该邀请码使用次数耗尽", + "ke050bc7a": "用户名不存在", + "ke0d53ced": "对方已经是您的好友, 不能再次添加", + "ke19c80a5": "用户无上传权限", + "ke5849544": "密码错误", + "ke82b4383": "您因为被禁言无法发送消息", + "ke99cd649": "没有获取会话信息权限", + "ke9fabda8": "Token不合规", + "kea5b4254": "本频道开启了通话", + "kebcb959": "服务器不允许新用户注册", + "kef3676e1": "该邀请码已过期", + "kf09c23d3": "不是群组所有者无法编辑", + "kf1a995fb": "没有编辑群组信息权限" +} diff --git a/server/mixins/__tests__/socketio.spec.ts b/server/mixins/__tests__/socketio.spec.ts new file mode 100644 index 00000000000..c8165d7ff09 --- /dev/null +++ b/server/mixins/__tests__/socketio.spec.ts @@ -0,0 +1,103 @@ +import { TcSocketIOService } from '../socketio.mixin'; +import { io } from 'socket.io-client'; +import { createTestUserToken } from '../../test/utils'; +import { UserJWTPayload, TcBroker, ApiGatewayMixin } from 'tailchat-server-sdk'; + +require('dotenv').config(); + +const PORT = 28193; + +async function createAndEmitMessage( + eventName: string, + eventData: unknown = {} +): Promise { + const socket = io(`http://localhost:${PORT}/`, { + transports: ['websocket'], + auth: { + token: createTestUserToken(), + }, + }); + + await new Promise((resolve, reject) => { + socket.on('connect', () => { + resolve(null); + }); + socket.on('connect_error', (err) => { + reject(err); + }); + }); + + const res = await new Promise((resolve) => { + socket.emit(eventName, eventData, (ret) => { + resolve(ret); + }); + }); + + socket.close(); + + return res; +} + +describe('Testing "socketio.mixin"', () => { + const broker = new TcBroker({ logger: false }); + const actionHandler1 = jest.fn(); + const actionHandler2 = jest.fn(); + const service = broker.createService({ + name: 'test', + mixins: [ + ApiGatewayMixin, + TcSocketIOService({ + async userAuth(token): Promise { + return { + _id: 'any some', + nickname: '', + email: '', + avatar: '', + }; + }, + }), + ], + settings: { + port: PORT, + }, + actions: { + hello: actionHandler1, + publicAction: { + visibility: 'public', + handler: actionHandler2, + }, + }, + }); + + beforeAll(async () => { + await broker.start(); + }); + + afterAll(async () => { + await broker.stop(); + }); + + test('actions should be ok', () => { + expect(service.actions).toHaveProperty('joinRoom'); + expect(service.actions).toHaveProperty('leaveRoom'); + expect(service.actions).toHaveProperty('notify'); + expect(service.actions).toHaveProperty('checkUserOnline'); + }); + + test('socketio should be call action', async () => { + const res = await createAndEmitMessage('test.hello'); + + expect(actionHandler1.mock.calls.length).toBeGreaterThanOrEqual(1); + expect(res).toEqual({ result: true }); + }); + + test('socketio should not call non-published action', async () => { + const res = await createAndEmitMessage('test.publicAction'); + + expect(actionHandler2.mock.calls.length).toBe(0); + expect(res).toEqual({ + result: false, + message: "Service 'test.publicAction' is not found.", + }); + }); +}); diff --git a/server/mixins/cache.cleaner.mixin.ts b/server/mixins/cache.cleaner.mixin.ts new file mode 100644 index 00000000000..7ab5007069c --- /dev/null +++ b/server/mixins/cache.cleaner.mixin.ts @@ -0,0 +1,25 @@ +import type { PureServiceSchema } from 'tailchat-server-sdk'; + +/** + * 缓存清理工具 + * + * @deprecated 请使用 this.cleanActionCache + */ +export const TcCacheCleaner = ( + eventNames: string[] +): Partial => { + const events = {}; + + eventNames.forEach((name) => { + events[name] = function () { + if (this.broker.cacher) { + this.logger.debug(`Clear local '${this.name}' cache`); + this.broker.cacher.clean(`${this.name}.**`); + } + }; + }); + + return { + events, + }; +}; diff --git a/server/mixins/health.mixin.ts b/server/mixins/health.mixin.ts new file mode 100644 index 00000000000..8a9c47c36ea --- /dev/null +++ b/server/mixins/health.mixin.ts @@ -0,0 +1,32 @@ +import moment from 'moment'; +import type { PureContext, PureServiceSchema } from 'tailchat-server-sdk'; + +const now = moment().format('YYYYMMDDHHmm'); + +/** + * 增加一个action + * 用于返回当前节点的健康信息 + */ +export const TcHealth = (): Partial => { + return { + actions: { + async health(ctx: PureContext) { + const status = ctx.broker.getHealthStatus(); + + const services: any[] = await ctx.call('$node.services'); + + return { + nodeID: ctx.broker.nodeID, + instanceID: ctx.broker.instanceID, + cpu: status.cpu, + memory: status.mem, + process: status.process, + services: services + .filter((s) => s.available === true) + .map((s) => s.fullName), + version: process.env.VERSION || `nightly-${now}`, + }; + }, + }, + }; +}; diff --git a/server/mixins/socketio.mixin.ts b/server/mixins/socketio.mixin.ts new file mode 100644 index 00000000000..ba3dbb60f9f --- /dev/null +++ b/server/mixins/socketio.mixin.ts @@ -0,0 +1,573 @@ +import { Server as SocketServer } from 'socket.io'; +import { createAdapter } from '@socket.io/redis-adapter'; +import { instrument } from '@socket.io/admin-ui'; +import RedisClient from 'ioredis'; +import { + TcService, + TcContext, + UserJWTPayload, + parseLanguageFromHead, + config, + PureContext, + PureService, + PureServiceSchema, + Utils, + Errors, +} from 'tailchat-server-sdk'; +import _ from 'lodash'; +import { ServiceUnavailableError } from 'tailchat-server-sdk'; +import { isValidStr } from '../lib/utils'; +import bcrypt from 'bcryptjs'; +import msgpackParser from 'socket.io-msgpack-parser'; + +const blacklist: (string | RegExp)[] = ['gateway.*']; + +function checkBlacklist(eventName: string): boolean { + return blacklist.some((item) => { + if (_.isString(item)) { + return Utils.match(eventName, item); + } else if (_.isRegExp(item)) { + return item.test(eventName); + } + }); +} + +/** + * socket 用户房间编号 + */ +function buildUserRoomId(userId: string) { + return `u-${userId}`; +} + +/** + * socket online 用户编号 + */ +function buildUserOnlineKey(userId: string) { + return `tailchat-socketio.online:${userId}`; +} + +const expiredTime = 1 * 24 * 60 * 60; // 1天 + +interface SocketIOService extends PureService { + io: SocketServer; + redis: RedisClient.Redis; + socketCloseCallbacks: (() => Promise)[]; +} + +interface TcSocketIOServiceOptions { + /** + * 用户token校验 + */ + userAuth: (token: string) => Promise; + + /** + * 是否禁用msgpack + */ + disableMsgpack?: boolean; +} + +/** + * Socket IO 服务 mixin + */ +export const TcSocketIOService = ( + options: TcSocketIOServiceOptions +): Partial => { + const { userAuth } = options; + + const schema: Partial = { + created(this: SocketIOService) { + this.broker.metrics.register({ + type: 'gauge', + name: 'tailchat.socketio.online.count', + labelNames: ['nodeId'], + description: 'Number of online user', + }); + }, + async started(this: SocketIOService) { + if (!this.io) { + this.initSocketIO(); + } + + this.logger.info('SocketIO service started'); + + const io: SocketServer = this.io; + if (!config.redisUrl) { + throw new Errors.MoleculerClientError( + 'SocketIO service failed to start, environment variables are required: `REDIS_URL`' + ); + } + this.socketCloseCallbacks = []; // socketio服务关闭时需要执行的回调 + + const pubClient = new RedisClient(config.redisUrl, { + retryStrategy(times) { + const delay = Math.min(times * 50, 2000); + return delay; + }, + }); + const subClient = pubClient.duplicate(); + io.adapter( + createAdapter(pubClient, subClient, { + key: 'tailchat-socket', + }) + ); + + this.socketCloseCallbacks.push(async () => { + pubClient.disconnect(false); + subClient.disconnect(false); + }); + this.logger.info('SocketIO is using Redis Adapter'); + + this.redis = pubClient; + + io.use(async (socket, next) => { + // 授权 + try { + if ( + config.enableSocketAdmin && + socket.handshake.headers['origin'] === 'https://admin.socket.io/' + ) { + // 如果是通过 admin-ui 访问的socket.io 直接链接 + next(); + return; + } + + const token = socket.handshake.auth['token']; + if (typeof token !== 'string') { + throw new Errors.MoleculerError('Token cannot be empty'); + } + + const user: UserJWTPayload = await userAuth(token); + + if (!(user && user._id)) { + throw new Error('Token invalid'); + } + + this.logger.info('[Socket] Authenticated via JWT: ', user.nickname); + + socket.data.user = user; + socket.data.token = token; + socket.data.userId = user._id; + + next(); + } catch (e) { + return next(e); + } + }); + + this.io.on('connection', (socket) => { + if (typeof socket.data.userId !== 'string') { + // 不应该进入的逻辑 + return; + } + + this.broker.metrics.increment( + 'tailchat.socketio.online.count', + { + nodeId: this.broker.nodeID, + }, + 1 + ); + + const userId = socket.data.userId; + pubClient + .hset(buildUserOnlineKey(userId), socket.id, this.broker.nodeID) + .then(() => { + pubClient.expire(buildUserOnlineKey(userId), expiredTime); + }); + + // 加入自己userId所生产的id + socket.join(buildUserRoomId(userId)); + + /** + * 离线时移除在线映射 + */ + const removeOnlineMapping = () => { + return pubClient.hdel(buildUserOnlineKey(userId), socket.id); + }; + this.socketCloseCallbacks.push(removeOnlineMapping); + + // 用户断线 + socket.on('disconnecting', (reason) => { + this.logger.info( + 'Socket Disconnect:', + reason, + '| Rooms:', + socket.rooms + ); + + this.broker.metrics.decrement( + 'tailchat.socketio.online.count', + { + nodeId: this.broker.nodeID, + }, + 1 + ); + + removeOnlineMapping(); + _.pull(this.socketCloseCallbacks, removeOnlineMapping); + }); + + // 连接时 + socket.onAny( + async ( + eventName: string, + eventData: unknown, + cb: (data: unknown) => void + ) => { + this.logger.info( + '[SocketIO]', + eventName, + '<=', + JSON.stringify(eventData) + ); + + // 检测是否允许调用 + if (checkBlacklist(eventName)) { + const message = 'Not allowed request'; + this.logger.warn('[SocketIO]', '=>', message); + cb({ + result: false, + message, + }); + return; + } + + // 接受任意消息, 并调用action + try { + const endpoint = this.broker.findNextActionEndpoint(eventName); + if (endpoint instanceof Error) { + if (endpoint instanceof Errors.ServiceNotFoundError) { + throw new ServiceUnavailableError(); + } + + throw endpoint; + } + + if ( + typeof endpoint.action.visibility === 'string' && + endpoint.action.visibility !== 'published' + ) { + throw new Errors.ServiceNotFoundError({ + visibility: endpoint.action.visibility, + action: eventName, + }); + } + + if (endpoint.action.disableSocket === true) { + throw new Errors.ServiceNotFoundError({ + disableSocket: true, + action: eventName, + }); + } + + /** + * TODO: + * 这里也许还可以被优化?看molecular的源码好像没有走远程调用这一步,但是没看懂如何实现的 + * 需要研究一下 + */ + const language = parseLanguageFromHead( + socket.handshake.headers['accept-language'] + ); + const data = await this.broker.call(eventName, eventData, { + meta: { + ...socket.data, + socketId: socket.id, + language, + }, + }); + + if (typeof cb === 'function') { + this.logger.debug( + '[SocketIO]', + eventName, + '=>', + JSON.stringify(data) + ); + cb({ result: true, data }); + } + } catch (err: unknown) { + const message = _.get(err, 'message', 'Service Error'); + this.logger.debug('[SocketIO]', eventName, '=>', message); + this.logger.error('[SocketIO]', err); + cb({ + result: false, + message, + }); + } + } + ); + }); + }, + async stopped(this: SocketIOService) { + if (this.io) { + this.io.close(); + await Promise.all(this.socketCloseCallbacks.map((fn) => fn())); + } + this.logger.info('断开所有连接'); + }, + actions: { + joinRoom: { + visibility: 'public', + params: { + roomIds: 'array', + userId: [{ type: 'string', optional: true }], // 可选, 如果不填则为当前socket的id + }, + async handler( + this: TcService, + ctx: TcContext<{ roomIds: string[]; userId?: string }> + ) { + const roomIds = ctx.params.roomIds; + const userId = ctx.params.userId; + const searchId = isValidStr(userId) + ? buildUserRoomId(userId) + : ctx.meta.socketId; + if (typeof searchId !== 'string') { + throw new Error( + 'Unable to join the room, the query condition is invalid, please contact the administrator' + ); + } + + if (!Array.isArray(roomIds)) { + throw new Error( + 'Unable to join the room, the parameter must be an array' + ); + } + + // 获取远程socket链接并加入 + const io: SocketServer = this.io; + const remoteSockets = await io.in(searchId).fetchSockets(); + if (remoteSockets.length === 0) { + this.logger.warn( + 'Unable to join the room, unable to find the current socket link:', + searchId + ); + return; + } + + remoteSockets.forEach((rs) => + rs.join( + roomIds.map(String) // 强制确保roomId为字符串,防止出现传个objectId类型的数据过来 + ) + ); + }, + }, + leaveRoom: { + visibility: 'public', + params: { + roomIds: 'array', + userId: [{ type: 'string', optional: true }], + }, + async handler( + this: TcService, + ctx: TcContext<{ roomIds: string[]; userId?: string }> + ) { + const roomIds = ctx.params.roomIds; + const userId = ctx.params.userId; + const searchId = isValidStr(userId) + ? buildUserRoomId(userId) + : ctx.meta.socketId; + if (typeof searchId !== 'string') { + this.logger.error( + 'Unable to leave the room, the current socket connection does not exist' + ); + return; + } + + // 获取远程socket链接并离开 + const io: SocketServer = this.io; + const remoteSockets = await io.in(searchId).fetchSockets(); + if (remoteSockets.length === 0) { + this.logger.error( + `Can't leave room, can't find current socket link` + ); + return; + } + + remoteSockets.forEach((rs) => { + roomIds.forEach((roomId) => { + rs.leave(roomId); + }); + }); + }, + }, + + /** + * 根据userId获取所有的用户链接 + */ + fetchUserSocketIds: { + visibility: 'public', + params: { + userId: 'string', + }, + async handler( + this: TcService, + ctx: TcContext<{ userId: string }> + ): Promise { + const userId = ctx.params.userId; + const io: SocketServer = this.io; + const remoteSockets = await io + .in(buildUserRoomId(userId)) + .fetchSockets(); + + return remoteSockets.map((remoteSocket) => remoteSocket.id); + }, + }, + + /** + * 获取userId获取所有的用户的token + */ + getUserSocketToken: { + visibility: 'public', + params: { + userId: 'string', + }, + async handler( + this: TcService, + ctx: TcContext<{ userId: string }> + ): Promise { + const userId = ctx.params.userId; + const io: SocketServer = this.io; + const remoteSockets = await io + .in(buildUserRoomId(userId)) + .fetchSockets(); + + return remoteSockets.map((remoteSocket) => remoteSocket.data.token); + }, + }, + + /** + * 踢出用户 + */ + tickUser: { + visibility: 'public', + params: { + userId: 'string', + }, + async handler(this: TcService, ctx: TcContext<{ userId: string }>) { + const userId = ctx.params.userId; + const io: SocketServer = this.io; + const remoteSockets = await io + .in(buildUserRoomId(userId)) + .fetchSockets(); + + remoteSockets.forEach((remoteSocket) => { + remoteSocket.disconnect(true); + }); + }, + }, + + /** + * 服务端通知 + */ + notify: { + visibility: 'public', + params: { + type: 'string', + target: [ + { type: 'string', optional: true }, + { type: 'array', optional: true }, + ], + eventName: 'string', + eventData: 'any', + }, + handler( + this: TcService, + ctx: PureContext<{ + type: string; + target: string | string[]; + eventName: string; + eventData: any; + }> + ) { + const { type, target, eventName, eventData } = ctx.params; + const io: SocketServer = this.io; + if (type === 'unicast' && typeof target === 'string') { + // 单播 + io.to(buildUserRoomId(target)).emit(eventName, eventData); + } else if (type === 'listcast' && Array.isArray(target)) { + // 列播 + io.to(target.map((t) => buildUserRoomId(t))).emit( + eventName, + eventData + ); + } else if (type === 'roomcast') { + // 组播 + io.to(target).emit(eventName, eventData); + } else if (type === 'broadcast') { + // 广播 + io.emit(eventName, eventData); + } else { + this.logger.warn( + '[SocketIO]', + 'Unknown notify type or target', + type, + target + ); + } + }, + }, + + /** + * 检查用户在线状态 + */ + checkUserOnline: { + params: { + userIds: 'array', + }, + async handler( + this: TcService, + ctx: PureContext<{ userIds: string[] }> + ) { + const userIds = ctx.params.userIds; + + const status = await Promise.all( + userIds.map((userId) => + (this.redis as RedisClient.Redis).exists( + buildUserOnlineKey(userId) + ) + ) + ); + + return status.map((d) => Boolean(d)); + }, + }, + }, + methods: { + initSocketIO() { + if (!this.server) { + throw new Errors.ServiceNotAvailableError( + 'Need to use with [ApiGatewayMixin]' + ); + } + this.io = new SocketServer(this.server, { + serveClient: false, + transports: ['websocket'], + cors: { + origin: '*', + methods: ['GET', 'POST'], + }, + parser: options.disableMsgpack ? undefined : msgpackParser, + }); + + if ( + isValidStr(process.env.ADMIN_USER) && + isValidStr(process.env.ADMIN_PASS) + ) { + this.logger.info('****************************************'); + this.logger.info(`Detected that Admin management is enabled`); + this.logger.info('****************************************'); + + instrument(this.io, { + auth: { + type: 'basic', + username: process.env.ADMIN_USER, + password: bcrypt.hashSync(process.env.ADMIN_PASS, 10), + }, + }); + } + }, + }, + }; + + return schema; +}; diff --git a/server/models/README.md b/server/models/README.md new file mode 100644 index 00000000000..97c7c0bf9f2 --- /dev/null +++ b/server/models/README.md @@ -0,0 +1 @@ +Reference: https://typegoose.github.io/typegoose/docs/guides/quick-start-guide diff --git a/server/models/chat/ack.ts b/server/models/chat/ack.ts new file mode 100644 index 00000000000..2f2adc898bd --- /dev/null +++ b/server/models/chat/ack.ts @@ -0,0 +1,44 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + index, +} from '@typegoose/typegoose'; +import type { Base } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; +import { User } from '../user/user'; +import { Converse } from './converse'; +import { Message } from './message'; + +/** + * 消息已读管理 + */ +@index({ userId: 1, converseId: 1 }, { unique: true }) // 一组userId和converseId应当唯一(用户为先) +export class Ack implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + ref: () => User, + }) + userId: Ref; + + @prop({ + ref: () => Converse, + }) + converseId: Ref; + + @prop({ + ref: () => Message, + }) + lastMessageId: Ref; +} + +export type AckDocument = DocumentType; + +const model = getModelForClass(Ack); + +export type AckModel = typeof model; + +export default model; diff --git a/server/models/chat/converse.ts b/server/models/chat/converse.ts new file mode 100644 index 00000000000..ced0b6ebec6 --- /dev/null +++ b/server/models/chat/converse.ts @@ -0,0 +1,98 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + ReturnModelType, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import { Types } from 'mongoose'; +import { NAME_REGEXP } from '../../lib/const'; +import { User } from '../user/user'; + +/** + * 设计参考: https://discord.com/developers/docs/resources/channel + */ + +const converseType = [ + 'DM', // 私信 + 'Multi', // 多人会话 + 'Group', // 群组 +] as const; + +/** + * 聊天会话 + */ +export class Converse extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + trim: true, + match: NAME_REGEXP, + }) + name?: string; + + /** + * 会话类型 + */ + @prop({ + enum: converseType, + type: () => String, + }) + type!: (typeof converseType)[number]; + + /** + * 会话参与者 + * DM会话与多人会话有值 + */ + @prop({ ref: () => User }) + members?: Ref[]; + + /** + * 查找固定成员已存在的会话 + */ + static async findConverseWithMembers( + this: ReturnModelType, + members: string[] + ): Promise | null> { + const converse = await this.findOne({ + members: { + $all: [...members], + $size: members.length, + }, + }); + + return converse; + } + + /** + * 获取用户所有加入的会话 + */ + static async findAllJoinedConverseId( + this: ReturnModelType, + userId: string + ): Promise { + const conserves = await this.find( + { + members: new Types.ObjectId(userId), + }, + { + _id: 1, + } + ); + + return conserves + .map((c) => c.id) + .filter(Boolean) + .map(String); + } +} + +export type ConverseDocument = DocumentType; + +const model = getModelForClass(Converse); + +export type ConverseModel = typeof model; + +export default model; diff --git a/server/models/chat/inbox.ts b/server/models/chat/inbox.ts new file mode 100644 index 00000000000..292d943d1ec --- /dev/null +++ b/server/models/chat/inbox.ts @@ -0,0 +1,99 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + index, + modelOptions, + Severity, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; +import type { InboxStruct } from 'tailchat-server-sdk'; +import { User } from '../user/user'; + +/** + * @deprecated use InboxStruct directly + */ +interface InboxMessage { + /** + * 消息所在群组Id + */ + groupId?: string; + + /** + * 消息所在会话Id + */ + converseId: string; + + messageId: string; + + /** + * 消息发送者 + */ + messageAuthor: string; + + /** + * 消息片段,用于消息的预览/发送通知 + */ + messageSnippet: string; + + /** + * 消息去除富文本标记的原始内容,用于推送 + */ + messagePlainContent: string; +} + +/** + * 收件箱管理 + */ +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +@index({ userId: 1 }) +export class Inbox extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + /** + * 接收方的id + */ + @prop({ + ref: () => User, + }) + userId: Ref; + + @prop({ + type: () => String, + }) + type: string; + + /** + * @deprecated please use payload + */ + @prop() + message?: InboxMessage; + + /** + * 信息体,没有类型 + */ + @prop() + payload?: InboxStruct['payload']; + + /** + * 是否已读 + */ + @prop({ + default: false, + }) + readed: boolean; +} + +export type InboxDocument = DocumentType; + +const model = getModelForClass(Inbox); + +export type InboxModel = typeof model; + +export default model; diff --git a/server/models/chat/message.ts b/server/models/chat/message.ts new file mode 100644 index 00000000000..817e901eaa9 --- /dev/null +++ b/server/models/chat/message.ts @@ -0,0 +1,107 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + ReturnModelType, + modelOptions, + Severity, + index, +} from '@typegoose/typegoose'; +import { Group } from '../group/group'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import { Converse } from './converse'; +import { User } from '../user/user'; +import type { FilterQuery, Types } from 'mongoose'; +import type { MessageMetaStruct } from 'tailchat-server-sdk'; + +class MessageReaction { + /** + * 消息反应名 + * 可以直接为emoji表情 + */ + @prop() + name: string; + + @prop({ ref: () => User }) + author?: Ref; +} + +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +@index({ createdAt: -1 }) +@index({ converseId: 1, _id: -1 }) // for fetchConverseMessage +export class Message extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop() + content: string; + + @prop({ ref: () => User }) + author?: Ref; + + @prop({ ref: () => Group }) + groupId?: Ref; + + /** + * 会话ID 必填 + * 私信的本质就是创建一个双人的会话 + */ + @prop({ ref: () => Converse, index: true }) + converseId!: Ref; + + @prop({ type: () => MessageReaction }) + reactions?: MessageReaction[]; + + /** + * 是否已撤回 + */ + @prop({ + default: false, + }) + hasRecall: boolean; + + /** + * 消息的其他数据 + */ + @prop() + meta?: MessageMetaStruct; + + /** + * 获取会话消息 + */ + static async fetchConverseMessage( + this: ReturnModelType, + converseId: string, + startId: string | null, + limit = 50 + ) { + const conditions: FilterQuery = { + converseId, + }; + if (startId !== null) { + conditions['_id'] = { + $lt: startId, + }; + } + + const res = await this.find({ ...conditions }) + .sort({ _id: -1 }) + .limit(limit) + .exec(); + + return res; + } +} + +export type MessageDocument = DocumentType; + +const model = getModelForClass(Message); + +export type MessageModel = typeof model; + +export default model; diff --git a/server/models/config.ts b/server/models/config.ts new file mode 100644 index 00000000000..d374c8074d1 --- /dev/null +++ b/server/models/config.ts @@ -0,0 +1,79 @@ +import { + getModelForClass, + prop, + DocumentType, + modelOptions, + Severity, + ReturnModelType, + index, +} from '@typegoose/typegoose'; +import type { Base } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; + +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +@index({ name: 1 }) +export class Config implements Base { + _id: Types.ObjectId; + id: string; + + static globalClientConfigName = '__client_config__'; + + @prop() + name: string; + + /** + * config data + */ + @prop() + data: object; + + static async getAllClientPersistConfig( + this: ReturnModelType + ): Promise { + const config = await this.findOne({ + name: Config.globalClientConfigName, + }); + + return config?.data ?? {}; + } + + /** + * set global client persist config from mongodb + * + * return all config from db + */ + static async setClientPersistConfig( + this: ReturnModelType, + key: string, + value: any + ): Promise> { + const newConfig = await this.findOneAndUpdate( + { + name: Config.globalClientConfigName, + }, + { + $set: { + [`data.${key}`]: value, + }, + }, + { + upsert: true, + new: true, + } + ); + + return newConfig.data; + } +} + +export type ConfigDocument = DocumentType; + +const model = getModelForClass(Config); + +export type ConfigModel = typeof model; + +export default model; diff --git a/server/models/file.ts b/server/models/file.ts new file mode 100644 index 00000000000..5f2439afc0d --- /dev/null +++ b/server/models/file.ts @@ -0,0 +1,76 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + modelOptions, + Severity, + index, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; +import { User } from './user/user'; + +/** + * 聊天会话 + */ +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +@index({ bucketName: 1, objectName: 1 }) +@index({ url: 1 }) +export class File extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop() + etag: string; + + @prop({ ref: () => User }) + userId?: Ref; + + @prop() + bucketName: string; + + @prop() + objectName: string; + + @prop() + url: string; + + /** + * 文件大小, 单位: Byte + */ + @prop() + size: number; + + /** + * 浏览量 + */ + @prop({ + default: 0, + }) + views: number; + + @prop() + metaData: object; + + /** + * 这个文件是用于哪里 + * for example: chat, group, user + */ + @prop({ + default: 'unknown', + }) + usage: string; +} + +export type FileDocument = DocumentType; + +const model = getModelForClass(File); + +export type FileModel = typeof model; + +export default model; diff --git a/server/models/group/group-extra.ts b/server/models/group/group-extra.ts new file mode 100644 index 00000000000..084328f91c6 --- /dev/null +++ b/server/models/group/group-extra.ts @@ -0,0 +1,51 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + modelOptions, + Severity, + index, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; + +/** + * Group Extra Data + * Use to storage large data when panel load or others + */ +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +@index({ groupId: 1, panelId: 1, name: 1 }) +export class GroupExtra extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + ref: () => GroupExtra, + }) + groupId: Ref; + + @prop() + panelId?: string; + + @prop() + name: string; + + /** + * Only allow string + */ + @prop() + data: string; +} + +export type GroupExtraDocument = DocumentType; + +const model = getModelForClass(GroupExtra); + +export type GroupExtraModel = typeof model; + +export default model; diff --git a/server/models/group/group.ts b/server/models/group/group.ts new file mode 100644 index 00000000000..70766d883b7 --- /dev/null +++ b/server/models/group/group.ts @@ -0,0 +1,422 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + ReturnModelType, + modelOptions, + Severity, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import _ from 'lodash'; +import { Types } from 'mongoose'; +import { + allPermission, + call, + GroupPanelType, + NoPermissionError, + PERMISSION, + SYSTEM_USERID, + TcContext, +} from 'tailchat-server-sdk'; +import { User } from '../user/user'; + +class GroupMember { + @prop({ + type: () => String, + }) + roles?: string[]; // 角色权限组id + + @prop({ + ref: () => User, + }) + userId: Ref; + + /** + * 禁言到xxx 为止 + */ + @prop() + muteUntil?: Date; +} + +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +export class GroupPanel { + @prop() + id: string; // 在群组中唯一, 可以用任意方式进行生成。这里使用ObjectId, 但不是ObjectId类型 + + @prop() + name: string; // 用于显示的名称 + + @prop() + parentId?: string; // 父节点id + + /** + * 面板类型: + * 0 文本频道 + * 1 面板分组 + * 2 插件 + * + * Reference: https://discord.com/developers/docs/resources/channel#channel-object-channel-types + */ + @prop({ + type: () => Number, + }) + type: GroupPanelType; + + @prop() + provider?: string; // 面板提供者,为插件的标识,仅面板类型为插件时有效 + + @prop() + pluginPanelName?: string; // 插件面板名, 如 com.msgbyte.webview/grouppanel + + /** + * 面板的其他数据 + */ + @prop() + meta?: object; + + /** + * 身份组或者用户的权限 + * 如果没有设定则应用群组权限 + * + * key 为身份组id或者用户id + * value 为权限字符串列表 + */ + @prop() + permissionMap?: Record; + + /** + * 所有人的权限列表 + * 如果没有设定则应用群组权限 + */ + @prop({ + type: () => String, + default: () => [], + }) + fallbackPermissions?: string[]; +} + +/** + * 群组权限组 + */ +export class GroupRole implements Base { + _id: Types.ObjectId; + id: string; + + @prop() + name: string; // 权限组名 + + @prop({ + type: () => String, + }) + permissions: string[]; // 拥有的权限, 是一段字符串 +} + +/** + * 群组 + */ +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +export class Group extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + trim: true, + maxlength: [100, 'group name is too long'], + }) + name!: string; + + @prop() + avatar?: string; + + @prop({ + ref: () => User, + }) + owner: Ref; + + @prop({ + maxlength: 120, + }) + description?: string; + + @prop({ type: () => GroupMember, _id: false }) + members: GroupMember[]; + + @prop({ type: () => GroupPanel, _id: false }) + panels: GroupPanel[]; + + @prop({ + type: () => GroupRole, + default: [], + }) + roles: GroupRole[]; + + /** + * 所有人的权限列表 + * 为群组中的最低权限 + */ + @prop({ + type: () => String, + default: () => [], + }) + fallbackPermissions: string[]; + + /** + * 群组的配置信息 + */ + @prop({ default: () => ({}) }) + config: object; + + /** + * 创建群组 + */ + static async createGroup( + this: ReturnModelType, + options: { + name: string; + avatarBase64?: string; // base64版本的头像字符串 + panels?: GroupPanel[]; + owner: string; + } + ): Promise { + const { name, avatarBase64, panels = [], owner } = options; + if (typeof avatarBase64 === 'string') { + // TODO: 处理头像上传逻辑 + } + + // 预处理panels信息, 变换ID为objectid + const panelSectionMap: Record = {}; + panels.forEach((panel) => { + const originPanelId = panel.id; + panel.id = String(new Types.ObjectId()); + if (panel.type === GroupPanelType.GROUP) { + panelSectionMap[originPanelId] = panel.id; + } + + if (typeof panel.parentId === 'string') { + if (typeof panelSectionMap[panel.parentId] !== 'string') { + throw new Error('创建失败, 面板参数不合法'); + } + panel.parentId = panelSectionMap[panel.parentId]; + } + }); + + // NOTE: Expression produces a union type that is too complex to represent. + const res = await this.create({ + name, + panels, + owner, + members: [ + { + roles: [], + userId: owner, + }, + ], + }); + + return res; + } + + /** + * 获取用户加入的群组列表 + * @param userId 用户ID + */ + static async getUserGroups( + this: ReturnModelType, + userId: string + ): Promise { + return this.find({ + 'members.userId': userId, + }); + } + + /** + * 修改群组角色名 + */ + static async updateGroupRoleName( + this: ReturnModelType, + groupId: string, + roleId: string, + roleName: string + ): Promise { + const group = await this.findById(groupId); + if (!group) { + throw new Error('Not Found Group'); + } + + const modifyRole = group.roles.find((role) => String(role._id) === roleId); + if (!modifyRole) { + throw new Error('Not Found Role'); + } + + modifyRole.name = roleName; + await group.save(); + + return group; + } + + /** + * 修改群组角色权限 + */ + static async updateGroupRolePermission( + this: ReturnModelType, + groupId: string, + roleId: string, + permissions: string[] + ): Promise { + const group = await this.findById(groupId); + if (!group) { + throw new Error('Not Found Group'); + } + + const modifyRole = group.roles.find((role) => String(role._id) === roleId); + if (!modifyRole) { + throw new Error('Not Found Role'); + } + + modifyRole.permissions = [...permissions]; + await group.save(); + + return group; + } + + /** + * 获取用户所有权限 + */ + static async getGroupUserPermission( + this: ReturnModelType, + groupId: string, + userId: string + ): Promise { + const group = await this.findById(groupId); + if (!group) { + throw new Error('Not Found Group'); + } + + if (userId === SYSTEM_USERID) { + return allPermission; + } + + const member = group.members.find( + (member) => String(member.userId) === userId + ); + + if (!member) { + throw new Error('Not Found Member'); + } + + const allRoles = member.roles; + const allRolesPermission = allRoles.map((roleName) => { + const p = group.roles.find((r) => String(r._id) === roleName); + + return p?.permissions ?? []; + }); + + if (String(group.owner) === userId) { + /** + * 群组管理者有所有权限 + * 这里是为了避免插件权限无法预先感知到的问题 + */ + + return _.uniq([ + ...allPermission, + ..._.flatten(allRolesPermission), + ...group.fallbackPermissions, + ]); + } else { + return _.uniq([ + ..._.flatten(allRolesPermission), + ...group.fallbackPermissions, + ]); + } + } + + /** + * 检查群组字段操作权限,如果没有权限会直接抛出异常 + */ + static async checkGroupFieldPermission< + K extends keyof Pick + >( + this: ReturnModelType, + ctx: TcContext, + groupId: string, + fieldName: K + ) { + const userId = ctx.meta.userId; + const t = ctx.meta.t; + + if (fieldName === 'roles') { + // 检查操作用户是否有管理角色的权限 + const [hasRolePermission] = await call(ctx).checkUserPermissions( + groupId, + userId, + [PERMISSION.core.manageRoles] + ); + if (!hasRolePermission) { + throw new NoPermissionError(t('没有操作角色权限')); + } + } else { + // 检查操作用户是否有管理用户权限 + const [hasUserPermission] = await call(ctx).checkUserPermissions( + groupId, + userId, + [PERMISSION.core.manageUser] + ); + if (!hasUserPermission) { + throw new NoPermissionError(t('没有操作用户权限')); + } + } + } + + /** + * 修改群组成员的字段信息 + * + * 带权限验证 + */ + static async updateGroupMemberField< + K extends keyof Pick + >( + this: ReturnModelType, + ctx: TcContext, + groupId: string, + memberId: string, + fieldName: K, + fieldValue: GroupMember[K] | ((member: GroupMember) => void) + ): Promise { + const group = await this.findById(groupId); + const t = ctx.meta.t; + + await this.checkGroupFieldPermission(ctx, groupId, fieldName); + + const member = group.members.find((m) => String(m.userId) === memberId); + if (!member) { + throw new Error(t('没有找到该成员')); + } + + if (typeof fieldValue === 'function') { + fieldValue(member); + } else { + member[fieldName] = fieldValue; + } + + await group.save(); + + return group; + } +} + +export type GroupDocument = DocumentType; + +const model = getModelForClass(Group); + +export type GroupModel = typeof model; + +export default model; diff --git a/server/models/group/invite.ts b/server/models/group/invite.ts new file mode 100644 index 00000000000..5c7cd295417 --- /dev/null +++ b/server/models/group/invite.ts @@ -0,0 +1,112 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + ReturnModelType, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import moment from 'moment'; +import type { Types } from 'mongoose'; +import { nanoid } from 'nanoid'; +import { User } from '../user/user'; +import { Group } from './group'; +import promiseRetry from 'promise-retry'; + +function generateCode() { + return nanoid(8); +} + +export class GroupInvite extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + index: true, + unique: true, + default: () => generateCode(), + }) + code!: string; + + @prop({ + ref: () => User, + }) + creator: Ref; + + @prop({ + ref: () => Group, + }) + groupId!: Ref; + + /** + * 过期时间,如果不存在则永不过期 + */ + @prop() + expiredAt?: Date; + + /** + * 被使用次数 + */ + @prop({ + default: 0, + }) + usage: number; + + /** + * 使用上限,如果为空则不限制 + */ + @prop() + usageLimit?: number; + + /** + * 创建群组邀请 + * @param groupId 群组id + * @param type 普通(7天) 永久 + */ + static async createGroupInvite( + this: ReturnModelType, + groupId: string, + creator: string, + inviteType: 'normal' | 'permanent' + ): Promise { + let expiredAt = moment().add(7, 'day').toDate(); // 默认7天 + if (inviteType === 'permanent') { + expiredAt = undefined; + } + + const code = await promiseRetry( + async () => { + const code = generateCode(); + const exists = await this.exists({ code }); + + if (exists) { + throw new Error('Cannot find unused invite code, please try again.'); + } + + return code; + }, + { + minTimeout: 0, + maxTimeout: 0, + retries: 5, + } + ); + + const invite = await this.create({ + groupId, + code, + creator, + expiredAt, + }); + + return invite; + } +} + +export type GroupInviteDocument = DocumentType; + +const model = getModelForClass(GroupInvite); + +export type GroupInviteModel = typeof model; + +export default model; diff --git a/server/models/openapi/__tests__/app.spec.ts b/server/models/openapi/__tests__/app.spec.ts new file mode 100644 index 00000000000..c42e09499bd --- /dev/null +++ b/server/models/openapi/__tests__/app.spec.ts @@ -0,0 +1,20 @@ +import { filterAvailableAppCapability } from '../app'; + +describe('openapp', () => { + describe('filterAvailableAppCapability', () => { + test.each([ + [['bot'], ['bot']], + [['bot', 'foo'], ['bot']], + [ + ['bot', 'webpage', 'oauth'], + ['bot', 'webpage', 'oauth'], + ], + [ + ['bot', 'webpage', 'oauth', 'a', 'b', 'c'], + ['bot', 'webpage', 'oauth'], + ], + ])('%p', (input, output) => { + expect(filterAvailableAppCapability(input)).toEqual(output); + }); + }); +}); diff --git a/server/models/openapi/app.ts b/server/models/openapi/app.ts new file mode 100644 index 00000000000..f7d5c632752 --- /dev/null +++ b/server/models/openapi/app.ts @@ -0,0 +1,105 @@ +import { + getModelForClass, + prop, + DocumentType, + index, + ReturnModelType, + Ref, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; +import { User } from '../user/user'; + +const openAppCapability = [ + 'bot', // 机器人 + 'webpage', // 网页 + 'oauth', // 第三方登录 +] as const; + +type OpenAppCapability = typeof openAppCapability[number]; + +/** + * 确保输出类型为应用能力 + */ +export function filterAvailableAppCapability( + input: string[] +): OpenAppCapability[] { + return input.filter((item) => + openAppCapability.includes(item as OpenAppCapability) + ) as OpenAppCapability[]; +} + +export interface OpenAppOAuth { + redirectUrls: string[]; +} + +export interface OpenAppBot { + callbackUrl: string; +} + +/** + * 开放平台应用 + */ +@index({ appId: 1 }, { unique: true }) +export class OpenApp extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + ref: () => User, + }) + owner: Ref; + + @prop() + appId: string; + + @prop() + appSecret: string; + + @prop() + appName: string; + + @prop() + appDesc: string; + + @prop() + appIcon: string; // url + + @prop({ + enum: openAppCapability, + type: () => String, + }) + capability: OpenAppCapability[]; + + @prop() + oauth?: OpenAppOAuth; + + @prop() + bot?: OpenAppBot; + + /** + * 根据appId获取openapp的实例 + * 用于获得获得完整数据(包括secret) + * 并顺便判断是否拥有该开放平台用户的修改权限 + */ + static async findAppByIdAndOwner( + this: ReturnModelType, + appId: string, + ownerId: string + ) { + const res = await this.findOne({ + appId, + owner: ownerId, + }).exec(); + + return res; + } +} + +export type OpenAppDocument = DocumentType; + +const model = getModelForClass(OpenApp); + +export type OpenAppModel = typeof model; + +export default model; diff --git a/server/models/plugin/manifest.ts b/server/models/plugin/manifest.ts new file mode 100644 index 00000000000..a1166973a24 --- /dev/null +++ b/server/models/plugin/manifest.ts @@ -0,0 +1,56 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + ReturnModelType, + modelOptions, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; +import { User } from '../user/user'; + +export class PluginManifest extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop() + label: string; + + @prop({ + unique: true, + }) + name: string; + + /** + * 插件入口地址 + */ + @prop() + url: string; + + @prop() + icon?: string; + + @prop() + version: string; + + @prop() + author: string; + + @prop() + description: string; + + @prop() + requireRestart: string; + + @prop({ ref: () => User }) + uploader?: Ref; +} + +export type PluginManifestDocument = DocumentType; + +const model = getModelForClass(PluginManifest); + +export type PluginManifestModel = typeof model; + +export default model; diff --git a/server/models/user/dmlist.ts b/server/models/user/dmlist.ts new file mode 100644 index 00000000000..6c74f00f21c --- /dev/null +++ b/server/models/user/dmlist.ts @@ -0,0 +1,47 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + modelOptions, +} from '@typegoose/typegoose'; +import { Base, FindOrCreate } from '@typegoose/typegoose/lib/defaultClasses'; +import { Converse } from '../chat/converse'; +import { User } from './user'; +import findorcreate from 'mongoose-findorcreate'; +import { plugin } from '@typegoose/typegoose'; +import type { Types } from 'mongoose'; + +/** + * 用户私信列表管理 + */ + +@plugin(findorcreate) +@modelOptions({ + schemaOptions: { + collection: 'userdmlist', + }, +}) +export class UserDMList extends FindOrCreate implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + ref: () => User, + index: true, + }) + userId: Ref; + + @prop({ + ref: () => Converse, + }) + converseIds: Ref[]; +} + +export type UserDMListDocument = DocumentType; + +const model = getModelForClass(UserDMList); + +export type UserDMListModel = typeof model; + +export default model; diff --git a/server/models/user/friend.ts b/server/models/user/friend.ts new file mode 100644 index 00000000000..8eff84bf6ae --- /dev/null +++ b/server/models/user/friend.ts @@ -0,0 +1,67 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + plugin, + ReturnModelType, +} from '@typegoose/typegoose'; +import { Base, FindOrCreate } from '@typegoose/typegoose/lib/defaultClasses'; +import { User } from './user'; +import findorcreate from 'mongoose-findorcreate'; +import type { Types } from 'mongoose'; + +/** + * 好友请求 + * 单向好友结构 + */ +@plugin(findorcreate) +export class Friend extends FindOrCreate implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + ref: () => User, + index: true, + }) + from: Ref; + + @prop({ + ref: () => User, + }) + to: Ref; + + /** + * 好友昵称, 覆盖用户自己的昵称 + */ + @prop() + nickname?: string; + + @prop() + createdAt: Date; + + static async buildFriendRelation( + this: ReturnModelType, + user1: string, + user2: string + ) { + await Promise.all([ + this.findOrCreate({ + from: user1, + to: user2, + }), + this.findOrCreate({ + from: user2, + to: user1, + }), + ]); + } +} + +export type FriendDocument = DocumentType; + +const model = getModelForClass(Friend); + +export type FriendModel = typeof model; + +export default model; diff --git a/server/models/user/friendRequest.ts b/server/models/user/friendRequest.ts new file mode 100644 index 00000000000..cf9aa180012 --- /dev/null +++ b/server/models/user/friendRequest.ts @@ -0,0 +1,36 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, +} from '@typegoose/typegoose'; +import type { Base } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; +import { User } from './user'; + +/** + * 好友请求 + */ + +export class FriendRequest implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + ref: () => User, + index: true, + }) + from: Ref; + + @prop({ + ref: () => User, + }) + to: Ref; + + @prop() + message: string; +} + +export type FriendRequestDocument = DocumentType; + +export default getModelForClass(FriendRequest); diff --git a/server/models/user/mail.ts b/server/models/user/mail.ts new file mode 100644 index 00000000000..c77b514af2d --- /dev/null +++ b/server/models/user/mail.ts @@ -0,0 +1,191 @@ +import { + getModelForClass, + prop, + DocumentType, + Ref, + modelOptions, + Severity, + ReturnModelType, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; +import { User } from './user'; +import nodemailer, { Transporter, SendMailOptions } from 'nodemailer'; +import { parseConnectionUrl } from 'nodemailer/lib/shared'; +import { config } from 'tailchat-server-sdk'; +import type SMTPConnection from 'nodemailer/lib/smtp-connection'; + +/** + * 将地址格式化 + */ +function stringifyAddress(address: SendMailOptions['to']): string { + if (Array.isArray(address)) { + return address.map((a) => stringifyAddress(a)).join(','); + } + + if (typeof address === 'string') { + return address; + } else if (address === undefined) { + return ''; + } else if (typeof address === 'object') { + return `"${address.name}" ${address.address}`; + } +} + +function getSMTPConnectionOptions(): SMTPConnection.Options | null { + if (config.smtp.connectionUrl) { + return parseConnectionUrl(config.smtp.connectionUrl); + } + + return null; +} + +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +export class Mail extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + /** + * 发件人邮箱 + */ + @prop() + from: string; + + /** + * 收件人邮箱 + */ + @prop() + to: string; + + /** + * 邮件主题 + */ + @prop() + subject: string; + + /** + * 邮件内容 + */ + @prop() + body: string; + + @prop() + host?: string; + + @prop() + port?: string; + + @prop() + secure?: boolean; + + @prop() + is_success: boolean; + + @prop() + data?: any; + + @prop() + error?: string; + + /** + * 创建邮件发送实例 + */ + static createMailerTransporter(): Transporter | null { + const options = getSMTPConnectionOptions(); + + if (options) { + const transporter = nodemailer.createTransport(options); + + return transporter; + } + + return null; + } + + /** + * 检查邮件服务是否可用 + */ + static async verifyMailService(): Promise { + try { + const transporter = Mail.createMailerTransporter(); + + if (!transporter) { + return false; + } + + const verify = await transporter.verify(); + return verify; + } catch (e) { + console.error(e); + return false; + } + } + + /** + * 发送邮件 + */ + static async sendMail( + this: ReturnModelType, + mailOptions: SendMailOptions + ) { + try { + const transporter = Mail.createMailerTransporter(); + if (!transporter) { + throw new Error('Mail Transporter is null'); + } + + const options = { + from: config.smtp.senderName, + ...mailOptions, + }; + + const smtpOptions = getSMTPConnectionOptions(); + try { + const info = await transporter.sendMail(options); + + await this.create({ + from: stringifyAddress(options.from), + to: stringifyAddress(options.to), + subject: options.subject, + body: options.html, + host: smtpOptions.host, + port: smtpOptions.port, + secure: smtpOptions.secure, + is_success: true, + data: info, + }); + + return info; + } catch (err) { + this.create({ + from: stringifyAddress(options.from), + to: stringifyAddress(options.to), + subject: options.subject, + body: options.html, + host: smtpOptions.host, + port: smtpOptions.port, + secure: smtpOptions.secure, + is_success: false, + error: String(err), + }); + + throw err; + } + } catch (err) { + console.error(err); + throw err; + } + } +} + +export type MailDocument = DocumentType; + +const model = getModelForClass(Mail); + +export type MailModel = typeof model; + +export default model; diff --git a/server/models/user/user.ts b/server/models/user/user.ts new file mode 100644 index 00000000000..09e27ab5f6b --- /dev/null +++ b/server/models/user/user.ts @@ -0,0 +1,191 @@ +import { + getModelForClass, + prop, + DocumentType, + ReturnModelType, + modelOptions, + Severity, + index, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; +import { UserType, userType } from 'tailchat-server-sdk'; + +type BaseUserInfo = Pick; + +/** + * 用户设置 + */ +export interface UserSettings { + /** + * 消息列表虚拟化 + */ + messageListVirtualization?: boolean; + [key: string]: any; +} + +export interface UserLoginRes extends User { + token: string; +} + +@modelOptions({ + options: { + allowMixed: Severity.ALLOW, + }, +}) +@index({ avatar: 1 }) +export class User extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + /** + * 用户名 不可被修改 + * 与email必有一个 + */ + @prop() + username?: string; + + /** + * 邮箱 不可被修改 + * 必填 + */ + @prop({ + index: true, + unique: true, + }) + email: string; + + @prop() + password!: string; + + /** + * 可以被修改的显示名 + */ + @prop({ + trim: true, + maxlength: 20, + }) + nickname!: string; + + /** + * 识别器, 跟username构成全局唯一的用户名 + * 用于搜索 + * # + */ + @prop() + discriminator: string; + + /** + * 是否为临时用户 + * @default false + */ + @prop({ + default: false, + }) + temporary: boolean; + + /** + * 头像 + */ + @prop() + avatar?: string; + + /** + * 用户类型 + */ + @prop({ + enum: userType, + type: () => String, + default: 'normalUser', + }) + type: UserType; + + /** + * 邮箱是否可用 + */ + @prop({ + default: false, + }) + emailVerified: boolean; + + /** + * 是否被封禁 + */ + @prop({ + default: false, + }) + banned: boolean; + + /** + * 用户的额外信息 + */ + @prop() + extra?: object; + + /** + * 用户设置 + */ + @prop({ + default: {}, + }) + settings: UserSettings; + + /** + * 生成身份识别器 + * 0001 - 9999 + */ + public static generateDiscriminator( + this: ReturnModelType, + nickname: string + ): Promise { + let restTimes = 10; // 最多找10次 + const checkDiscriminator = async () => { + const discriminator = String( + Math.floor(Math.random() * 9999) + 1 + ).padStart(4, '0'); + + const doc = await this.findOne({ + nickname, + discriminator, + }).exec(); + restTimes--; + + if (doc !== null) { + // 已存在, 换一个 + if (restTimes <= 0) { + throw new Error('Cannot find space discriminator'); + } + + return checkDiscriminator(); + } + + return discriminator; + }; + + return checkDiscriminator(); + } + + /** + * 获取用户基本信息 + */ + static async getUserBaseInfo( + this: ReturnModelType, + userId: string + ): Promise { + const user = await this.findById(String(userId)); + + return { + nickname: user.nickname, + discriminator: user.discriminator, + avatar: user.avatar, + }; + } +} + +export type UserDocument = DocumentType; + +const model = getModelForClass(User); + +export type UserModel = typeof model; + +export default model; diff --git a/server/moleculer.config.ts b/server/moleculer.config.ts new file mode 100644 index 00000000000..f41ccc42afa --- /dev/null +++ b/server/moleculer.config.ts @@ -0,0 +1,23 @@ +import { + defaultBrokerConfig, + config, + BrokerOptions, +} from 'tailchat-server-sdk'; + +const brokerConfig: BrokerOptions = { + ...defaultBrokerConfig, +}; + +if (config.feature.disableLogger === true) { + brokerConfig.logger = false; +} + +if (config.feature.disableInfoLog === true) { + brokerConfig.logLevel = 'error'; +} + +if (config.feature.disableTracing === true) { + brokerConfig.tracing = undefined; +} + +export default brokerConfig; diff --git a/server/openapi.json b/server/openapi.json new file mode 100644 index 00000000000..d7893950639 --- /dev/null +++ b/server/openapi.json @@ -0,0 +1,3379 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Tailchat Openapi", + "version": "0.0.0" + }, + "paths": { + "/debug/hello": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": [ + { + "type": "string", + "optional": true + } + ] + } + } + } + } + } + } + }, + "/debug/sleep": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "second": { + "type": "number" + } + } + } + } + } + } + } + }, + "/config/client": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/config/setClientConfig": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "any" + } + } + } + } + } + } + } + }, + "/config/all": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/config/get": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "key": { + "type": "string" + } + } + } + } + } + } + } + }, + "/config/set": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "any" + } + } + } + } + } + } + } + }, + "/config/addToSet": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "any" + } + } + } + } + } + } + } + }, + "/file/save": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/file/saveFileWithUrl": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "fileUrl": { + "type": "string" + } + } + } + } + } + } + } + }, + "/file/get": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "objectName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/file/stat": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "objectName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/file/delete": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "objectName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/openapi.app/authToken": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "token": { + "type": "string" + }, + "capability": { + "type": "array", + "items": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/openapi.app/all": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/openapi.app/get": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/openapi.app/create": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appName": { + "type": "string" + }, + "appDesc": { + "type": "string" + }, + "appIcon": { + "type": "string" + } + } + } + } + } + } + } + }, + "/openapi.app/delete": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/openapi.app/setAppInfo": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "fieldName": { + "type": "string" + }, + "fieldValue": { + "type": "string" + } + } + } + } + } + } + } + }, + "/openapi.app/setAppCapability": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "capability": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/openapi.app/setAppOAuthInfo": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "fieldName": { + "type": "string" + }, + "fieldValue": { + "type": "any" + } + } + } + } + } + } + } + }, + "/openapi.app/setAppBotInfo": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "fieldName": { + "type": "string" + }, + "fieldValue": { + "type": "any" + } + } + } + } + } + } + } + }, + "/openapi.bot/login": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "token": { + "type": "string" + } + } + } + } + } + } + } + }, + "/openapi.bot/getOrCreateBotAccount": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/openapi.integration/addBotUser": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.ack/update": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "converseId": { + "type": "string" + }, + "lastMessageId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.ack/all": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/chat.converse/createDMConverse": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "memberIds": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/chat.converse/appendDMConverseMembers": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "converseId": { + "type": "string" + }, + "memberIds": { + "type": "array" + } + } + } + } + } + } + } + }, + "/chat.converse/findConverseInfo": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "converseId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.converse/findAndJoinRoom": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/chat.inbox/append": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "optional": true + }, + "type": { + "type": "string" + }, + "payload": { + "type": "any" + } + } + } + } + } + } + } + }, + "/chat.inbox/batchAppend": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userIds": { + "type": "array", + "items": "string" + }, + "type": { + "type": "string" + }, + "payload": { + "type": "any" + } + } + } + } + } + } + } + }, + "/chat.inbox/removeMessage": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "optional": true + }, + "groupId": { + "type": "string", + "optional": true + }, + "converseId": { + "type": "string" + }, + "messageId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.inbox/all": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/chat.inbox/ack": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "inboxItemIds": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/chat.inbox/clear": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/chat.message/fetchConverseMessage": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "converseId": { + "type": "string" + }, + "startId": { + "type": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/chat.message/fetchNearbyMessage": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string", + "optional": true + }, + "converseId": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "num": { + "type": "number", + "optional": true + } + } + } + } + } + } + } + }, + "/chat.message/sendMessage": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "converseId": { + "type": "string" + }, + "groupId": [ + { + "type": "string", + "optional": true + } + ], + "content": { + "type": "string" + }, + "plain": { + "type": "string", + "optional": true + }, + "meta": { + "type": "any", + "optional": true + } + } + } + } + } + } + } + }, + "/chat.message/recallMessage": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "messageId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.message/getMessage": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "messageId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.message/deleteMessage": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "messageId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.message/searchMessage": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string", + "optional": true + }, + "converseId": { + "type": "string" + }, + "text": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.message/fetchConverseLastMessages": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "converseIds": { + "type": "array" + } + } + } + } + } + } + } + }, + "/chat.message/addReaction": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "messageId": { + "type": "string" + }, + "emoji": { + "type": "string" + } + } + } + } + } + } + } + }, + "/chat.message/removeReaction": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "messageId": { + "type": "string" + }, + "emoji": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/createGroup": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "panels": { + "type": "array" + } + } + } + } + } + } + } + }, + "/group/getUserGroups": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/group/getJoinedGroupAndPanelIds": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/group/getGroupBasicInfo": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/getGroupInfo": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/updateGroupField": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "fieldName": { + "type": "string" + }, + "fieldValue": { + "type": "any" + } + } + } + } + } + } + } + }, + "/group/updateGroupConfig": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "configName": { + "type": "string" + }, + "configValue": { + "type": "any" + } + } + } + } + } + } + } + }, + "/group/isGroupOwner": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/addMember": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "userId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/joinGroup": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/quitGroup": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/isMember": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/appendGroupMemberRoles": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "memberIds": { + "type": "array", + "items": "string" + }, + "roles": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/group/removeGroupMemberRoles": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "memberIds": { + "type": "array", + "items": "string" + }, + "roles": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/group/createGroupPanel": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "number" + }, + "parentId": { + "type": "string", + "optional": true + }, + "provider": { + "type": "string", + "optional": true + }, + "pluginPanelName": { + "type": "string", + "optional": true + }, + "meta": { + "type": "object", + "optional": true + } + } + } + } + } + } + } + }, + "/group/modifyGroupPanel": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "panelId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "number" + }, + "provider": { + "type": "string", + "optional": true + }, + "pluginPanelName": { + "type": "string", + "optional": true + }, + "meta": { + "type": "object", + "optional": true + }, + "permissionMap": { + "type": "object", + "optional": true + }, + "fallbackPermissions": { + "type": "array", + "items": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/group/deleteGroupPanel": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "panelId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/getGroupLobbyConverseId": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/createGroupRole": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "roleName": { + "type": "string" + }, + "permissions": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/group/deleteGroupRole": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "roleId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/updateGroupRoleName": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "roleId": { + "type": "string" + }, + "roleName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/updateGroupRolePermission": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "roleId": { + "type": "string" + }, + "permissions": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/group/getPermissions": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/getUserAllPermissions": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "userId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group/muteGroupMember": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "memberId": { + "type": "string" + }, + "muteMs": { + "type": "number" + } + } + } + } + } + } + } + }, + "/group/deleteGroupMember": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "memberId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group.extra/getGroupData": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "name": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group.extra/saveGroupData": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group.extra/getPanelData": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "panelId": { + "type": "string" + }, + "name": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group.extra/savePanelData": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "panelId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group.invite/createGroupInvite": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "inviteType": { + "type": "enum", + "values": [ + "normal", + "permanent" + ] + } + } + } + } + } + } + } + }, + "/group.invite/editGroupInvite": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "expiredAt": { + "type": "number", + "optional": true + }, + "usageLimit": { + "type": "number", + "optional": true + } + } + } + } + } + } + } + }, + "/group.invite/getAllGroupInviteCode": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group.invite/findInviteByCode": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group.invite/applyInvite": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + } + } + } + } + } + } + } + }, + "/group.invite/deleteInvite": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "inviteId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin.registry/list": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/user.dmlist/addConverse": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "converseId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user.dmlist/removeConverse": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "converseId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user.dmlist/getAllConverse": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/friend/getAllFriends": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/friend/buildFriendRelation": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "user1": { + "type": "string" + }, + "user2": { + "type": "string" + } + } + } + } + } + } + } + }, + "/friend/removeFriend": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "friendUserId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/friend/checkIsFriend": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "targetId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/friend/setFriendNickname": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "targetId": { + "type": "string" + }, + "nickname": { + "type": "string" + } + } + } + } + } + } + } + }, + "/friend.request/add": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "to": { + "type": "string" + }, + "message": [ + { + "type": "string", + "optional": true + } + ] + } + } + } + } + } + } + }, + "/friend.request/allRelated": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/friend.request/accept": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "requestId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/friend.request/deny": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "requestId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/friend.request/cancel": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "requestId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/mail/sendMail": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "to": { + "type": "string" + }, + "subject": { + "type": "string" + }, + "html": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/login": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "username": [ + { + "type": "string", + "optional": true + } + ], + "email": [ + { + "type": "email", + "optional": true + } + ], + "password": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/verifyEmail": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "email" + } + } + } + } + } + } + } + }, + "/user/verifyEmailWithOTP": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "emailOTP": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/register": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "username": { + "type": "string", + "optional": true, + "max": 40 + }, + "email": { + "type": "email", + "optional": true, + "max": 40 + }, + "nickname": { + "type": "string", + "optional": true, + "max": 40 + }, + "password": { + "type": "string", + "max": 40 + }, + "emailOTP": { + "type": "string", + "optional": true + }, + "avatar": { + "type": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/user/signUserToken": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/modifyPassword": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "oldPassword": { + "type": "string" + }, + "newPassword": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/createTemporaryUser": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "nickname": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/claimTemporaryUser": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string" + }, + "username": { + "type": "string", + "optional": true, + "max": 40 + }, + "email": { + "type": "email", + "max": 40 + }, + "password": { + "type": "string", + "max": 40 + }, + "emailOTP": { + "type": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/user/forgetPassword": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "email" + } + } + } + } + } + } + } + }, + "/user/resetPassword": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "email" + }, + "password": { + "type": "string" + }, + "otp": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/resolveToken": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/checkTokenValid": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/banUser": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/unbanUser": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/whoami": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/user/searchUserWithUniqueName": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "uniqueName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/getUserInfo": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/getUserInfoList": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userIds": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/user/findUserByEmail": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/findUserByUsername": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "username": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/updateUserField": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "fieldName": { + "type": "string" + }, + "fieldValue": { + "type": "any" + } + } + } + } + } + } + } + }, + "/user/updateUserExtra": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "fieldName": { + "type": "string" + }, + "fieldValue": { + "type": "any" + } + } + } + } + } + } + } + }, + "/user/getUserSettings": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/user/setUserSettings": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "settings": { + "type": "object" + } + } + } + } + } + } + } + }, + "/user/ensurePluginBot": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "botId": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "avatar": { + "type": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/user/findOpenapiBotId": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string" + } + } + } + } + } + } + } + }, + "/user/ensureOpenapiBot": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "botId": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "avatar": { + "type": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/user/generateUserToken": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "email": { + "type": "string" + }, + "avatar": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.agora/available": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.agora/generateJoinInfo": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "channelName": { + "type": "string" + }, + "userId": { + "type": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.agora/getChannelUserList": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "channelName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.agora/webhook": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "noticeId": { + "type": "string" + }, + "productId": { + "type": "number" + }, + "eventType": { + "type": "number" + }, + "notifyMs": { + "type": "number" + }, + "payload": { + "type": "any" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.discover/all": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "page": { + "type": "number", + "default": 1 + }, + "size": { + "type": "number", + "default": 20 + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.discover/join": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.getui/available": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.github.subscribe/add": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "textPanelId": { + "type": "string" + }, + "repoName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.github.subscribe/list": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.github.subscribe/delete": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "subscribeId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.github.subscribe/webhook.callback": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.iam/availableStrategies": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.iam/github.loginUrl": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.iam/github.redirect": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.linkmeta/fetch": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "url": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.livekit/available": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.livekit/url": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.livekit/generateToken": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "roomName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.livekit/roomMembers": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "roomName": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.livekit/inviteCall": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "roomName": { + "type": "string" + }, + "targetUserIds": { + "type": "array", + "items": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.livekit/webhook": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.prettyinvite/badge": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "inviteCode": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.simplenotify/addGroupSubscribe": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "textPanelId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.simplenotify/addUserSubscribe": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.simplenotify/list": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "type": { + "type": "enum", + "values": [ + "user", + "group" + ] + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.simplenotify/delete": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "subscribeId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.simplenotify/webhook.callback": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "subscribeId": { + "type": "string" + }, + "text": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.tasks/all": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/plugin:com.msgbyte.tasks/add": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "assignee": { + "optional": true, + "type": "array", + "items": "string" + }, + "description": { + "optional": true, + "type": "string" + }, + "expiredAt": { + "optional": true, + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.tasks/done": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "taskId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.tasks/undone": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "taskId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.tasks/update": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "taskId": { + "type": "string" + }, + "title": { + "optional": true, + "type": "string" + }, + "assignee": { + "optional": true, + "type": "string" + }, + "description": { + "optional": true, + "type": "string" + }, + "expiredAt": { + "optional": true, + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.topic/list": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "panelId": { + "type": "string" + }, + "page": { + "type": "number", + "optional": true + }, + "size": { + "type": "number", + "optional": true + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.topic/create": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "panelId": { + "type": "string" + }, + "content": { + "type": "string" + }, + "meta": { + "type": "object", + "optional": true + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.topic/createComment": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "panelId": { + "type": "string" + }, + "topicId": { + "type": "string" + }, + "content": { + "type": "string" + }, + "replyCommentId": { + "type": "string", + "optional": true + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.topic/delete": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "panelId": { + "type": "string" + }, + "topicId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.welcome/joinGroupCallback": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + } + } + } + } + } + } + } + }, + "/plugin:com.msgbyte.wxpusher/available": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + } + } +} diff --git a/server/openapi.yaml b/server/openapi.yaml new file mode 100644 index 00000000000..aacab04b0df --- /dev/null +++ b/server/openapi.yaml @@ -0,0 +1,431 @@ +openapi: 3.0.3 +info: + title: Tailchat API + description: "Tailchat: The next-generation noIM Application in your own workspace" + contact: + name: moonrailgun + url: https://tailchat.msgbyte.com/ + email: moonrailgun@gmail.com + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + version: 1.7.6 +servers: + - url: http://localhost:11000 + description: localhost +paths: + /api/debug/hello: + get: + tags: + - debug + summary: Send debug action + parameters: + - in: query + name: name + schema: + type: string + required: false + responses: + '200': + description: ok (code 0) + content: + application/json: + schema: + type: object + properties: + code: + type: integer + example: 200 + data: + type: string + /api/user/login: + post: + tags: + - user + summary: Login Tailchat with email and password + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + password: + type: string + responses: + '200': + $ref: '#/components/responses/UserInfo' + '422': + $ref: '#/components/responses/EntityError' + /api/user/verifyEmail: + post: + tags: + - user + summary: verifyEmail Email with send mail + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + responses: + '200': + $ref: '#/components/responses/ActionSuccess' + '401': + $ref: '#/components/responses/Unauthorized' + /api/user/verifyEmailWithOTP: + post: + tags: + - user + summary: verifyEmail Email with apply email OTP + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + password: + type: string + responses: + '200': + $ref: '#/components/responses/UserInfo' + '401': + $ref: '#/components/responses/Unauthorized' + + /api/user/register: + post: + tags: + - user + summary: Register Account + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - type: object + properties: + email: + type: string + password: + type: string + - type: object + properties: + email: + type: string + password: + type: string + emailOTP: + type: string + responses: + '200': + $ref: '#/components/responses/UserInfo' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + /api/user/modifyPassword: + post: + tags: + - user + summary: Modify Account Password + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + oldPassword: + type: string + newPassword: + type: string + responses: + '200': + $ref: '#/components/responses/ActionSuccess' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + /api/user/createTemporaryUser: + post: + tags: + - user + summary: Create Temporary User + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + nickname: + type: string + responses: + '200': + $ref: '#/components/responses/UserInfo' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + /api/user/claimTemporaryUser: + post: + tags: + - user + summary: Claim Temporary User + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - type: object + properties: + userId: + type: string + email: + type: string + password: + type: string + - type: object + properties: + userId: + type: string + email: + type: string + password: + type: string + emailOTP: + type: string + responses: + '200': + $ref: '#/components/responses/UserInfo' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + /api/user/forgetPassword: + post: + tags: + - user + summary: Forget Password + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + responses: + '200': + $ref: '#/components/responses/ActionSuccess' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + + /api/user/resetPassword: + post: + tags: + - user + summary: Reset Password + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + email: + type: string + password: + type: string + description: new password + otp: + type: string + responses: + '200': + $ref: '#/components/responses/ActionSuccess' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + /api/user/resolveToken: + post: + tags: + - user + summary: Login with token + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + token: + type: string + responses: + '200': + $ref: '#/components/responses/UserInfo' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + /api/user/checkTokenValid: + post: + tags: + - user + summary: Check Token Valid + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + token: + type: string + responses: + '200': + $ref: '#/components/responses/Boolean' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + +components: + responses: + ActionSuccess: + description: No response and return true + content: + application/json: + schema: + $ref: '#/components/schemas/Success' + Boolean: + description: Return true or false + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/Success' + - $ref: '#/components/schemas/Failed' + UserInfo: + description: User Info + content: + application/json: + schema: + type: object + properties: + code: + type: integer + example: 200 + data: + $ref: '#/components/schemas/UserPayload' + Unauthorized: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + EntityError: + description: EntityError + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + ServerError: + description: EntityError + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + schemas: + UserPayload: + type: object + properties: + _id: + type: string + email: + type: string + nickname: + type: string + discriminator: + type: string + temporary: + type: boolean + example: false + avatar: + type: string + type: + type: string + enum: + - normalUser + - pluginBot + - openapiBot + example: normalUser + emailVerified: + type: boolean + banned: + type: boolean + example: false + createdAt: + type: string + token: + type: string + # Schema for success response body + Success: + type: object + properties: + code: + type: string + example: 200 + data: + type: boolean + example: true + required: + - code + - message + Failed: + type: object + properties: + code: + type: string + example: 200 + data: + type: boolean + example: false + required: + - code + - message + # Schema for error response body + Error: + type: object + properties: + code: + type: string + message: + type: string + required: + - code + - message + + securitySchemes: + JWTAuth: + type: apiKey + in: header + name: X-Token + description: Token which get from login + +security: + - JWTAuth: [] diff --git a/server/package.json b/server/package.json new file mode 100644 index 00000000000..004bf1b05be --- /dev/null +++ b/server/package.json @@ -0,0 +1,119 @@ +{ + "name": "tailchat-server", + "private": true, + "main": "index.js", + "repository": "https://github.com/msgbyte/tailchat-server.git", + "author": "moonrailgun ", + "license": "Apache-2.0", + "scripts": { + "dev": "concurrently --kill-others npm:dev:main npm:dev:sdk npm:dev:plugins npm:dev:admin", + "dev:main": "ts-node ./runner.ts", + "dev:sdk": "cd packages/sdk && pnpm watch", + "dev:plugins": "pnpm run --filter \"./plugins/*\" build:web:watch", + "dev:admin": "cd admin && pnpm dev", + "debug": "node --inspect -r ts-node/register ./runner.ts", + "build": "ts-node scripts/build.ts", + "start:service": "cd dist && tailchat-runner --config moleculer.config.js", + "connect": "tailchat connect", + "translation": "node ./scripts/scanTranslation.js", + "check:type": "tsc --noEmit --skipLibCheck", + "test": "jest", + "migrate:up": "migrate-mongo up -f ./scripts/migrate-mongo-config.js", + "docker:build": "node ./scripts/buildDocker.js", + "dashboard": "ts-node ./scripts/dashboard.ts", + "admin": "cd admin && pnpm run build && pnpm run start", + "plugin:install": "node ./scripts/installPlugin.js", + "protobuf": "proto-loader-gen-types --longs=String --enums=String --defaults --oneofs --grpcLib=@grpc/grpc-js --outDir=proto/ proto/*.proto", + "gen:swagger:old": "ts-node ./scripts/swagger.ts", + "gen:openapi": "tailchat-service-openapi-generator" + }, + "dependencies": { + "@socket.io/admin-ui": "^0.5.1", + "@socket.io/redis-adapter": "^8.2.1", + "@typegoose/typegoose": "9.3.1", + "@types/blessed": "^0.1.19", + "@types/bluebird": "^3.5.36", + "@types/glob": "^8.1.0", + "accepts": "^1.3.8", + "bcryptjs": "^2.4.3", + "bluebird": "^3.7.2", + "crc": "^3.8.0", + "crypto-random-string": "3.3.1", + "dotenv": "^10.0.0", + "ejs": "^3.1.6", + "es6-error": "^4.1.1", + "execa": "5", + "glob": "^10.3.3", + "got": "11.8.3", + "i18next": "^20.3.5", + "ioredis": "^4.27.6", + "jsonwebtoken": "^8.5.1", + "lodash": "^4.17.21", + "mime": "^2.5.2", + "mkdirp": "^1.0.4", + "moment": "^2.29.1", + "mongodb": "4.2.1", + "mongoose": "6.1.1", + "mongoose-findorcreate": "3.0.0", + "nanoid": "^3.1.23", + "nodemailer": "^6.7.2", + "oidc-provider": "^7.10.6", + "p-map": "^4.0.0", + "promise-retry": "^2.0.1", + "qs": "^6.10.3", + "redlock": "^4.2.0", + "send": "^0.18.0", + "serve-static": "^1.15.0", + "socket.io": "^4.7.2", + "socket.io-msgpack-parser": "^3.0.2", + "tailchat-server-sdk": "workspace:*", + "ts-node": "^10.0.0", + "typescript": "^4.3.3", + "url-regex": "^5.0.0" + }, + "devDependencies": { + "@babel/helper-compilation-targets": "^7.18.2", + "@types/accepts": "^1.3.5", + "@types/bcryptjs": "^2.4.2", + "@types/crc": "^3.4.0", + "@types/ejs": "^3.1.0", + "@types/fs-extra": "^9.0.13", + "@types/i18next-fs-backend": "^1.0.1", + "@types/inquirer": "^8.2.1", + "@types/ioredis": "^4.26.4", + "@types/jest": "^26.0.23", + "@types/jsonwebtoken": "^8.5.2", + "@types/lodash": "^4.14.170", + "@types/mime": "^2.0.3", + "@types/minio": "^7.0.9", + "@types/mkdirp": "^1.0.1", + "@types/mongoose": "^5.11.97", + "@types/node": "16.11.7", + "@types/nodemailer": "^6.4.4", + "@types/oidc-provider": "^7.8.1", + "@types/promise-retry": "^1.1.3", + "@types/send": "^0.17.1", + "@types/serve-static": "^1.15.0", + "@types/swagger-jsdoc": "^6.0.1", + "fs-extra": "^10.0.0", + "gulp-sort": "^2.0.0", + "i18next-scanner": "^3.0.0", + "inquirer": "^8.2.2", + "jest": "27.5.1", + "mini-star": "^1.2.8", + "moleculer": "0.14.23", + "moleculer-cli": "^0.7.1", + "neo-blessed": "^0.2.0", + "ora": "5", + "prettier": "^2.3.2", + "socket.io-client": "^4.1.3", + "swagger-jsdoc": "^6.2.8", + "tailchat-service-openapi-generator": "workspace:^", + "tailchat-service-swagger-generator": "workspace:^1.0.0", + "ts-jest": "27.1.4", + "vinyl-fs": "^3.0.3" + }, + "peerDependencies": { + "moleculer": "0.14.23" + } +} diff --git a/server/packages/openapi-generator/package.json b/server/packages/openapi-generator/package.json new file mode 100644 index 00000000000..7ed6361cc48 --- /dev/null +++ b/server/packages/openapi-generator/package.json @@ -0,0 +1,31 @@ +{ + "name": "tailchat-service-openapi-generator", + "private": true, + "version": "1.0.0", + "description": "", + "main": "index.js", + "bin": "./dist/index.js", + "scripts": { + "dev": "tsc --watch", + "prepare": "tsc", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "msgbyte", + "moonrailgun", + "tailchat" + ], + "author": "moonrailgun ", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", + "globby": "11.1.0", + "openapi3-ts": "^4.3.1", + "tailchat-server-sdk": "workspace:^", + "ts-node": "^10.9.1" + }, + "devDependencies": { + "@types/node": "^18.11.18", + "typescript": "^4.9.4" + } +} diff --git a/server/packages/openapi-generator/src/generateOpenapiPath.ts b/server/packages/openapi-generator/src/generateOpenapiPath.ts new file mode 100644 index 00000000000..732cb050425 --- /dev/null +++ b/server/packages/openapi-generator/src/generateOpenapiPath.ts @@ -0,0 +1,38 @@ +import _ from 'lodash'; +import type { TcService } from 'tailchat-server-sdk'; +import type { PathsObject, SchemaObject } from 'openapi3-ts/oas31'; + +export function generateOpenapiPath(service: TcService): PathsObject { + const serviceName = service.serviceName; + const actions = service.getActionList(); + + const paths: PathsObject = {}; + + for (const action of actions) { + const pathName = '/' + serviceName + '/' + action.name; + paths[pathName] = { + post: { + requestBody: { + content: { + 'application/json': { + schema: { + type: 'object', + properties: generateRequestBodyProperties(action.params), + }, + }, + }, + }, + }, + }; + } + + return paths; +} + +function generateRequestBodyProperties(params: { + [x: string]: any; +}): Record { + return _.mapValues(params, (type) => { + return type; + }); +} diff --git a/server/packages/openapi-generator/src/index.ts b/server/packages/openapi-generator/src/index.ts new file mode 100644 index 00000000000..da780dcc7cc --- /dev/null +++ b/server/packages/openapi-generator/src/index.ts @@ -0,0 +1,70 @@ +import globby from 'globby'; +import { TcBroker, TcService } from 'tailchat-server-sdk'; +import { generateOpenapiPath } from './generateOpenapiPath'; +import type { OpenAPIObject } from 'openapi3-ts/oas31'; +import SwaggerParser from '@apidevtools/swagger-parser'; +import fs from 'fs-extra'; +import path from 'path'; +import 'ts-node/register'; + +/** + * https://ts-morph.com/setup/ + */ + +/** + * 扫描服务 + */ +async function scanServices(): Promise { + const packageJsonPath = path.resolve(__dirname, '../../../../package.json'); + const version = (await fs.readJson(packageJsonPath)).verson || '0.0.0'; + const serviceFiles = await globby( + ['./services/**/*.service.ts', './plugins/**/*.service.ts'], + { + absolute: true, + } + ); + + console.log('Service List:', serviceFiles); + + const openapiObj: OpenAPIObject = { + openapi: '3.1.0', + info: { + title: 'Tailchat Openapi', + version, + }, + paths: {}, + }; + const broker = new TcBroker({ + logger: false, + }); + for (const servicePath of serviceFiles) { + const { default: serviceCls } = await import(servicePath); + + if (TcService.prototype.isPrototypeOf(serviceCls.prototype)) { + const service: TcService = new serviceCls(broker); + + openapiObj.paths = { + ...openapiObj.paths, + ...generateOpenapiPath(service), + }; + } + } + broker.stop(); + + try { + await SwaggerParser.validate(openapiObj as any); + + return openapiObj; + } catch (err) { + console.error(err); + } +} + +scanServices().then(async (openapiObj) => { + await fs.writeJSON('./openapi.json', openapiObj, { + spaces: 2, + }); + console.log( + 'generate completed, if process not exist auto, you can exit it by yourself' + ); +}); diff --git a/server/packages/openapi-generator/tsconfig.json b/server/packages/openapi-generator/tsconfig.json new file mode 100644 index 00000000000..844f574508f --- /dev/null +++ b/server/packages/openapi-generator/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "./dist", + "paths": {} + }, + "include": ["./src/**/*"], + "exclude": ["./node_modules/**/*", "./dist/**/*"] +} diff --git a/server/packages/sdk/.gitignore b/server/packages/sdk/.gitignore new file mode 100644 index 00000000000..1521c8b7652 --- /dev/null +++ b/server/packages/sdk/.gitignore @@ -0,0 +1 @@ +dist diff --git a/server/packages/sdk/package.json b/server/packages/sdk/package.json new file mode 100644 index 00000000000..2fc761e60fb --- /dev/null +++ b/server/packages/sdk/package.json @@ -0,0 +1,63 @@ +{ + "name": "tailchat-server-sdk", + "version": "0.0.18", + "description": "", + "main": "dist/index.js", + "bin": { + "tailchat-runner": "./dist/runner/cli.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc --watch", + "test": "echo \"Error: no test specified\" && exit 1", + "prepare": "tsc", + "release": "npm version patch && npm publish --registry https://registry.npmjs.com/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/msgbyte/tailchat.git" + }, + "keywords": [ + "msgbyte", + "moonrailgun", + "tailchat" + ], + "author": "moonrailgun ", + "license": "MIT", + "bugs": { + "url": "https://github.com/msgbyte/tailchat/issues" + }, + "homepage": "https://github.com/msgbyte/tailchat#readme", + "devDependencies": { + "@types/jest": "^29.5.1", + "typescript": "^4.3.3" + }, + "dependencies": { + "@fastify/busboy": "^1.1.0", + "@typegoose/typegoose": "9.3.1", + "accept-language": "^3.0.18", + "axios": "^1.3.3", + "body-parser": "^1.20.1", + "crc": "^3.8.0", + "dotenv": "^10.0.0", + "etag": "^1.8.1", + "fastest-validator": "^1.12.0", + "fresh": "^0.5.2", + "i18next": "^20.3.5", + "i18next-fs-backend": "^1.1.1", + "ioredis": "^4.27.6", + "isstream": "^0.1.2", + "kleur": "^4.1.4", + "lodash": "^4.17.21", + "minio": "^7.1.1", + "moleculer": "0.14.23", + "moleculer-db": "0.8.19", + "moleculer-repl": "^0.7.2", + "moment": "^2.29.1", + "mongodb": "4.2.1", + "mongoose": "6.1.1", + "path-to-regexp": "^6.2.1", + "ramda-adjunct": "^4.0.0", + "tailchat-types": "workspace:*" + } +} diff --git a/server/packages/sdk/src/const.ts b/server/packages/sdk/src/const.ts new file mode 100644 index 00000000000..a8e70f2710c --- /dev/null +++ b/server/packages/sdk/src/const.ts @@ -0,0 +1,9 @@ +/** + * 系统用户id + */ +export const SYSTEM_USERID = '000000000000000000000000'; + +/** + * 配置项 + */ +export const CONFIG_GATEWAY_AFTER_HOOK = '$gatewayAfterHooks'; diff --git a/server/packages/sdk/src/db/index.ts b/server/packages/sdk/src/db/index.ts new file mode 100644 index 00000000000..95dbdbb2928 --- /dev/null +++ b/server/packages/sdk/src/db/index.ts @@ -0,0 +1,2 @@ +export * from './typegoose'; +export * from './mongoose'; diff --git a/server/packages/sdk/src/db/mongoose.ts b/server/packages/sdk/src/db/mongoose.ts new file mode 100644 index 00000000000..ec51ccee8d0 --- /dev/null +++ b/server/packages/sdk/src/db/mongoose.ts @@ -0,0 +1 @@ +export { Types, isValidObjectId } from 'mongoose'; diff --git a/server/packages/sdk/src/db/typegoose.ts b/server/packages/sdk/src/db/typegoose.ts new file mode 100644 index 00000000000..50b14ac0991 --- /dev/null +++ b/server/packages/sdk/src/db/typegoose.ts @@ -0,0 +1,10 @@ +export { + getModelForClass, + prop, + modelOptions, + Severity, + index, +} from '@typegoose/typegoose'; +export type { DocumentType, Ref, ReturnModelType } from '@typegoose/typegoose'; +export { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +export type { Base } from '@typegoose/typegoose/lib/defaultClasses'; diff --git a/server/packages/sdk/src/index.ts b/server/packages/sdk/src/index.ts new file mode 100644 index 00000000000..9ef81b27636 --- /dev/null +++ b/server/packages/sdk/src/index.ts @@ -0,0 +1,68 @@ +export { defaultBrokerConfig } from './runner/moleculer.config'; +export { TcService } from './services/base'; +export { TcBroker } from './services/broker'; +export type { TcDbService } from './services/mixins/db.mixin'; +export { TcMinioService } from './services/mixins/minio.mixin'; +export type { + TcContext, + TcPureContext, + PureContext, + UserJWTPayload, + GroupBaseInfo, + PureServiceSchema, + PureService, + PanelFeature, +} from './services/types'; +export { parseLanguageFromHead } from './services/lib/i18n/parser'; +export { t } from './services/lib/i18n'; +export { ApiGatewayMixin } from './services/lib/moleculer-web'; +export * as ApiGatewayErrors from './services/lib/moleculer-web/errors'; +export * from './services/lib/errors'; +export { PERMISSION, allPermission } from './services/lib/role'; +export { call } from './services/lib/call'; +export { + config, + buildUploadUrl, + builtinAuthWhitelist, + checkEnvTrusty, +} from './services/lib/settings'; + +// struct +export type { + MessageStruct, + MessageReactionStruct, + MessageMetaStruct, + InboxStruct, +} from './structs/chat'; +export type { BuiltinEventMap } from './structs/events'; +export type { + GroupStruct, + GroupRoleStruct, + GroupPanelStruct, +} from './structs/group'; +export { GroupPanelType } from './structs/group'; +export { userType } from './structs/user'; +export type { UserStruct, UserType, UserStructWithToken } from './structs/user'; + +// db +export * as db from './db'; + +// openapi +export * from './openapi'; + +export * from './const'; + +// other +export { Utils, Errors } from 'moleculer'; +export type { BrokerOptions } from 'moleculer'; + +/** + * 统一处理未捕获的错误, 防止直接把应用打崩 + * NOTICE: 未经测试 + */ +process.on('unhandledRejection', (reason, promise) => { + console.error('unhandledRejection', reason); +}); +process.on('uncaughtException', (error, origin) => { + console.error('uncaughtException', error); +}); diff --git a/server/packages/sdk/src/openapi/index.ts b/server/packages/sdk/src/openapi/index.ts new file mode 100644 index 00000000000..c22f08c8004 --- /dev/null +++ b/server/packages/sdk/src/openapi/index.ts @@ -0,0 +1 @@ +export { OAuthClient } from './oauth'; diff --git a/server/packages/sdk/src/openapi/oauth.ts b/server/packages/sdk/src/openapi/oauth.ts new file mode 100644 index 00000000000..d6c42106594 --- /dev/null +++ b/server/packages/sdk/src/openapi/oauth.ts @@ -0,0 +1,66 @@ +import axios, { AxiosInstance } from 'axios'; + +/** + * 用于 Tailchat OAuth 信息集成的实例 + */ +export class OAuthClient { + request: AxiosInstance; + + constructor( + apiUrl: string, + private appId: string, + private appSecret: string + ) { + this.request = axios.create({ + baseURL: apiUrl, + transformRequest: [ + function (data) { + let ret = ''; + for (const it in data) { + ret += + encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'; + } + ret = ret.substring(0, ret.lastIndexOf('&')); + return ret; + }, + ], + headers: { + 'content-type': 'application/x-www-form-urlencoded', + }, + }); + } + + /** + * 根据获取到的code获取授权码 + * @param code 从重定向获取到的临时code + * @param redirectUrl 重定向的地址 + */ + async getToken( + code: string, + redirectUrl: string + ): Promise<{ + access_token: string; + expires_in: string; + id_token: string; + scope: string; + token_type: string; + }> { + const { data: tokenInfo } = await this.request.post('/open/token', { + client_id: this.appId, + client_secret: this.appSecret, + redirect_uri: redirectUrl, + code, + grant_type: 'authorization_code', + }); + + return tokenInfo; + } + + async getUserInfo(accessToken: string): Promise { + const { data: userInfo } = await this.request.post('/open/me', { + access_token: accessToken, + }); + + return userInfo; + } +} diff --git a/server/packages/sdk/src/runner/cli.ts b/server/packages/sdk/src/runner/cli.ts new file mode 100644 index 00000000000..e04b4507987 --- /dev/null +++ b/server/packages/sdk/src/runner/cli.ts @@ -0,0 +1,4 @@ +import { Runner } from 'moleculer'; + +const runner = new Runner(); +runner.start(process.argv); diff --git a/server/packages/sdk/src/runner/index.ts b/server/packages/sdk/src/runner/index.ts new file mode 100644 index 00000000000..9f8564796a1 --- /dev/null +++ b/server/packages/sdk/src/runner/index.ts @@ -0,0 +1,55 @@ +import { Runner } from 'moleculer'; +import path from 'path'; +import cluster from 'cluster'; +import { config } from '../services/lib/settings'; + +declare module 'moleculer' { + class Runner { + flags?: { + config?: string; + repl?: boolean; + hot?: boolean; + silent?: boolean; + env?: boolean; + envfile?: string; + instances?: number; + mask?: string; + }; + servicePaths: string[]; + + start(args: any[]): void; + startWorkers(instances: number): void; + _run(): void; + } +} + +interface DevRunnerOptions { + config?: string; +} + +const isProd = config.env === 'production'; + +/** + * 开始一个启动器 + */ +export function startDevRunner(options: DevRunnerOptions) { + const runner = new Runner(); + runner.flags = { + hot: isProd ? false : true, + repl: isProd ? false : true, + env: true, + config: options.config ?? path.resolve(__dirname, './moleculer.config.ts'), + }; + runner.servicePaths = [ + 'services/**/*.service.ts', + 'services/**/*.service.dev.ts', // load plugins in dev mode + 'plugins/**/*.service.ts', + 'plugins/**/*.service.dev.ts', // load plugins in dev mode + ]; + + if (runner.flags.instances !== undefined && cluster.isPrimary) { + return runner.startWorkers(runner.flags.instances); + } + + return runner._run(); +} diff --git a/server/packages/sdk/src/runner/moleculer.config.ts b/server/packages/sdk/src/runner/moleculer.config.ts new file mode 100644 index 00000000000..1212af96d9a --- /dev/null +++ b/server/packages/sdk/src/runner/moleculer.config.ts @@ -0,0 +1,312 @@ +'use strict'; +import type { + BrokerOptions, + CallingOptions, + Errors, + ServiceBroker, +} from 'moleculer'; +import type { UserJWTPayload } from '../services/types'; +import moment from 'moment'; +import kleur from 'kleur'; +import { config } from '../services/lib/settings'; +import 'moleculer-repl'; + +/** + * Moleculer ServiceBroker configuration file + * + * More info about options: + * https://moleculer.services/docs/0.14/configuration.html + * + * + * Overwriting options in production: + * ================================ + * You can overwrite any option with environment variables. + * For example to overwrite the "logLevel" value, use `LOGLEVEL=warn` env var. + * To overwrite a nested parameter, e.g. retryPolicy.retries, use `RETRYPOLICY_RETRIES=10` env var. + * + * To overwrite broker’s deeply nested default options, which are not presented in "moleculer.config.js", + * use the `MOL_` prefix and double underscore `__` for nested properties in .env file. + * For example, to set the cacher prefix to `MYCACHE`, you should declare an env var as `MOL_CACHER__OPTIONS__PREFIX=mycache`. + * It will set this: + * { + * cacher: { + * options: { + * prefix: "mycache" + * } + * } + * } + */ +export const defaultBrokerConfig: BrokerOptions = { + // Namespace of nodes to segment your nodes on the same network. + namespace: 'tailchat', + // Unique node identifier. Must be unique in a namespace. + nodeID: undefined, + // Custom metadata store. Store here what you want. Accessing: `this.broker.metadata` + metadata: {}, + + // Enable/disable logging or use custom logger. More info: https://moleculer.services/docs/0.14/logging.html + // Available logger types: "Console", "File", "Pino", "Winston", "Bunyan", "debug", "Log4js", "Datadog" + logger: [ + { + type: 'Console', + options: { + // Using colors on the output + colors: true, + // Print module names with different colors (like docker-compose for containers) + moduleColors: false, + // Line formatter. It can be "json", "short", "simple", "full", a `Function` or a template string like "{timestamp} {level} {nodeID}/{mod}: {msg}" + // formatter: 'full', + formatter(type, args, bindings, { printArgs }) { + return [ + kleur.grey(`[${moment().format('YYYY-MM-DD HH:mm:ss')}]`), + `${this.levelColorStr[type]}`, + ...printArgs(args), + ]; + }, + // Custom object printer. If not defined, it uses the `util.inspect` method. + objectPrinter: null, + // Auto-padding the module name in order to messages begin at the same column. + autoPadding: false, + }, + }, + { + type: 'File', + options: { + level: { + GATEWAY: 'debug', + '**': false, + }, + filename: 'gateway-{nodeID}.log', + }, + }, + { + type: 'File', + options: { + level: { + GATEWAY: false, + '**': 'debug', + }, + filename: '{date}-{nodeID}.log', + }, + }, + ], + // Default log level for built-in console logger. It can be overwritten in logger options above. + // Available values: trace, debug, info, warn, error, fatal + logLevel: 'info', + + // Define transporter. + // More info: https://moleculer.services/docs/0.14/networking.html + // Note: During the development, you don't need to define it because all services will be loaded locally. + // In production you can set it via `TRANSPORTER=nats://localhost:4222` environment variable. + transporter: undefined, // "process.env.TRANSPORTER" + + // Define a cacher. + // More info: https://moleculer.services/docs/0.14/caching.html + cacher: { + type: 'Redis', + options: { + // Prefix for keys + prefix: 'TC', + // Redis settings + redis: config.redisUrl, + }, + }, + + // Define a serializer. + // Available values: "JSON", "Avro", "ProtoBuf", "MsgPack", "Notepack", "Thrift". + // More info: https://moleculer.services/docs/0.14/networking.html#Serialization + serializer: 'JSON', + + // Number of milliseconds to wait before reject a request with a RequestTimeout error. Disabled: 0 + requestTimeout: config.runner.requestTimeout, + + // Retry policy settings. More info: https://moleculer.services/docs/0.14/fault-tolerance.html#Retry + retryPolicy: { + // Enable feature + enabled: false, + // Count of retries + retries: 5, + // First delay in milliseconds. + delay: 100, + // Maximum delay in milliseconds. + maxDelay: 1000, + // Backoff factor for delay. 2 means exponential backoff. + factor: 2, + // A function to check failed requests. + check: ((err: Errors.MoleculerError) => err && !!err.retryable) as any, + }, + + // Limit of calling level. If it reaches the limit, broker will throw an MaxCallLevelError error. (Infinite loop protection) + maxCallLevel: 100, + + // Number of seconds to send heartbeat packet to other nodes. + heartbeatInterval: 10, + // Number of seconds to wait before setting node to unavailable status. + heartbeatTimeout: 30, + + // Cloning the params of context if enabled. High performance impact, use it with caution! + contextParamsCloning: false, + + // Tracking requests and waiting for running requests before shuting down. More info: https://moleculer.services/docs/0.14/context.html#Context-tracking + tracking: { + // Enable feature + enabled: false, + // Number of milliseconds to wait before shuting down the process. + shutdownTimeout: 5000, + }, + + // Disable built-in request & emit balancer. (Transporter must support it, as well.). More info: https://moleculer.services/docs/0.14/networking.html#Disabled-balancer + disableBalancer: false, + + // Settings of Service Registry. More info: https://moleculer.services/docs/0.14/registry.html + registry: { + // Define balancing strategy. More info: https://moleculer.services/docs/0.14/balancing.html + // Available values: "RoundRobin", "Random", "CpuUsage", "Latency", "Shard" + strategy: 'RoundRobin', + // Enable local action call preferring. Always call the local action instance if available. + preferLocal: true, + }, + + // Settings of Circuit Breaker. More info: https://moleculer.services/docs/0.14/fault-tolerance.html#Circuit-Breaker + circuitBreaker: { + // Enable feature + enabled: false, + // Threshold value. 0.5 means that 50% should be failed for tripping. + threshold: 0.5, + // Minimum request count. Below it, CB does not trip. + minRequestCount: 20, + // Number of seconds for time window. + windowTime: 60, + // Number of milliseconds to switch from open to half-open state + halfOpenTime: 10 * 1000, + // A function to check failed requests. + check: ((err: Errors.MoleculerError) => err && err.code >= 500) as any, + }, + + // Settings of bulkhead feature. More info: https://moleculer.services/docs/0.14/fault-tolerance.html#Bulkhead + bulkhead: { + // Enable feature. + enabled: false, + // Maximum concurrent executions. + concurrency: 10, + // Maximum size of queue + maxQueueSize: 100, + }, + + // Enable action & event parameter validation. More info: https://moleculer.services/docs/0.14/validating.html + validator: true, + + errorHandler: undefined, + + // Enable/disable built-in metrics function. More info: https://moleculer.services/docs/0.14/metrics.html + metrics: { + enabled: config.enablePrometheus, + // Available built-in reporters: "Console", "CSV", "Event", "Prometheus", "Datadog", "StatsD" + reporter: [ + { + type: 'Prometheus', + options: { + // HTTP port + port: 13030, + // HTTP URL path + path: '/metrics', + // Default labels which are appended to all metrics labels + defaultLabels: (registry) => ({ + namespace: registry.broker.namespace, + nodeID: registry.broker.nodeID, + }), + }, + }, + ], + }, + + // Enable built-in tracing function. More info: https://moleculer.services/docs/0.14/tracing.html + tracing: { + enabled: true, + // Available built-in exporters: "Console", "Datadog", "Event", "EventLegacy", "Jaeger", "Zipkin" + exporter: { + type: 'Console', // Console exporter is only for development! + options: { + // Custom logger + logger: null, + // Using colors + colors: true, + // Width of row + width: 100, + // Gauge width in the row + gaugeWidth: 40, + }, + }, + }, + + // Register custom middlewares + middlewares: [], + + // Register custom REPL commands. + // Reference: https://moleculer.services/docs/0.14/moleculer-repl.html#Custom-commands + replDelimiter: 'tc $', + replCommands: [ + { + // NOTICE: 这个方法不要在原始上下文中使用,会造成其他用户使用不正常(登录成功后会拦截所有的call函数) + command: 'login', + description: 'Auto login or register tailchat user for cli test', + options: [{ option: '-u, --username', description: 'Username' }], + alias: null, + allowUnknownOptions: null, + parse: null, + action(broker: ServiceBroker, args) { + const username = args.options.username ?? 'localtest'; + const password = 'localtest'; + console.log(`开始尝试登录测试账号 ${username}`); + return broker + .call('user.login', { username, password }) + .catch((err) => { + if (err.name === 'EntityError') { + // 未注册 + console.log('正在注册新的测试账号'); + return broker.call('user.register', { username, password }); + } + + console.error('未知的错误:', err); + }) + .then((user: any) => { + const token = user.token; + const userId = user._id; + const originCall = broker.call.bind(broker); + + console.log('登录成功'); + console.log('> userId:', userId); + console.log('> token:', token); + + (broker.call as any) = function ( + actionName: string, + params: unknown, + opts?: CallingOptions + ): Promise { + return originCall(actionName, params, { + ...opts, + meta: { + ...(opts.meta ?? {}), + user: { + _id: userId, + nickname: user.nickname, + email: user.email, + avatar: user.avatar, + } as UserJWTPayload, + token, + userId, + }, + }); + }; + }); + }, + }, + ], + /* + // Called after broker created. + created : (broker: ServiceBroker): void => {}, + // Called after broker started. + started: async (broker: ServiceBroker): Promise => {}, + stopped: async (broker: ServiceBroker): Promise => {}, + */ +}; diff --git a/server/packages/sdk/src/services/base.ts b/server/packages/sdk/src/services/base.ts new file mode 100644 index 00000000000..a01db2841dc --- /dev/null +++ b/server/packages/sdk/src/services/base.ts @@ -0,0 +1,582 @@ +import { + ActionSchema, + CallingOptions, + Context, + LoggerInstance, + Service, + ServiceBroker, + ServiceDependency, + ServiceEvent, + ServiceHooks, + ServiceSchema, + WaitForServicesResult, +} from 'moleculer'; +import { once } from 'lodash'; +import { TcDbService } from './mixins/db.mixin'; +import type { PanelFeature, PureContext, TcPureContext } from './types'; +import type { TFunction } from 'i18next'; +import { t } from './lib/i18n'; +import type { ValidationRuleObject } from 'fastest-validator'; +import type { BuiltinEventMap } from '../structs/events'; +import { CONFIG_GATEWAY_AFTER_HOOK, SYSTEM_USERID } from '../const'; +import _ from 'lodash'; +import { + decodeNoConflictServiceNameKey, + encodeNoConflictServiceNameKey, +} from '../utils'; + +type ServiceActionHandler = ( + ctx: TcPureContext +) => Promise | T; + +type ShortValidationRule = + | 'any' + | 'array' + | 'boolean' + | 'custom' + | 'date' + | 'email' + | 'enum' + | 'forbidden' + | 'function' + | 'number' + | 'object' + | 'string' + | 'url' + | 'uuid'; + +type ServiceActionSchema = Pick< + ActionSchema, + | 'name' + | 'rest' + | 'visibility' + | 'service' + | 'cache' + | 'tracing' + | 'bulkhead' + | 'circuitBreaker' + | 'retryPolicy' + | 'fallback' + | 'hooks' +> & { + params?: Record< + string, + ValidationRuleObject | ValidationRuleObject[] | ShortValidationRule + >; + disableSocket?: boolean; +}; + +/** + * 生成AfterHook唯一键 + */ +function generateAfterHookKey(actionName: string, serviceName = '') { + if (serviceName) { + return encodeNoConflictServiceNameKey( + `${CONFIG_GATEWAY_AFTER_HOOK}.${serviceName}.${actionName}` + ); + } else { + return encodeNoConflictServiceNameKey( + `${CONFIG_GATEWAY_AFTER_HOOK}.${actionName}` + ); + } +} + +interface TcServiceBroker extends ServiceBroker { + // 事件类型重写 + emit( + eventName: K, + data: K extends keyof BuiltinEventMap ? BuiltinEventMap[K] : unknown, + groups?: string | string[] + ): Promise; + emit(eventName: string): Promise; + broadcast( + eventName: K, + data: K extends keyof BuiltinEventMap ? BuiltinEventMap[K] : unknown, + groups?: string | string[] + ): Promise; + broadcast(eventName: string): Promise; +} + +/** + * TcService 微服务抽象基类 + */ +export interface TcService extends Service { + broker: TcServiceBroker; +} +export abstract class TcService extends Service { + /** + * 服务名, 全局唯一 + */ + abstract get serviceName(): string; + private _mixins: ServiceSchema['mixins'] = []; + private _actions: ServiceSchema['actions'] = {}; + private _methods: ServiceSchema['methods'] = {}; + private _settings: ServiceSchema['settings'] = {}; + private _events: ServiceSchema['events'] = {}; + + /** + * 全局的配置中心 + */ + public globalConfig: Record = {}; + + private _generateAndParseSchema() { + this.parseServiceSchema({ + name: this.serviceName, + mixins: this._mixins, + settings: this._settings, + actions: this._actions, + events: this._events, + started: this.onStart, + stopped: this.onStop, + hooks: this.buildHooks(), + }); + } + + constructor(broker: ServiceBroker) { + super(broker); // Skip 父级的 parseServiceSchema 方法 + + this.onInit(); // 初始化服务 + + this.initBuiltin(); // 初始化内部服务 + + this._generateAndParseSchema(); + + this.logger = this.buildLoggerWithPrefix(this.logger); + + this.onInited(); // 初始化完毕 + } + + protected abstract onInit(): void; + + protected onInited() {} + + protected async onStart() {} + + protected async onStop() {} + + protected initBuiltin() { + this.registerEventListener('config.updated', (payload) => { + this.logger.info('Update global config with:', payload.config); + if (payload.config) { + this.globalConfig = { + ...payload.config, + }; + } + }); + } + + /** + * 构建内部hooks + */ + protected buildHooks(): ServiceHooks { + return { + after: _.mapValues(this._actions, (action, name) => { + return (ctx: PureContext, res: unknown) => { + try { + const afterHooks = + this.globalConfig[generateAfterHookKey(name, this.serviceName)]; + + if (Array.isArray(afterHooks) && afterHooks.length > 0) { + for (const action of afterHooks) { + // 异步调用, 暂时不修改值 + ctx.call(String(action), ctx.params, { + meta: { + ...ctx.meta, + actionResult: res, + }, + }); + } + } + } catch (err) { + this.logger.error('Call action after hooks error:', err); + } + + return res; + }; + }), + }; + } + + /** + * 获取服务操作列表 + */ + getActionList() { + return Object.entries(this._actions).map( + ([name, schema]: [string, ServiceActionSchema]) => { + return { + name, + params: _.mapValues(schema.params, (type) => { + if (typeof type === 'string') { + return { type: type }; + } else { + return type; + } + }), + }; + } + ); + } + + registerMixin(mixin: Partial): void { + this._mixins.push(mixin); + } + + /** + * 注册微服务绑定的数据库 + * 不能调用多次 + */ + registerLocalDb = once((model) => { + this.registerMixin(TcDbService(model)); + }); + + /** + * 注册数据表可见字段列表 + * @param fields 字段列表 + */ + registerDbField(fields: string[]) { + this.registerSetting('fields', fields); + } + + /** + * 注册一个操作 + * + * 该操作会同时生成http请求和socketio事件的处理 + * @param name 操作名, 需微服务内唯一 + * @param handler 处理方法 + * @returns + */ + registerAction( + name: string, + handler: ServiceActionHandler, + schema?: ServiceActionSchema + ) { + if (this._actions[name]) { + console.warn(`重复注册操作: ${name}。操作被跳过...`); + return; + } + + this._actions[name] = { + ...schema, + handler( + this: Service, + ctx: Context + ) { + // 调用时生成t函数 + ctx.meta.t = (key: string, defaultValue?: string | object) => { + if (typeof defaultValue === 'object') { + // 如果是参数对象的话 + return t(key, { + ...defaultValue, + lng: ctx.meta.language, + }); + } + + return t(key, defaultValue, { + lng: ctx.meta.language, + }); + }; + return handler.call(this, ctx); + }, + }; + } + + /** + * 注册一个内部方法 + */ + registerMethod(name: string, method: (...args: any[]) => any) { + if (this._methods[name]) { + console.warn(`重复注册方法: ${name}。操作被跳过...`); + return; + } + + this._methods[name] = method; + } + + /** + * 注册一个配置项 + */ + registerSetting(key: string, value: unknown): void { + if (this._settings[key]) { + console.warn(`重复注册配置: ${key}。之前的设置将被覆盖...`); + } + + this._settings[key] = value; + } + + /** + * 注册一个事件监听器 + */ + registerEventListener( + eventName: K, + handler: ( + payload: K extends keyof BuiltinEventMap ? BuiltinEventMap[K] : unknown, + ctx: TcPureContext + ) => void, + options: Omit = {} + ) { + this._events[eventName] = { + ...options, + handler: (ctx: TcPureContext) => { + handler(ctx.params, ctx); + }, + }; + } + + /** + * 注册跳过token鉴权的路由地址 + * @param urls 鉴权路由 会自动添加 serviceName 前缀 + * @example "/login" + */ + registerAuthWhitelist(urls: string[]) { + this.waitForServices('gateway').then(() => { + this.broker.broadcast( + 'gateway.auth.addWhitelists', + { + urls: urls.map((url) => `/${this.serviceName}${url}`), + }, + 'gateway' + ); + }); + } + + /** + * 注册可用的action请求 + * + * 传入检查函数, 函数的返回值作为结果 + */ + registerAvailableAction(checkFn: () => boolean) { + this.registerAction('available', checkFn); + this.registerAuthWhitelist(['/available']); + } + + /** + * 注册面板功能特性,用于在服务端基础设施开放部分能力 + * @param panelFeature 面板功能 + */ + async setPanelFeature(panelName: string, panelFeatures: PanelFeature[]) { + await this.setGlobalConfig( + `panelFeature.${encodeNoConflictServiceNameKey(panelName)}`, + panelFeatures + ); + } + + /** + * 获取拥有某些特性的面板列表 + * @param panelFeature 面板功能 + */ + getPanelNamesWithFeature(panelFeature: PanelFeature) { + const map = + this.getGlobalConfig>('panelFeature') ?? + {}; + + const matched = Object.entries(map).filter(([name, features]) => { + if (Array.isArray(features)) { + return features.includes(panelFeature); + } + + return false; + }); + + return matched.map((m) => decodeNoConflictServiceNameKey(m[0])); + } + + /** + * 等待微服务启动 + * @param serviceNames + * @param timeout + * @param interval + * @param logger + * @returns + */ + waitForServices( + serviceNames: string | Array | Array, + timeout?: number, + interval?: number, + logger?: LoggerInstance + ): Promise { + if (process.env.NODE_ENV === 'test') { + // 测试环境中跳过 + return Promise.resolve({ + services: [], + statuses: [], + }); + } + + return super.waitForServices(serviceNames, timeout, interval, logger); + } + + getGlobalConfig(key: string): T { + return _.get(this.globalConfig, key); + } + + /** + * 设置全局配置信息 + */ + async setGlobalConfig(key: string, value: any): Promise { + await this.waitForServices('config'); + await this.broker.call('config.set', { + key, + value, + }); + } + + /** + * 注册一个触发了action后的回调 + * @param fullActionName 完整的带servicename的action名 + * @param callbackAction 当前服务的action名,不需要带servicename + */ + async registerAfterActionHook( + fullActionName: string, + callbackAction: string + ) { + await this.waitForServices(['gateway', 'config']); + await this.broker.call('config.addToSet', { + key: encodeNoConflictServiceNameKey( + `${CONFIG_GATEWAY_AFTER_HOOK}.${fullActionName}` + ), + value: `${this.serviceName}.${callbackAction}`, + }); + } + + /** + * 清理action缓存 + * NOTICE: 这里使用Redis作为缓存管理器,因此不需要通知所有的service + */ + async cleanActionCache(actionName: string, keys: string[] = []) { + if (!this.broker.cacher) { + console.error('Can not clean cache because no cacher existed.'); + } + + if (keys.length === 0) { + await this.broker.cacher.clean(`${this.serviceName}.${actionName}`); + } else { + await this.broker.cacher.clean( + `${this.serviceName}.${actionName}:${keys.join('|')}**` + ); + } + } + + /** + * 生成一个有命名空间的通知事件名 + */ + protected generateNotifyEventName(eventName: string) { + return `notify:${this.serviceName}.${eventName}`; + } + + /** + * 本地调用操作,不经过外部转发 + * @param actionName 不需要serverName前缀 + */ + protected localCall( + actionName: string, + params?: {}, + opts?: CallingOptions + ): Promise { + return this.actions[actionName](params, opts); + } + + protected systemCall( + ctx: PureContext, + actionName: string, + params?: {}, + opts?: CallingOptions + ): Promise { + return ctx.call(actionName, params, { + ...opts, + meta: { + userId: SYSTEM_USERID, + ...(opts?.meta ?? {}), + }, + }); + } + + private buildLoggerWithPrefix(_originLogger: LoggerInstance) { + const prefix = `[${this.serviceName}]`; + const originLogger = _originLogger; + return { + info: (...args: any[]) => { + originLogger.info(prefix, ...args); + }, + fatal: (...args: any[]) => { + originLogger.fatal(prefix, ...args); + }, + error: (...args: any[]) => { + originLogger.error(prefix, ...args); + }, + warn: (...args: any[]) => { + originLogger.warn(prefix, ...args); + }, + debug: (...args: any[]) => { + originLogger.debug(prefix, ...args); + }, + trace: (...args: any[]) => { + originLogger.trace(prefix, ...args); + }, + }; + } + + /** + * 单播推送socket事件 + */ + unicastNotify( + ctx: TcPureContext, + userId: string, + eventName: string, + eventData: unknown + ): Promise { + return ctx.call('gateway.notify', { + type: 'unicast', + target: userId, + eventName: this.generateNotifyEventName(eventName), + eventData, + }); + } + + /** + * 列播推送socket事件 + */ + listcastNotify( + ctx: TcPureContext, + userIds: string[], + eventName: string, + eventData: unknown + ) { + return ctx.call('gateway.notify', { + type: 'listcast', + target: userIds, + eventName: this.generateNotifyEventName(eventName), + eventData, + }); + } + + /** + * 组播推送socket事件 + */ + roomcastNotify( + ctx: TcPureContext, + roomId: string, + eventName: string, + eventData: unknown + ): Promise { + return ctx.call('gateway.notify', { + type: 'roomcast', + target: roomId, + eventName: this.generateNotifyEventName(eventName), + eventData, + }); + } + /** + * 群播推送socket事件 + */ + broadcastNotify( + ctx: TcPureContext, + eventName: string, + eventData: unknown + ): Promise { + return ctx.call('gateway.notify', { + type: 'broadcast', + eventName: this.generateNotifyEventName(eventName), + eventData, + }); + } +} diff --git a/server/packages/sdk/src/services/broker.ts b/server/packages/sdk/src/services/broker.ts new file mode 100644 index 00000000000..71819a65dd9 --- /dev/null +++ b/server/packages/sdk/src/services/broker.ts @@ -0,0 +1,8 @@ +import Moleculer from 'moleculer'; + +/** + * 用于不暴露moleculer让外部手动启动一个broker + * + * 如tailchat-cli + */ +export class TcBroker extends Moleculer.ServiceBroker {} diff --git a/server/packages/sdk/src/services/lib/call.ts b/server/packages/sdk/src/services/lib/call.ts new file mode 100644 index 00000000000..bd7884035fc --- /dev/null +++ b/server/packages/sdk/src/services/lib/call.ts @@ -0,0 +1,171 @@ +import { + GroupStruct, + UserStruct, + SYSTEM_USERID, + PERMISSION, + TcPureContext, +} from '../../index'; +import type { ChatConverseStruct } from '../../structs/chat'; + +export function call(ctx: TcPureContext) { + return { + /** + * 加入socketio房间 + */ + async joinSocketIORoom(roomIds: string[], userId?: string) { + await ctx.call('gateway.joinRoom', { + roomIds, + userId, + }); + }, + /** + * 离开socketio房间 + */ + async leaveSocketIORoom(roomIds: string[], userId?: string) { + await ctx.call('gateway.leaveRoom', { + roomIds, + userId, + }); + }, + + /** + * 检查用户是否在线 + */ + async isUserOnline(userIds: string[]): Promise { + return await ctx.call('gateway.checkUserOnline', { userIds }); + }, + /** + * 发送系统消息 + * 如果为群组消息则需要增加groupId + */ + async sendSystemMessage( + message: string, + converseId: string, + groupId?: string + ) { + await ctx.call( + 'chat.message.sendMessage', + { + converseId, + groupId, + content: message, + }, + { + meta: { + ...ctx.meta, + userId: SYSTEM_USERID, + }, + } + ); + }, + /** + * 获取群组大厅会话的id + */ + async getGroupLobbyConverseId(groupId: string): Promise { + const lobbyConverseId: string = await ctx.call( + 'group.getGroupLobbyConverseId', + { + groupId, + } + ); + + return lobbyConverseId; + }, + /** + * 添加群组系统信息 + */ + async addGroupSystemMessage(groupId: string, message: string) { + const lobbyConverseId = await call(ctx).getGroupLobbyConverseId(groupId); + + if (!lobbyConverseId) { + // 如果没有文本频道则跳过 + return; + } + + await ctx.call( + 'chat.message.sendMessage', + { + converseId: lobbyConverseId, + groupId: groupId, + content: message, + }, + { + meta: { + ...ctx.meta, + userId: SYSTEM_USERID, + }, + } + ); + }, + + /** + * 获取用户信息 + */ + async getUserInfo(userId: string): Promise { + return await ctx.call('user.getUserInfo', { + userId: String(userId), + }); + }, + /** + * 获取会话信息 + */ + async getConverseInfo( + converseId: string + ): Promise { + return await ctx.call('chat.converse.findConverseInfo', { + converseId, + }); + }, + /** + * 获取群组信息 + */ + async getGroupInfo(groupId: string): Promise { + return await ctx.call('group.getGroupInfo', { + groupId, + }); + }, + /** + * 检查群组成员权限 + */ + async checkUserPermissions( + groupId: string, + userId: string, + permissions: string[] + ): Promise { + const userAllPermissions: string[] = await ctx.call( + 'group.getUserAllPermissions', + { + groupId, + userId, + } + ); + + const hasOwnerPermission = userAllPermissions.includes( + PERMISSION.core.owner + ); + + return permissions.map((p) => + hasOwnerPermission + ? true // 如果有管理员权限。直接返回true + : (userAllPermissions ?? []).includes(p) + ); + }, + /** + * 添加到收件箱 + * @param type 如果是插件则命名规范为包名加信息名,如: plugin:com.msgbyte.topic + * @param payload 内容体,相关的逻辑由前端处理 + * @param userId 如果是添加到当前用户则userId可以不填 + */ + async appendInbox( + type: string, + payload: any, + userId?: string + ): Promise { + return await ctx.call('chat.inbox.append', { + userId, + type, + payload, + }); + }, + }; +} diff --git a/server/packages/sdk/src/services/lib/errors.ts b/server/packages/sdk/src/services/lib/errors.ts new file mode 100644 index 00000000000..8e4b93408fb --- /dev/null +++ b/server/packages/sdk/src/services/lib/errors.ts @@ -0,0 +1,62 @@ +import ExtendableError from 'es6-error'; + +class TcError extends ExtendableError { + public code: number; + public type: string; + public data: any; + public retryable: boolean; + + constructor(message?: string, code?: number, type?: string, data?: unknown) { + super(message ?? 'Service Unavailable'); + this.code = code ?? this.code ?? 500; + this.type = type ?? this.type; + this.data = data ?? this.data; + this.retryable = this.retryable ?? false; + } +} + +export class DataNotFoundError extends TcError { + constructor(message?: string, code?: number, type?: string, data?: unknown) { + super(message ?? 'Not found Data', code ?? 404, type, data); + } +} + +export class EntityError extends TcError { + constructor( + message?: string, + code?: number, + type?: string, + data?: { field: string; message: string }[] + ) { + super(message ?? 'Form error', code ?? 442, type, data); + } +} + +export class NoPermissionError extends TcError { + constructor(message?: string, code?: number, type?: string, data?: unknown) { + super(message ?? 'No operate permission', code ?? 403, type, data); + } +} + +export class BannedError extends TcError { + constructor(message?: string, code?: number, type?: string, data?: unknown) { + super( + message ?? 'You has been banned', + code ?? 403, + type ?? 'banned', + data + ); + } +} + +export class ServiceUnavailableError extends TcError { + constructor(data?: unknown) { + super('Service unavailable', 503, 'SERVICE_NOT_AVAILABLE', data); + } +} + +export class NotFoundError extends TcError { + constructor(data?: unknown) { + super('Not found', 404, 'NOT_FOUND', data); + } +} diff --git a/server/packages/sdk/src/services/lib/i18n/__tests__/index.spec.ts b/server/packages/sdk/src/services/lib/i18n/__tests__/index.spec.ts new file mode 100644 index 00000000000..33831f6c1c1 --- /dev/null +++ b/server/packages/sdk/src/services/lib/i18n/__tests__/index.spec.ts @@ -0,0 +1,24 @@ +import { t } from '../index'; +/** + * 休眠一定时间 + */ +function sleep(ms: number): Promise { + return new Promise((resolve) => + setTimeout(() => { + resolve(); + }, ms) + ); +} + +describe('i18n', () => { + test('should be work', async () => { + await sleep(2000); // 等待异步加载完毕 + + expect(t('Token不合规')).toBe('Token不合规'); + expect( + t('Token不合规', undefined, { + lng: 'en-US', + }) + ).toBe('Token Invalid'); + }); +}); diff --git a/server/packages/sdk/src/services/lib/i18n/__tests__/parser.spec.ts b/server/packages/sdk/src/services/lib/i18n/__tests__/parser.spec.ts new file mode 100644 index 00000000000..6b938c685aa --- /dev/null +++ b/server/packages/sdk/src/services/lib/i18n/__tests__/parser.spec.ts @@ -0,0 +1,23 @@ +import { parseLanguageFromHead } from '../parser'; + +describe('parseLanguageFromHead', () => { + test.each([ + // zh + ['zh-CN,zh;q=0.9', 'zh-CN'], + ['zh-TW,zh;q=0.9', 'zh-CN'], + ['zh;q=0.9', 'zh-CN'], + ['zh', 'zh-CN'], + + // en + ['en-US,en;q=0.8,sv', 'en-US'], + ['en-GB,en;q=0.8,sv', 'en-US'], + ['en;q=0.8,sv', 'en-US'], + ['en', 'en-US'], + + // other + ['de-CH;q=0.8,sv', 'en-US'], + ['jp', 'en-US'], + ])('%s', (input, output) => { + expect(parseLanguageFromHead(input)).toBe(output); + }); +}); diff --git a/server/packages/sdk/src/services/lib/i18n/index.ts b/server/packages/sdk/src/services/lib/i18n/index.ts new file mode 100644 index 00000000000..236840ce76e --- /dev/null +++ b/server/packages/sdk/src/services/lib/i18n/index.ts @@ -0,0 +1,41 @@ +import i18next, { TFunction, TOptionsBase } from 'i18next'; +import Backend from 'i18next-fs-backend'; +import path from 'path'; +import { crc32 } from 'crc'; + +i18next.use(Backend).init({ + // initImmediate: false, + lng: 'en-US', + fallbackLng: 'en-US', + preload: ['zh-CN', 'en-US'], + ns: ['translation'], + defaultNS: 'translation', + backend: { + /** + * 加载启动目录下的 + */ + loadPath: path.resolve(process.cwd(), './locales/{{lng}}/{{ns}}.json'), + }, +}); + +/** + * 国际化翻译 + */ +export const t: TFunction = ( + key: string, + defaultValue?: string, + options?: TOptionsBase +) => { + try { + const hashKey = `k${crc32(key).toString(16)}`; + let words = i18next.t(hashKey, defaultValue, options); + if (words === hashKey) { + words = key; + console.info(`[i18n] 翻译缺失: [${hashKey}]${key}`); + } + return words; + } catch (err) { + console.error(err); + return key; + } +}; diff --git a/server/packages/sdk/src/services/lib/i18n/parser.ts b/server/packages/sdk/src/services/lib/i18n/parser.ts new file mode 100644 index 00000000000..bd832d66273 --- /dev/null +++ b/server/packages/sdk/src/services/lib/i18n/parser.ts @@ -0,0 +1,23 @@ +import acceptLanguage from 'accept-language'; + +type AllowedLanguage = 'en-US' | 'zh-CN'; +acceptLanguage.languages(['en', 'en-US', 'zh-CN', 'zh', 'zh-TW']); + +/** + * 解析请求头的 Accept-Language + */ +export function parseLanguageFromHead( + headerLanguage = 'en-US' +): AllowedLanguage { + const language = acceptLanguage.get(headerLanguage); + + if (language === 'zh' || language === 'zh-TW') { + return 'zh-CN'; + } + + if (language === 'en' || language === 'en-US') { + return 'en-US'; + } + + return language as AllowedLanguage; +} diff --git a/server/packages/sdk/src/services/lib/moleculer-db-adapter-mongoose/README.md b/server/packages/sdk/src/services/lib/moleculer-db-adapter-mongoose/README.md new file mode 100644 index 00000000000..e79a7fe9dde --- /dev/null +++ b/server/packages/sdk/src/services/lib/moleculer-db-adapter-mongoose/README.md @@ -0,0 +1 @@ +fork from `moleculer-db-adapter-mongoose` diff --git a/server/packages/sdk/src/services/lib/moleculer-db-adapter-mongoose/index.ts b/server/packages/sdk/src/services/lib/moleculer-db-adapter-mongoose/index.ts new file mode 100644 index 00000000000..1d25366ea6d --- /dev/null +++ b/server/packages/sdk/src/services/lib/moleculer-db-adapter-mongoose/index.ts @@ -0,0 +1,450 @@ +/* + * moleculer-db-adapter-mongoose + * Copyright (c) 2019 MoleculerJS (https://github.com/moleculerjs/moleculer-db) + * MIT Licensed + */ + +'use strict'; + +import _ from 'lodash'; +import { Errors, Service, ServiceBroker } from 'moleculer'; +import type { DbAdapter } from 'moleculer-db'; +import type { Db } from 'mongodb'; +import mongoose, { + ConnectOptions, + Model, + Schema, + Document, + Connection, +} from 'mongoose'; +const ServiceSchemaError = Errors.ServiceSchemaError; + +export class MongooseDbAdapter + implements DbAdapter +{ + uri: string; + opts?: ConnectOptions; + broker: ServiceBroker; + service: Service; + model: Model; + schema?: Schema; + modelName?: string; + db: Db; + conn: Connection; + + /** + * Creates an instance of MongooseDbAdapter. + * @param {String} uri + * @param {Object?} opts + * + * @memberof MongooseDbAdapter + */ + constructor(uri: string, opts) { + (this.uri = uri), (this.opts = opts); + mongoose.Promise = Promise; + } + + /** + * Initialize adapter + * + * @param {ServiceBroker} broker + * @param {Service} service + * + * @memberof MongooseDbAdapter + */ + init(broker, service) { + this.broker = broker; + this.service = service; + + if (this.service.schema.model) { + this.model = this.service.schema.model; + } else if (this.service.schema.schema) { + if (!this.service.schema.modelName) { + throw new ServiceSchemaError( + '`modelName` is required when `schema` is given in schema of service!', + {} + ); + } + this.schema = this.service.schema.schema; + this.modelName = this.service.schema.modelName; + } + + if (!this.model && !this.schema) { + /* istanbul ignore next */ + throw new ServiceSchemaError( + 'Missing `model` or `schema` definition in schema of service!', + {} + ); + } + } + + /** + * Connect to database + * + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + connect() { + let conn: Promise; + + if (this.model) { + /* istanbul ignore next */ + if (mongoose.connection.readyState == 1) { + this.conn = mongoose.connection; + this.db = this.conn.db; + return Promise.resolve(); + } else if (mongoose.connection.readyState == 2) { + conn = mongoose.connection.asPromise(); + } else { + conn = mongoose.connect(this.uri, this.opts).then((m) => m.connection); + } + } else if (this.schema) { + conn = mongoose + .createConnection(this.uri, this.opts) + .asPromise() + .then((conn) => { + this.model = conn.model(this.modelName, this.schema); + return conn; + }); + } + + return conn.then((_conn: Connection) => { + this.conn = _conn; + this.db = _conn.db; + + this.service.logger.info('MongoDB adapter has connected successfully.'); + + /* istanbul ignore next */ + this.conn.on('disconnected', () => + this.service.logger.warn('Mongoose adapter has disconnected.') + ); + this.conn.on('error', (err) => + this.service.logger.error('MongoDB error.', err) + ); + this.conn.on('reconnect', () => + this.service.logger.info('Mongoose adapter has reconnected.') + ); + }); + } + + /** + * Disconnect from database + * + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + disconnect() { + return new Promise((resolve) => { + if (this.conn && this.conn.close) { + this.conn.close(() => { + resolve(); + }); + } else { + mongoose.connection.close(() => { + resolve(); + }); + } + }); + } + + /** + * Find all entities by filters. + * + * Available filter props: + * - limit + * - offset + * - sort + * - search + * - searchFields + * - query + * + * @param {any} filters + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + find(filters) { + return this.createCursor(filters).exec(); + } + + /** + * Find an entity by query + * + * @param {Object} query + * @returns {Promise} + * @memberof MemoryDbAdapter + */ + findOne(query) { + return this.model.findOne(query).exec(); + } + + /** + * Find an entities by ID + * + * @param {any} _id + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + findById(_id) { + return this.model.findById(_id).exec(); + } + + /** + * Find any entities by IDs + * + * @param {Array} idList + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + findByIds(idList) { + return this.model + .find({ + _id: { + $in: idList, + }, + }) + .exec(); + } + + /** + * Get count of filtered entites + * + * Available filter props: + * - search + * - searchFields + * - query + * + * @param {Object} [filters={}] + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + count(filters = {}) { + return this.createCursor(filters).countDocuments().exec(); + } + + /** + * Insert an entity + * + * @param {Object} entity + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + insert(entity): any { + const item = new this.model(entity); + return item.save(); + } + + /** + * Insert many entities + * + * @param {Array} entities + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + insertMany(entities): any { + return this.model.create(entities); + } + + /** + * Update many entities by `query` and `update` + * + * @param {Object} query + * @param {Object} update + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + updateMany(query, update) { + return this.model + .updateMany(query, update, { multi: true, new: true }) + .then((res) => res.matchedCount); + } + + /** + * Update an entity by ID and `update` + * + * @param {any} _id + * @param {Object} update + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + updateById(_id, update): any { + return this.model.findByIdAndUpdate(_id, update, { new: true }); + } + + /** + * Remove entities which are matched by `query` + * + * @param {Object} query + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + removeMany(query) { + return this.model.deleteMany(query).then((res) => res.deletedCount); + } + + /** + * Remove an entity by ID + * + * @param {any} _id + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + removeById(_id): any { + return this.model.findByIdAndRemove(_id); + } + + /** + * Clear all entities from collection + * + * @returns {Promise} + * + * @memberof MongooseDbAdapter + */ + clear(): any { + return this.model.deleteMany({}).then((res) => res.deletedCount); + } + + /** + * Convert DB entity to JSON object + * + * @param {any} entity + * @returns {Object} + * @memberof MongooseDbAdapter + */ + entityToObject(entity) { + const json = entity.toJSON(); + if (entity._id && entity._id.toHexString) { + json._id = entity._id.toHexString(); + } else if (entity._id && entity._id.toString) { + json._id = entity._id.toString(); + } + return json; + } + + /** + * Create a filtered query + * Available filters in `params`: + * - search + * - sort + * - limit + * - offset + * - query + * + * @param {Object} params + * @returns {MongoQuery} + */ + createCursor(params) { + if (params) { + const q = this.model.find(params.query); + + // Search + if (_.isString(params.search) && params.search !== '') { + if (params.searchFields && params.searchFields.length > 0) { + q.find({ + $or: params.searchFields.map((f) => ({ + [f]: new RegExp(params.search, 'i'), + })), + }); + } else { + // Full-text search + // More info: https://docs.mongodb.com/manual/reference/operator/query/text/ + (q as any).find({ + $text: { + $search: String(params.search), + }, + }); + (q as any)._fields = { + _score: { + $meta: 'textScore', + }, + }; + q.sort({ + _score: { + $meta: 'textScore', + }, + }); + } + } + + // Sort + if (_.isString(params.sort)) q.sort(params.sort.replace(/,/, ' ')); + else if (Array.isArray(params.sort)) q.sort(params.sort.join(' ')); + + // Offset + if (_.isNumber(params.offset) && params.offset > 0) q.skip(params.offset); + + // Limit + if (_.isNumber(params.limit) && params.limit > 0) q.limit(params.limit); + + return q; + } + return this.model.find(); + } + + /** + * Transforms 'idField' into MongoDB's '_id' + * @param {Object} entity + * @param {String} idField + * @memberof MongoDbAdapter + * @returns {Object} Modified entity + */ + beforeSaveTransformID(entity, idField) { + const newEntity = _.cloneDeep(entity); + + if (idField !== '_id' && entity[idField] !== undefined) { + newEntity._id = this.stringToObjectID(newEntity[idField]); + delete newEntity[idField]; + } + + return newEntity; + } + + /** + * Transforms MongoDB's '_id' into user defined 'idField' + * @param {Object} entity + * @param {String} idField + * @memberof MongoDbAdapter + * @returns {Object} Modified entity + */ + afterRetrieveTransformID(entity, idField) { + if (idField !== '_id') { + entity[idField] = this.objectIDToString(entity['_id']); + delete entity._id; + } + return entity; + } + + /** + * Convert hex string to ObjectID + * @param {String} id + * @returns ObjectID} + * @memberof MongooseDbAdapter + */ + stringToObjectID(id) { + if (typeof id == 'string' && mongoose.Types.ObjectId.isValid(id)) + return new mongoose.Schema.Types.ObjectId(id); + return id; + } + + /** + * Convert ObjectID to hex string + * @param {ObjectID} id + * @returns {String} + * @memberof MongooseDbAdapter + */ + objectIDToString(id) { + if (id && id.toString) return id.toString(); + return id; + } +} diff --git a/server/packages/sdk/src/services/lib/moleculer-web/README.md b/server/packages/sdk/src/services/lib/moleculer-web/README.md new file mode 100644 index 00000000000..fd14d78e771 --- /dev/null +++ b/server/packages/sdk/src/services/lib/moleculer-web/README.md @@ -0,0 +1,3 @@ +Fork from https://github.com/moleculerjs/moleculer-web + +Hash: f375dbb4f8bff8aa16e95024e5c65463b626fa45 diff --git a/server/packages/sdk/src/services/lib/moleculer-web/alias.ts b/server/packages/sdk/src/services/lib/moleculer-web/alias.ts new file mode 100644 index 00000000000..700bd9f28ed --- /dev/null +++ b/server/packages/sdk/src/services/lib/moleculer-web/alias.ts @@ -0,0 +1,312 @@ +/* + * moleculer + * Copyright (c) 2021 MoleculerJS (https://github.com/moleculerjs/moleculer) + * MIT Licensed + */ + +import { pathToRegexp } from 'path-to-regexp'; +import Busboy from '@fastify/busboy'; +import kleur from 'kleur'; +import _ from 'lodash'; + +import { PayloadTooLarge } from './errors'; +import { Errors } from 'moleculer'; +const { MoleculerClientError } = Errors; +import { + removeTrailingSlashes, + addSlashes, + decodeParam, + compose, +} from './utils'; + +export class Alias { + service; + route; + type = 'call'; + method = '*'; + path = null; + handler = null; + action = null; + fullPath; + keys; + re; + busboyConfig; + + /** + * Constructor of Alias + * + * @param {Service} service + * @param {Object} route + * @param {Object} opts + * @param {any} action + */ + constructor(service, route, opts, action) { + this.service = service; + this.route = route; + + if (_.isString(opts)) { + // Parse alias string + if (opts.indexOf(' ') !== -1) { + const p = opts.split(/\s+/); + this.method = p[0]; + this.path = p[1]; + } else { + this.path = opts; + } + } else if (_.isObject(opts)) { + Object.assign(this, _.cloneDeep(opts)); + } + + if (_.isString(action)) { + // Parse type from action name + if (action.indexOf(':') > 0) { + const p = action.split(':'); + this.type = p[0]; + this.action = p[1]; + } else { + this.action = action; + } + } else if (_.isFunction(action)) { + this.handler = action; + this.action = null; + } else if (Array.isArray(action)) { + const mws = _.compact( + action.map((mw) => { + if (_.isString(mw)) this.action = mw; + else if (_.isFunction(mw)) return mw; + }) + ); + this.handler = compose.call(service, ...mws); + } else if (action != null) { + Object.assign(this, _.cloneDeep(action)); + } + + this.type = this.type || 'call'; + + this.path = removeTrailingSlashes(this.path); + + this.fullPath = this.fullPath || addSlashes(this.route.path) + this.path; + if (this.fullPath !== '/' && this.fullPath.endsWith('/')) { + this.fullPath = this.fullPath.slice(0, -1); + } + + this.keys = []; + this.re = pathToRegexp( + this.fullPath, + this.keys, + route.opts.pathToRegexpOptions || {} + ); // Options: https://github.com/pillarjs/path-to-regexp#usage + + if (this.type == 'multipart') { + // Handle file upload in multipart form + this.handler = this.multipartHandler.bind(this); + } + } + + /** + * + * @param {*} url + */ + match(url) { + const m = this.re.exec(url); + if (!m) return false; + + const params = {}; + + let key, param; + for (let i = 0; i < this.keys.length; i++) { + key = this.keys[i]; + param = m[i + 1]; + if (!param) continue; + + params[key.name] = decodeParam(param); + + if (key.repeat) params[key.name] = params[key.name].split(key.delimiter); + } + + return params; + } + + /** + * + * @param {*} method + */ + isMethod(method) { + return this.method === '*' || this.method === method; + } + + /** + * + */ + printPath() { + /* istanbul ignore next */ + return `${this.method} ${this.fullPath}`; + } + + /** + * + */ + toString() { + return ( + kleur.magenta(_.padStart(this.method, 6)) + + ' ' + + kleur.cyan(this.fullPath) + + kleur.grey(' => ') + + (this.handler != null && this.type !== 'multipart' + ? '' + : this.action) + ); + } + + /** + * + * @param {*} req + * @param {*} res + */ + multipartHandler(req, res) { + const ctx = req.$ctx; + ctx.meta.$multipart = {}; + const promises = []; + + let numOfFiles = 0; + let hasField = false; + + const busboyOptions = _.defaultsDeep( + { headers: req.headers }, + this.busboyConfig, + this.route.opts.busboyConfig + ); + const busboy = new Busboy(busboyOptions); + busboy.on('file', (fieldname, file, filename, encoding, mimetype) => { + file.on('limit', () => { + // This file reached the file size limit. + if (_.isFunction(busboyOptions.onFileSizeLimit)) { + busboyOptions.onFileSizeLimit.call(this.service, file, busboy); + } + file.destroy( + new PayloadTooLarge({ fieldname, filename, encoding, mimetype }) + ); + }); + numOfFiles++; + promises.push( + ctx + .call( + this.action, + file, + _.defaultsDeep({}, this.route.opts.callOptions, { + meta: { + fieldname: fieldname, + filename: filename, + encoding: encoding, + mimetype: mimetype, + $params: req.$params, + }, + }) + ) + .catch((err) => { + file.resume(); // Drain file stream to continue processing form + busboy.emit('error', err); + return err; + }) + ); + }); + busboy.on('field', (field, value) => { + hasField = true; + ctx.meta.$multipart[field] = value; + }); + + busboy.on('finish', async () => { + /* istanbul ignore next */ + if (!busboyOptions.empty && numOfFiles == 0) + return this.service.sendError( + req, + res, + new MoleculerClientError('File missing in the request') + ); + + // Call the action if no files but multipart fields + if (numOfFiles == 0 && hasField) { + promises.push( + ctx.call( + this.action, + {}, + _.defaultsDeep({}, this.route.opts.callOptions, { + meta: { + $params: req.$params, + }, + }) + ) + ); + } + + try { + let data = await this.service.Promise.all(promises); + const fileLimit = + busboyOptions.limits && busboyOptions.limits.files != null + ? busboyOptions.limits.files + : null; + if (numOfFiles == 1 && fileLimit == 1) { + // Remove the array wrapping + data = data[0]; + } + if (this.route.onAfterCall) + data = await this.route.onAfterCall.call( + this, + ctx, + this.route, + req, + res, + data + ); + + this.service.sendResponse(req, res, data, {}); + } catch (err) { + /* istanbul ignore next */ + this.service.sendError(req, res, err); + } + }); + + /* istanbul ignore next */ + busboy.on('error', (err) => { + req.unpipe(req.busboy); + req.resume(); + this.service.sendError(req, res, err); + }); + + // Add limit event handlers + if (_.isFunction(busboyOptions.onPartsLimit)) { + busboy.on('partsLimit', () => + busboyOptions.onPartsLimit.call( + this.service, + busboy, + this, + this.service + ) + ); + } + + if (_.isFunction(busboyOptions.onFilesLimit)) { + busboy.on('filesLimit', () => + busboyOptions.onFilesLimit.call( + this.service, + busboy, + this, + this.service + ) + ); + } + + if (_.isFunction(busboyOptions.onFieldsLimit)) { + busboy.on('fieldsLimit', () => + busboyOptions.onFieldsLimit.call( + this.service, + busboy, + this, + this.service + ) + ); + } + + req.pipe(busboy); + } +} diff --git a/server/packages/sdk/src/services/lib/moleculer-web/errors.ts b/server/packages/sdk/src/services/lib/moleculer-web/errors.ts new file mode 100644 index 00000000000..4470c154f43 --- /dev/null +++ b/server/packages/sdk/src/services/lib/moleculer-web/errors.ts @@ -0,0 +1,218 @@ +/* + * moleculer + * Copyright (c) 2021 MoleculerJS (https://github.com/moleculerjs/moleculer) + * MIT Licensed + */ + +import { Errors } from 'moleculer'; + +const { MoleculerError, MoleculerClientError } = Errors; + +export { MoleculerError, MoleculerClientError }; + +const ERR_NO_TOKEN = 'NO_TOKEN'; +const ERR_INVALID_TOKEN = 'INVALID_TOKEN'; +const ERR_UNABLE_DECODE_PARAM = 'UNABLE_DECODE_PARAM'; +const ERR_ORIGIN_NOT_FOUND = 'ORIGIN_NOT_FOUND'; +const ERR_ORIGIN_NOT_ALLOWED = 'ORIGIN_NOT_ALLOWED'; + +/** + * Invalid request body + * + * @class InvalidRequestBodyError + * @extends {Error} + */ +class InvalidRequestBodyError extends MoleculerError { + /** + * Creates an instance of InvalidRequestBodyError. + * + * @param {any} body + * @param {any} error + * + * @memberOf InvalidRequestBodyError + */ + constructor(body, error) { + super('Invalid request body', 400, 'INVALID_REQUEST_BODY', { + body, + error, + }); + } +} + +/** + * Invalid response type + * + * @class InvalidResponseTypeError + * @extends {Error} + */ +class InvalidResponseTypeError extends MoleculerError { + /** + * Creates an instance of InvalidResponseTypeError. + * + * @param {String} dataType + * + * @memberOf InvalidResponseTypeError + */ + constructor(dataType) { + super(`Invalid response type '${dataType}'`, 500, 'INVALID_RESPONSE_TYPE', { + dataType, + }); + } +} + +/** + * Unauthorized HTTP error + * + * @class UnAuthorizedError + * @extends {Error} + */ +class UnAuthorizedError extends MoleculerError { + /** + * Creates an instance of UnAuthorizedError. + * + * @param {String} type + * @param {any} data + * + * @memberOf UnAuthorizedError + */ + constructor(type, data) { + super('Unauthorized', 401, type || ERR_INVALID_TOKEN, data); + } +} + +/** + * Forbidden HTTP error + * + * @class ForbiddenError + * @extends {Error} + */ +class ForbiddenError extends MoleculerError { + /** + * Creates an instance of ForbiddenError. + * + * @param {String} type + * @param {any} data + * + * @memberOf ForbiddenError + */ + constructor(type, data?) { + super('Forbidden', 403, type, data); + } +} + +/** + * Bad request HTTP error + * + * @class BadRequestError + * @extends {Error} + */ +class BadRequestError extends MoleculerError { + /** + * Creates an instance of BadRequestError. + * + * @param {String} type + * @param {any} data + * + * @memberOf BadRequestError + */ + constructor(type, data) { + super('Bad request', 400, type, data); + } +} + +/** + * Not found HTTP error + * + * @class NotFoundError + * @extends {Error} + */ +class NotFoundError extends MoleculerError { + /** + * Creates an instance of NotFoundError. + * + * @param {String} type + * @param {any} data + * + * @memberOf NotFoundError + */ + constructor(type?, data?) { + super('Not found', 404, type || 'NOT_FOUND', data); + } +} + +/** + * Payload is too large HTTP error + * + * @class PayloadTooLarge + * @extends {Error} + */ +class PayloadTooLarge extends MoleculerClientError { + /** + * Creates an instance of PayloadTooLarge. + * + * @param {String} type + * @param {any} data + * + * @memberOf PayloadTooLarge + */ + constructor(data) { + super('Payload too large', 413, 'PAYLOAD_TOO_LARGE', data); + } +} + +/** + * Rate limit exceeded HTTP error + * + * @class RateLimitExceeded + * @extends {Error} + */ +class RateLimitExceeded extends MoleculerClientError { + /** + * Creates an instance of RateLimitExceeded. + * + * @param {String} type + * @param {any} data + * + * @memberOf RateLimitExceeded + */ + constructor(type?, data?) { + super('Rate limit exceeded', 429, type, data); + } +} + +/** + * Service unavailable HTTP error + * + * @class ForbiddenError + * @extends {Error} + */ +class ServiceUnavailableError extends MoleculerError { + /** + * Creates an instance of ForbiddenError. + * + * @param {String} type + * @param {any} data + * + * @memberOf ForbiddenError + */ + constructor(type?, data?) { + super('Service unavailable', 503, type, data); + } +} + +export { + InvalidRequestBodyError, + InvalidResponseTypeError, + UnAuthorizedError, + ForbiddenError, + BadRequestError, + NotFoundError, + PayloadTooLarge, + RateLimitExceeded, + ServiceUnavailableError, + ERR_NO_TOKEN, + ERR_INVALID_TOKEN, + ERR_UNABLE_DECODE_PARAM, + ERR_ORIGIN_NOT_FOUND, + ERR_ORIGIN_NOT_ALLOWED, +}; diff --git a/server/packages/sdk/src/services/lib/moleculer-web/index.ts b/server/packages/sdk/src/services/lib/moleculer-web/index.ts new file mode 100644 index 00000000000..d05bf83cb8b --- /dev/null +++ b/server/packages/sdk/src/services/lib/moleculer-web/index.ts @@ -0,0 +1,1934 @@ +/* + * moleculer + * Copyright (c) 2021 MoleculerJS (https://github.com/moleculerjs/moleculer) + * MIT Licensed + */ + +import http from 'http'; +import http2 from 'http2'; +import https from 'https'; +import queryString from 'qs'; +import os from 'os'; +import kleur from 'kleur'; + +import _ from 'lodash'; +import bodyParser from 'body-parser'; +import serveStatic from 'serve-static'; +import { isReadable as isReadableStream } from 'isstream'; + +import { Errors, ServiceSchema, Utils } from 'moleculer'; +const { MoleculerError, MoleculerServerError, ServiceNotFoundError } = Errors; +const match = Utils.match; +import { + ServiceUnavailableError, + NotFoundError, + ForbiddenError, + RateLimitExceeded, + ERR_ORIGIN_NOT_ALLOWED, +} from './errors'; + +import { Alias } from './alias'; +import { MemoryStore } from './memory-store'; + +import { + removeTrailingSlashes, + addSlashes, + normalizePath, + composeThen, + generateETag, + isFresh, +} from './utils'; + +const MAPPING_POLICY_ALL = 'all'; +const MAPPING_POLICY_RESTRICT = 'restrict'; + +const pkg = { + name: 'moleculer-web', + version: '0.10.5', + repository: { + type: 'git', + url: 'https://github.com/moleculerjs/moleculer-web.git', + }, +}; + +function getServiceFullname(svc) { + if (svc.version != null && svc.settings.$noVersionPrefix !== true) + return ( + (typeof svc.version == 'number' ? 'v' + svc.version : svc.version) + + '.' + + svc.name + ); + + return svc.name; +} + +const SLASH_REGEX = new RegExp(/\./g); + +/** + * Official API Gateway service for Moleculer microservices framework. + * + * @service + */ +export const ApiGatewayMixin: ServiceSchema = { + // Default service name + name: 'api', + + // Default settings + settings: { + // Exposed port + port: process.env.PORT || 3000, + + // Exposed IP + ip: process.env.IP || '0.0.0.0', + + // Used server instance. If null, it will create a new HTTP(s)(2) server + // If false, it will start without server in middleware mode + server: true, + + // Routes + routes: [], + + // Log each request (default to "info" level) + logRequest: 'info', + + // Log the request ctx.params (default to "debug" level) + logRequestParams: 'debug', + + // Log each response (default to "info" level) + logResponse: 'info', + + // Log the response data (default to disable) + logResponseData: null, + + // If set to true, it will log 4xx client errors, as well + log4XXResponses: false, + + // Log the route registration/aliases related activity + logRouteRegistration: 'info', + + // Use HTTP2 server (experimental) + http2: false, + + // HTTP Server Timeout + httpServerTimeout: null, + + // Request Timeout. More info: https://github.com/moleculerjs/moleculer-web/issues/206 + requestTimeout: 300000, // Sets node.js v18 default timeout: https://nodejs.org/api/http.html#serverrequesttimeout + + // Optimize route order + optimizeOrder: true, + + // CallOption for the root action `api.rest` + rootCallOptions: null, + + // Debounce wait time before call to regenerate aliases when received event "$services.changed" + debounceTime: 500, + }, + + // Service's metadata + metadata: { + $category: 'gateway', + $description: 'Official API Gateway service', + $official: true, + $package: { + name: pkg.name, + version: pkg.version, + repo: pkg.repository ? pkg.repository.url : null, + }, + }, + + actions: { + /** + * REST request handler + */ + rest: { + visibility: 'private', + tracing: { + tags: { + params: ['req.url', 'req.method'], + }, + spanName: (ctx) => `${ctx.params.req.method} ${ctx.params.req.url}`, + } as any, + timeout: 0, + handler(ctx) { + const req = ctx.params.req; + const res = ctx.params.res; + + // Set pointers to Context + req.$ctx = ctx; + res.$ctx = ctx; + + if (ctx.requestID) res.setHeader('X-Request-ID', ctx.requestID); + + if (!req.originalUrl) req.originalUrl = req.url; + + // Split URL & query params + const parsed = this.parseQueryString(req); + let url = parsed.url; + + // Trim trailing slash + if (url.length > 1 && url.endsWith('/')) url = url.slice(0, -1); + + req.parsedUrl = url; + + if (!req.query) req.query = parsed.query; + + // Skip if no routes + if (!this.routes || this.routes.length == 0) return null; + + let method = req.method; + if (method == 'OPTIONS') { + method = req.headers['access-control-request-method']; + } + + // Check aliases + const found = this.resolveAlias(url, method); + if (found) { + const route = found.alias.route; + // Update URLs for middlewares + req.baseUrl = route.path; + req.url = req.originalUrl.substring(route.path.length); + if (req.url.length == 0 || req.url[0] !== '/') + req.url = '/' + req.url; + + return this.routeHandler(ctx, route, req, res, found); + } + + // Check routes + for (let i = 0; i < this.routes.length; i++) { + const route = this.routes[i]; + + if (url.startsWith(route.path)) { + // Update URLs for middlewares + req.baseUrl = route.path; + req.url = req.originalUrl.substring(route.path.length); + if (req.url.length == 0 || req.url[0] !== '/') + req.url = '/' + req.url; + + return this.routeHandler(ctx, route, req, res); + } + } + + return null; + }, + }, + + listAliases: { + rest: 'GET /list-aliases', + params: { + grouping: { type: 'boolean', optional: true, convert: true }, + withActionSchema: { type: 'boolean', optional: true, convert: true }, + }, + handler(ctx) { + const grouping = !!ctx.params.grouping; + const withActionSchema = !!ctx.params.withActionSchema; + + const actionList = withActionSchema + ? this.broker.registry.getActionList({}) + : null; + + const res = []; + + this.aliases.forEach((alias) => { + const obj: any = { + actionName: alias.action, + path: alias.path, + fullPath: alias.fullPath, + methods: alias.method, + routePath: alias.route.path, + }; + + if (withActionSchema && alias.action) { + const actionSchema = actionList.find( + (item) => item.name == alias.action + ); + if (actionSchema && actionSchema.action) { + obj.action = _.omit(actionSchema.action, ['handler']); + } + } + + if (grouping) { + const r = res.find((item) => item.route == alias.route); + if (r) r.aliases.push(obj); + else { + res.push({ + route: alias.route, + aliases: [obj], + }); + } + } else { + res.push(obj); + } + }); + + if (grouping) { + res.forEach((item) => { + item.path = item.route.path; + delete item.route; + }); + } + + return res; + }, + }, + + addRoute: { + params: { + route: { type: 'object' }, + toBottom: { type: 'boolean', optional: true, default: true }, + }, + visibility: 'public', + handler(ctx) { + return this.addRoute(ctx.params.route, ctx.params.toBottom); + }, + }, + + removeRoute: { + params: { + name: { type: 'string', optional: true }, + path: { type: 'string', optional: true }, + }, + visibility: 'public', + handler(ctx) { + if (ctx.params.name != null) + return this.removeRouteByName(ctx.params.name); + + return this.removeRoute(ctx.params.path); + }, + }, + }, + + methods: { + /** + * Create HTTP server + */ + createServer() { + /* istanbul ignore next */ + if (this.server) return; + + if ( + this.settings.https && + this.settings.https.key && + this.settings.https.cert + ) { + this.server = this.settings.http2 + ? http2.createSecureServer(this.settings.https, this.httpHandler) + : https.createServer(this.settings.https, this.httpHandler); + this.isHTTPS = true; + } else { + this.server = this.settings.http2 + ? http2.createServer(this.httpHandler) + : http.createServer(this.httpHandler); + this.isHTTPS = false; + } + + // HTTP server timeout + if (this.settings.httpServerTimeout) { + this.logger.debug( + 'Override default http(s) server timeout:', + this.settings.httpServerTimeout + ); + this.server.setTimeout(this.settings.httpServerTimeout); + } + + this.server.requestTimeout = this.settings.requestTimeout; + this.logger.debug( + 'Setting http(s) server request timeout to:', + this.settings.requestTimeout + ); + }, + + /** + * Default error handling behaviour + * + * @param {HttpRequest} req + * @param {HttpResponse} res + * @param {Error} err + */ + errorHandler(req, res, err) { + // don't log client side errors unless it's configured + if ( + this.settings.log4XXResponses || + (err && !_.inRange(err.code, 400, 500)) + ) { + this.logger.error( + ' Request error!', + err.name, + ':', + err.message, + '\n', + err.stack, + '\nData:', + err.data + ); + } + this.sendError(req, res, err); + }, + + corsHandler(settings, req, res) { + // CORS headers + if (settings.cors) { + // Set CORS headers to `res` + this.writeCorsHeaders(settings, req, res, true); + + // Is it a Preflight request? + if ( + req.method == 'OPTIONS' && + req.headers['access-control-request-method'] + ) { + // 204 - No content + res.writeHead(204, { + 'Content-Length': '0', + }); + res.end(); + + if (settings.logging) { + this.logResponse(req, res); + } + + return true; + } + } + + return false; + }, + + /** + * HTTP request handler. It is called from native NodeJS HTTP server. + * + * @param {HttpRequest} req + * @param {HttpResponse} res + * @param {Function} next Call next middleware (for Express) + * @returns {Promise} + */ + async httpHandler(req, res, next) { + // Set pointers to service + req.$startTime = process.hrtime(); + req.$service = this; + req.$next = next; + + res.$service = this; + res.locals = res.locals || {}; + + let requestID = req.headers['x-request-id']; + if (req.headers['x-correlation-id']) + requestID = req.headers['x-correlation-id']; + + const options = { requestID }; + if (this.settings.rootCallOptions) { + if (_.isPlainObject(this.settings.rootCallOptions)) { + Object.assign(options, this.settings.rootCallOptions); + } else if (_.isFunction(this.settings.rootCallOptions)) { + this.settings.rootCallOptions.call(this, options, req, res); + } + } + + try { + const result = await this.actions.rest({ req, res }, options); + if (result == null) { + // Not routed. + + const shouldBreak = this.corsHandler(this.settings, req, res); // check cors settings first + if (shouldBreak) { + return; + } + + // Serve assets static files + if (this.serve) { + this.serve(req, res, (err) => { + this.logger.debug(err); + this.send404(req, res); + }); + return; + } + + // If not routed and not served static asset, send 404 + this.send404(req, res); + } + } catch (err) { + this.errorHandler(req, res, err); + } + }, + + /** + * Handle request in the matched route. + * + * @param {Context} ctx + * @param {Route} route + * @param {HttpRequest} req + * @param {HttpResponse} res + * @param {Object} foundAlias + */ + routeHandler(ctx, route, req, res, foundAlias) { + // Pointer to the matched route + req.$route = route; + res.$route = route; + + this.logRequest(req); + + return new this.Promise(async (resolve, reject) => { + res.once('finish', () => resolve(true)); + res.once('close', () => resolve(true)); + res.once('error', (err) => reject(err)); + + try { + await composeThen.call(this, req, res, ...route.middlewares); + let params: any = {}; + + const shouldBreak = this.corsHandler(route, req, res); + if (shouldBreak) { + return resolve(true); + } + + // Merge params + if (route.opts.mergeParams === false) { + params = { body: req.body, query: req.query }; + } else { + const body = _.isObject(req.body) ? req.body : {}; + Object.assign(params, body, req.query); + } + req.$params = params; // eslint-disable-line require-atomic-updates + + // Resolve action name + let urlPath = req.parsedUrl.slice(route.path.length); + if (urlPath.startsWith('/')) urlPath = urlPath.slice(1); + + // Resolve internal services + urlPath = urlPath.replace(this._isscRe, '$'); + let action = urlPath; + + // Resolve aliases + if (foundAlias) { + const alias = foundAlias.alias; + this.logger.debug(' Alias:', alias.toString()); + + if (route.opts.mergeParams === false) { + params.params = foundAlias.params; + } else { + Object.assign(params, foundAlias.params); + } + + req.$alias = alias; // eslint-disable-line require-atomic-updates + + // Alias handler + return resolve(await this.aliasHandler(req, res, alias)); + } else if (route.mappingPolicy == MAPPING_POLICY_RESTRICT) { + // Blocking direct access + return resolve(null); + } + + if (!action) return resolve(null); + + // Not found alias, call services by action name + action = action.replace(/\//g, '.'); + if (route.opts.camelCaseNames) { + action = action.split('.').map(_.camelCase).join('.'); + } + + // Alias handler + const result = await this.aliasHandler(req, res, { + action, + _notDefined: true, + }); + resolve(result); + } catch (err) { + reject(err); + } + }); + }, + + /** + * Alias handler. Call action or call custom function + * - check whitelist + * - Rate limiter + * - Resolve endpoint + * - onBeforeCall + * - Authentication + * - Authorization + * - Call the action + * + * @param {HttpRequest} req + * @param {HttpResponse} res + * @param {Object} alias + * @returns + */ + async aliasHandler(req, res, alias) { + const route = req.$route; + const ctx = req.$ctx; + + // Whitelist check + if (alias.action && route.hasWhitelist) { + if (!this.checkWhitelist(route, alias.action)) { + this.logger.debug( + ` The '${alias.action}' action is not in the whitelist!` + ); + throw new ServiceNotFoundError({ action: alias.action }); + } + } + + // Rate limiter + if (route.rateLimit) { + const opts = route.rateLimit; + const store = route.rateLimit.store; + + const key = opts.key(req); + if (key) { + const remaining = opts.limit - (await store.inc(key)); + if (opts.headers) { + res.setHeader('X-Rate-Limit-Limit', opts.limit); + res.setHeader('X-Rate-Limit-Remaining', Math.max(0, remaining)); + res.setHeader('X-Rate-Limit-Reset', store.resetTime); + } + if (remaining < 0) { + throw new RateLimitExceeded(); + } + } + } + + // Resolve endpoint by action name + if (alias.action) { + const endpoint = this.broker.findNextActionEndpoint( + alias.action, + route.callOptions, + ctx + ); + if (endpoint instanceof Error) { + if (!alias._notDefined && endpoint instanceof ServiceNotFoundError) { + throw new ServiceUnavailableError(); + } + + throw endpoint; + } + + if ( + endpoint.action.visibility != null && + endpoint.action.visibility != 'published' + ) { + // Action can't be published + throw new ServiceNotFoundError({ action: alias.action }); + } + + req.$endpoint = endpoint; + req.$action = endpoint.action; + } + + // onBeforeCall handling + if (route.onBeforeCall) { + await route.onBeforeCall.call(this, ctx, route, req, res, alias); + } + + // Authentication + if (route.authentication) { + const user = await route.authentication.call( + this, + ctx, + route, + req, + res, + alias + ); + if (user) { + this.logger.debug('Authenticated user', user); + ctx.meta.user = user; + } else { + this.logger.debug('Anonymous user'); + ctx.meta.user = null; + } + } + + // Authorization + if (route.authorization) { + await route.authorization.call(this, ctx, route, req, res, alias); + } + + // Call the action or alias + if (_.isFunction(alias.handler)) { + // Call custom alias handler + if ( + route.logging && + this.settings.logRequest && + this.settings.logRequest in this.logger + ) + this.logger[this.settings.logRequest]( + ` Call custom function in '${alias.toString()}' alias` + ); + + await new this.Promise((resolve, reject) => { + alias.handler.call(this, req, res, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + + if (alias.action) + return this.callAction( + route, + alias.action, + req, + res, + alias.type == 'stream' ? req : req.$params + ); + else + throw new MoleculerServerError( + 'No alias handler', + 500, + 'NO_ALIAS_HANDLER', + { path: req.originalUrl, alias: _.pick(alias, ['method', 'path']) } + ); + } else if (alias.action) { + return this.callAction( + route, + alias.action, + req, + res, + alias.type == 'stream' ? req : req.$params + ); + } + }, + + /** + * Call an action via broker + * + * @param {Object} route Route options + * @param {String} actionName Name of action + * @param {HttpRequest} req Request object + * @param {HttpResponse} res Response object + * @param {Object} params Incoming params from request + * @returns {Promise} + */ + async callAction(route, actionName, req, res, params) { + const ctx = req.$ctx; + + try { + // Logging params + if (route.logging) { + if ( + this.settings.logRequest && + this.settings.logRequest in this.logger + ) + this.logger[this.settings.logRequest]( + ` Call '${actionName}' action` + ); + if ( + this.settings.logRequestParams && + this.settings.logRequestParams in this.logger + ) + this.logger[this.settings.logRequestParams](' Params:', params); + } + + // Pass the `req` & `res` vars to ctx.params. + if (req.$alias && req.$alias.passReqResToParams) { + params.$req = req; + params.$res = res; + } + + const opts = route.callOptions ? { ...route.callOptions } : {}; + if (params && params.$params) { + // Transfer URL parameters via meta in case of stream + if (!opts.meta) opts.meta = { $params: params.$params }; + else opts.meta.$params = params.$params; + } + + // Call the action + let data = await ctx.call(req.$endpoint, params, opts); + + // Post-process the response + + // onAfterCall handling + if (route.onAfterCall) + data = await route.onAfterCall.call(this, ctx, route, req, res, data); + + // Send back the response + this.sendResponse(req, res, data, req.$endpoint.action); + + if (route.logging) this.logResponse(req, res, data); + + return true; + } catch (err) { + /* istanbul ignore next */ + if (!err) return; // Cancelling promise chain, no error + + throw err; + } + }, + + /** + * Encode response data + * + * @param {HttpIncomingMessage} req + * @param {HttpResponse} res + * @param {any} data + */ + encodeResponse(req, res, data) { + return JSON.stringify(data); + }, + + /** + * Convert data & send back to client + * + * @param {HttpIncomingMessage} req + * @param {HttpResponse} res + * @param {any} data + * @param {Object?} action + */ + sendResponse(req, res, data: any, action) { + const ctx = req.$ctx; + const route = req.$route; + + /* istanbul ignore next */ + if (res.headersSent) { + this.logger.warn('Headers have already sent.', { + url: req.url, + action, + }); + return; + } + + /* istanbul ignore next */ + if (!res.statusCode) res.statusCode = 200; + + // Status code & message + if (ctx.meta.$statusCode) { + res.statusCode = ctx.meta.$statusCode; + } + if (ctx.meta.$statusMessage) { + res.statusMessage = ctx.meta.$statusMessage; + } + + // Redirect + if ( + res.statusCode == 201 || + (res.statusCode >= 300 && + res.statusCode < 400 && + res.statusCode !== 304) + ) { + const location = ctx.meta.$location; + /* istanbul ignore next */ + if (!location) { + this.logger.warn( + `The 'ctx.meta.$location' is missing for status code '${res.statusCode}'!` + ); + } else { + res.setHeader('Location', location); + } + } + + // Override responseType from action schema + let responseType; + /* istanbul ignore next */ + if (action && action.responseType) { + responseType = action.responseType; + } + + // Custom headers from action schema + /* istanbul ignore next */ + if (action && action.responseHeaders) { + Object.keys(action.responseHeaders).forEach((key) => { + res.setHeader(key, action.responseHeaders[key]); + if (key == 'Content-Type' && !responseType) + responseType = action.responseHeaders[key]; + }); + } + + // Custom responseType from ctx.meta + if (ctx.meta.$responseType) { + responseType = ctx.meta.$responseType; + } + + // Custom headers from ctx.meta + if (ctx.meta.$responseHeaders) { + Object.keys(ctx.meta.$responseHeaders).forEach((key) => { + if (key == 'Content-Type' && !responseType) + responseType = ctx.meta.$responseHeaders[key]; + else res.setHeader(key, ctx.meta.$responseHeaders[key]); + }); + } + if (data == null) return res.end(); + + let chunk; + // Buffer + if (Buffer.isBuffer(data)) { + res.setHeader( + 'Content-Type', + responseType || 'application/octet-stream' + ); + res.setHeader('Content-Length', data.length); + chunk = data; + } + // Buffer from Object + else if (_.isObject(data) && (data as any).type == 'Buffer') { + const buf = Buffer.from(data as any); + res.setHeader( + 'Content-Type', + responseType || 'application/octet-stream' + ); + res.setHeader('Content-Length', buf.length); + chunk = buf; + } + // Stream + else if (isReadableStream(data)) { + res.setHeader( + 'Content-Type', + responseType || 'application/octet-stream' + ); + chunk = data; + } + // Object or Array (stringify) + else if (_.isObject(data) || Array.isArray(data)) { + res.setHeader( + 'Content-Type', + responseType || 'application/json; charset=utf-8' + ); + chunk = this.encodeResponse(req, res, data); + } + // Other (stringify or raw text) + else { + if (!responseType) { + res.setHeader('Content-Type', 'application/json; charset=utf-8'); + chunk = this.encodeResponse(req, res, data); + } else { + res.setHeader('Content-Type', responseType); + if (_.isString(data)) chunk = data; + else chunk = data.toString(); + } + } + + // Auto generate & add ETag + if ( + route.etag && + chunk && + !res.getHeader('ETag') && + !isReadableStream(chunk) + ) { + res.setHeader('ETag', generateETag.call(this, chunk, route.etag)); + } + + // Freshness + if (isFresh(req, res)) res.statusCode = 304; + + if (res.statusCode === 204 || res.statusCode === 304) { + res.removeHeader('Content-Type'); + res.removeHeader('Content-Length'); + res.removeHeader('Transfer-Encoding'); + + chunk = ''; + } + + if (req.method === 'HEAD') { + // skip body for HEAD + res.end(); + } else { + // respond + if (isReadableStream(data)) { + //Stream response + data.pipe(res); + } else { + res.end(chunk); + } + } + }, + + /** + * Middleware for ExpressJS + * + * @returns {Function} + */ + express() { + return (req, res, next) => this.httpHandler(req, res, next); + }, + + /** + * Send 404 response + * + * @param {HttpIncomingMessage} req + * @param {HttpResponse} res + */ + send404(req, res) { + if (req.$next) return req.$next(); + + this.sendError(req, res, new NotFoundError()); + }, + + /** + * Send an error response + * + * @param {HttpIncomingMessage} req + * @param {HttpResponse} res + * @param {Error} err + */ + sendError(req, res, err) { + // Route error handler + if (req.$route && _.isFunction(req.$route.onError)) + return req.$route.onError.call(this, req, res, err); + + // Global error handler + if (_.isFunction(this.settings.onError)) + return this.settings.onError.call(this, req, res, err); + + // --- Default error handler + + // In middleware mode call the next(err) + if (req.$next) return req.$next(err); + + /* istanbul ignore next */ + if (res.headersSent) { + this.logger.warn('Headers have already sent', req.url, err); + return; + } + + /* istanbul ignore next */ + if (!err || !(err instanceof Error)) { + res.writeHead(500); + res.end('Internal Server Error'); + + this.logResponse(req, res); + return; + } + + /* istanbul ignore next */ + if (!(err instanceof MoleculerError)) { + const e = err as any; + err = new MoleculerError(e.message, e.code || e.status, e.type, e.data); + err.name = e.name; + } + + const ctx = req.$ctx; + let responseType = 'application/json; charset=utf-8'; + + if (ctx) { + if (ctx.meta.$responseType) { + responseType = ctx.meta.$responseType; + } + if (ctx.meta.$responseHeaders) { + Object.keys(ctx.meta.$responseHeaders).forEach((key) => { + if (key === 'Content-Type' && !responseType) + responseType = ctx.meta.$responseHeaders[key]; + else res.setHeader(key, ctx.meta.$responseHeaders[key]); + }); + } + } + + // Return with the error as JSON object + res.setHeader('Content-type', responseType); + + const code = + _.isNumber(err.code) && _.inRange(err.code, 400, 599) ? err.code : 500; + res.writeHead(code); + const errObj = this.reformatError(err, req, res); + res.end( + errObj !== undefined ? this.encodeResponse(req, res, errObj) : undefined + ); + + this.logResponse(req, res); + }, + + /** + * Reformatting the error object to response + * @param {Error} err + * @param {HttpIncomingMessage} req + * @param {HttpResponse} res + @returns {Object} + */ + reformatError(err /*, req, res*/) { + return _.pick(err, ['name', 'message', 'code', 'type', 'data']); + }, + + /** + * Send 302 Redirect + * + * @param {HttpResponse} res + * @param {String} url + * @param {Number} status code + */ + sendRedirect(res, url, code = 302) { + res.writeHead(code, { + Location: url, + 'Content-Length': '0', + }); + res.end(); + //this.logResponse(req, res); + }, + + /** + * Split the URL and resolve vars from querystring + * + * @param {any} req + * @returns + */ + parseQueryString(req) { + // Split URL & query params + let url = req.url; + let query = {}; + const questionIdx = req.url.indexOf('?', 1); + if (questionIdx !== -1) { + query = queryString.parse(req.url.substring(questionIdx + 1)); + url = req.url.substring(0, questionIdx); + } + return { query, url }; + }, + + /** + * Log the request + * + * @param {HttpIncomingMessage} req + */ + logRequest(req) { + if (req.$route && !req.$route.logging) return; + + if (this.settings.logRequest && this.settings.logRequest in this.logger) + this.logger[this.settings.logRequest](`=> ${req.method} ${req.url}`); + }, + + /** + * Return with colored status code + * + * @param {any} code + * @returns + */ + coloringStatusCode(code) { + if (code >= 500) return kleur.red().bold(code); + if (code >= 400 && code < 500) return kleur.red().bold(code); + if (code >= 300 && code < 400) return kleur.cyan().bold(code); + if (code >= 200 && code < 300) return kleur.green().bold(code); + + /* istanbul ignore next */ + return code; + }, + + /** + * Log the response + * + * @param {HttpIncomingMessage} req + * @param {HttpResponse} res + * @param {any} data + */ + logResponse(req, res, data) { + if (req.$route && !req.$route.logging) return; + + let time = ''; + if (req.$startTime) { + const diff = process.hrtime(req.$startTime); + const duration = (diff[0] + diff[1] / 1e9) * 1000; + if (duration > 1000) + time = kleur.red(`[+${Number(duration / 1000).toFixed(3)} s]`); + else time = kleur.grey(`[+${Number(duration).toFixed(3)} ms]`); + } + + if (this.settings.logResponse && this.settings.logResponse in this.logger) + this.logger[this.settings.logResponse]( + `<= ${this.coloringStatusCode(res.statusCode)} ${ + req.method + } ${kleur.bold(req.originalUrl)} ${time}` + ); + + /* istanbul ignore next */ + if ( + this.settings.logResponseData && + this.settings.logResponseData in this.logger + ) { + this.logger[this.settings.logResponseData](' Data:', data); + } + }, + + /** + * Check origin(s) + * + * @param {String} origin + * @param {String|Array} settings + * @returns {Boolean} + */ + checkOrigin(origin, settings) { + if (_.isString(settings)) { + if (settings.indexOf(origin) !== -1) return true; + + if (settings.indexOf('*') !== -1) { + // Based on: https://github.com/hapijs/hapi + // eslint-disable-next-line + const wildcard = new RegExp( + `^${_.escapeRegExp(settings) + .replace(/\\\*/g, '.*') + .replace(/\\\?/g, '.')}$` + ); + return origin.match(wildcard); + } + } else if (_.isFunction(settings)) { + return settings.call(this, origin); + } else if (Array.isArray(settings)) { + for (let i = 0; i < settings.length; i++) { + if (this.checkOrigin(origin, settings[i])) { + return true; + } + } + } + + return false; + }, + + /** + * Write CORS header + * + * Based on: https://github.com/expressjs/cors + * + * @param {Object} route + * @param {HttpIncomingMessage} req + * @param {HttpResponse} res + * @param {Boolean} isPreFlight + */ + writeCorsHeaders(route, req, res, isPreFlight) { + /* istanbul ignore next */ + if (!route.cors) return; + + const origin = req.headers['origin']; + // It's not presented, when it's a local request (origin and target same) + if (!origin) return; + + // Access-Control-Allow-Origin + if (!route.cors.origin || route.cors.origin === '*') { + res.setHeader('Access-Control-Allow-Origin', '*'); + } else if (this.checkOrigin(origin, route.cors.origin)) { + res.setHeader('Access-Control-Allow-Origin', origin); + res.setHeader('Vary', 'Origin'); + } else { + throw new ForbiddenError(ERR_ORIGIN_NOT_ALLOWED); + } + + // Access-Control-Allow-Credentials + if (route.cors.credentials === true) { + res.setHeader('Access-Control-Allow-Credentials', 'true'); + } + + // Access-Control-Expose-Headers + if (_.isString(route.cors.exposedHeaders)) { + res.setHeader( + 'Access-Control-Expose-Headers', + route.cors.exposedHeaders + ); + } else if (Array.isArray(route.cors.exposedHeaders)) { + res.setHeader( + 'Access-Control-Expose-Headers', + route.cors.exposedHeaders.join(', ') + ); + } + + if (isPreFlight) { + // Access-Control-Allow-Headers + if (_.isString(route.cors.allowedHeaders)) { + res.setHeader( + 'Access-Control-Allow-Headers', + route.cors.allowedHeaders + ); + } else if (Array.isArray(route.cors.allowedHeaders)) { + res.setHeader( + 'Access-Control-Allow-Headers', + route.cors.allowedHeaders.join(', ') + ); + } else { + // AllowedHeaders doesn't specified, so we send back from req headers + const allowedHeaders = req.headers['access-control-request-headers']; + if (allowedHeaders) { + res.setHeader('Vary', 'Access-Control-Request-Headers'); + res.setHeader('Access-Control-Allow-Headers', allowedHeaders); + } + } + + // Access-Control-Allow-Methods + if (_.isString(route.cors.methods)) { + res.setHeader('Access-Control-Allow-Methods', route.cors.methods); + } else if (Array.isArray(route.cors.methods)) { + res.setHeader( + 'Access-Control-Allow-Methods', + route.cors.methods.join(', ') + ); + } + + // Access-Control-Max-Age + if (route.cors.maxAge) { + res.setHeader('Access-Control-Max-Age', route.cors.maxAge.toString()); + } + } + }, + + /** + * Check the action name in whitelist + * + * @param {Object} route + * @param {String} action + * @returns {Boolean} + */ + checkWhitelist(route, action) { + // Rewrite to for iterator (faster) + return ( + route.whitelist.find((mask) => { + if (_.isString(mask)) return match(action, mask); + else if (_.isRegExp(mask)) return mask.test(action); + }) != null + ); + }, + + /** + * Resolve alias names + * + * @param {String} url + * @param {string} [method="GET"] + * @returns {Object} Resolved alas & params + */ + resolveAlias(url, method = 'GET') { + for (let i = 0; i < this.aliases.length; i++) { + const alias = this.aliases[i]; + if (alias.isMethod(method)) { + const params = alias.match(url); + if (params) { + return { alias, params }; + } + } + } + return false; + }, + + /** + * Add & prepare route from options + * @param {Object} opts + * @param {Boolean} [toBottom=true] + */ + addRoute(opts, toBottom = true) { + const route = this.createRoute(opts); + const idx = this.routes.findIndex((r) => this.isEqualRoutes(r, route)); + if (idx !== -1) { + // Replace the previous + this.routes[idx] = route; + } else { + // Add new route + if (toBottom) this.routes.push(route); + else this.routes.unshift(route); + + // Reordering routes + if (this.settings.optimizeOrder) this.optimizeRouteOrder(); + } + + return route; + }, + + /** + * Remove a route by path + * @param {String} path + */ + removeRoute(path) { + const idx = this.routes.findIndex((r) => r.opts.path == path); + if (idx !== -1) { + const route = this.routes[idx]; + + // Clean global aliases for this route + this.aliases = this.aliases.filter((a) => a.route != route); + + // Remote route + this.routes.splice(idx, 1); + + return true; + } + return false; + }, + + /** + * Remove a route by name + * @param {String} name + */ + removeRouteByName(name) { + const idx = this.routes.findIndex((r) => r.opts.name == name); + if (idx !== -1) { + const route = this.routes[idx]; + + // Clean global aliases for this route + this.aliases = this.aliases.filter((a) => a.route != route); + + // Remote route + this.routes.splice(idx, 1); + + return true; + } + return false; + }, + + /** + * Optimize route order by route path depth + */ + optimizeRouteOrder() { + this.routes.sort((a, b) => { + let c = + addSlashes(b.path).split('/').length - + addSlashes(a.path).split('/').length; + if (c == 0) { + // Second level ordering (considering URL params) + c = a.path.split(':').length - b.path.split(':').length; + } + + return c; + }); + + this.logger.debug( + 'Optimized path order: ', + this.routes.map((r) => r.path) + ); + }, + + /** + * Create route object from options + * + * @param {Object} opts + * @returns {Object} + */ + createRoute(opts) { + this.logRouteRegistration(`Register route to '${opts.path}'`); + const route: any = { + name: opts.name, + opts, + middlewares: [], + }; + if (opts.authorization) { + let fn = this.authorize; + if (_.isString(opts.authorization)) fn = this[opts.authorization]; + + if (!_.isFunction(fn)) { + this.logger.warn( + "Define 'authorize' method in the service to enable authorization." + ); + route.authorization = null; + } else route.authorization = fn; + } + if (opts.authentication) { + let fn = this.authenticate; + if (_.isString(opts.authentication)) fn = this[opts.authentication]; + + if (!_.isFunction(fn)) { + this.logger.warn( + "Define 'authenticate' method in the service to enable authentication." + ); + route.authentication = null; + } else route.authentication = fn; + } + + // Call options + route.callOptions = opts.callOptions; + + // Create body parsers as middlewares + if (opts.bodyParsers == null || opts.bodyParsers === true) { + // Set default JSON body-parser + opts.bodyParsers = { + json: true, + }; + } + if (opts.bodyParsers) { + const bps = opts.bodyParsers; + Object.keys(bps).forEach((key) => { + const opts = _.isObject(bps[key]) ? bps[key] : undefined; + if (bps[key] !== false && key in bodyParser) + route.middlewares.push(bodyParser[key](opts)); + }); + } + + // Logging + route.logging = opts.logging != null ? opts.logging : true; + + // ETag + route.etag = opts.etag != null ? opts.etag : this.settings.etag; + + // Middlewares + const mw: any[] = []; + if ( + this.settings.use && + Array.isArray(this.settings.use) && + this.settings.use.length > 0 + ) + mw.push(...this.settings.use); + + if (opts.use && Array.isArray(opts.use) && opts.use.length > 0) + mw.push(...opts.use); + + if (mw.length > 0) { + route.middlewares.push(...mw); + this.logRouteRegistration(` Registered ${mw.length} middlewares.`); + } + + // CORS + if (this.settings.cors || opts.cors) { + // Merge cors settings + route.cors = Object.assign( + {}, + { + origin: '*', + methods: ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'], + }, + this.settings.cors, + opts.cors + ); + } else { + route.cors = null; + } + + // Rate limiter (Inspired by https://github.com/dotcypress/micro-ratelimit/) + const rateLimit = opts.rateLimit || this.settings.rateLimit; + if (rateLimit) { + const opts = Object.assign( + {}, + { + window: 60 * 1000, + limit: 30, + headers: false, + key: (req) => { + return ( + req.headers['x-forwarded-for'] || + req.connection.remoteAddress || + req.socket.remoteAddress || + req.connection.socket.remoteAddress + ); + }, + }, + rateLimit + ); + + route.rateLimit = opts; + + if (opts.StoreFactory) { + route.rateLimit.store = new opts.StoreFactory( + opts.window, + opts, + this.broker + ); + } else { + route.rateLimit.store = new MemoryStore(opts.window); + } + } + + // Handle whitelist + route.whitelist = opts.whitelist; + route.hasWhitelist = Array.isArray(route.whitelist); + + // `onBeforeCall` handler + if (opts.onBeforeCall) route.onBeforeCall = opts.onBeforeCall; + + // `onAfterCall` handler + if (opts.onAfterCall) route.onAfterCall = opts.onAfterCall; + + // `onError` handler + if (opts.onError) route.onError = opts.onError; + + // Create URL prefix + const globalPath = + this.settings.path && this.settings.path != '/' + ? this.settings.path + : ''; + route.path = addSlashes(globalPath) + (opts.path || ''); + route.path = normalizePath(route.path); + + // Create aliases + this.createRouteAliases(route, opts.aliases); + + // Optimize aliases order + if (this.settings.optimizeOrder) { + this.optimizeAliasesOrder(); + } + + // Set alias mapping policy + route.mappingPolicy = opts.mappingPolicy; + if (!route.mappingPolicy) { + const hasAliases = + _.isObject(opts.aliases) && Object.keys(opts.aliases).length > 0; + route.mappingPolicy = + hasAliases || opts.autoAliases + ? MAPPING_POLICY_RESTRICT + : MAPPING_POLICY_ALL; + } + + this.logRouteRegistration(''); + + return route; + }, + + /** + * Create all aliases for route. + * + * @param {Object} route + * @param {Object} aliases + */ + createRouteAliases(route, aliases) { + // Clean previous aliases for this route + this.aliases = this.aliases.filter( + (a) => !this.isEqualRoutes(a.route, route) + ); + + // Process aliases definitions from route settings + _.forIn(aliases, (action, matchPath) => { + if (matchPath.startsWith('REST ')) { + this.aliases.push( + ...this.generateRESTAliases(route, matchPath, action) + ); + } else { + this.aliases.push(this.createAlias(route, matchPath, action)); + } + }); + + if (route.opts.autoAliases) { + this.regenerateAutoAliases(route); + } + }, + + /** + * Checks whether the routes are same. + * + * @param {Object} routeA + * @param {Object} routeB + * @returns {Boolean} + */ + isEqualRoutes(routeA, routeB) { + if (routeA.name != null && routeB.name != null) { + return routeA.name === routeB.name; + } + return routeA.path === routeB.path; + }, + + /** + * Generate aliases for REST. + * + * @param {Route} route + * @param {String} path + * @param {*} action + * + * @returns Array + */ + generateRESTAliases(route, path, action) { + const p = path.split(/\s+/); + const pathName = p[1]; + const pathNameWithoutEndingSlash = pathName.endsWith('/') + ? pathName.slice(0, -1) + : pathName; + const aliases = { + list: `GET ${pathName}`, + get: `GET ${pathNameWithoutEndingSlash}/:id`, + create: `POST ${pathName}`, + update: `PUT ${pathNameWithoutEndingSlash}/:id`, + patch: `PATCH ${pathNameWithoutEndingSlash}/:id`, + remove: `DELETE ${pathNameWithoutEndingSlash}/:id`, + }; + let actions = ['list', 'get', 'create', 'update', 'patch', 'remove']; + + if (typeof action !== 'string' && (action.only || action.except)) { + if (action.only) { + actions = actions.filter((item) => action.only.includes(item)); + } + + if (action.except) { + actions = actions.filter((item) => !action.except.includes(item)); + } + + action = action.action; + } + + return actions.map((item) => + this.createAlias(route, aliases[item], `${action}.${item}`) + ); + }, + + /** + * Regenerate aliases automatically if service registry has been changed. + * + * @param {Route} route + */ + regenerateAutoAliases(route) { + this.logRouteRegistration( + `♻ Generate aliases for '${route.path}' route...` + ); + + // Clean previous aliases for this route + this.aliases = this.aliases.filter( + (alias) => alias.route != route || !alias._generated + ); + + const processedServices = new Set(); + + const services = this.broker.registry.getServiceList({ + withActions: true, + grouping: true, + }); + services.forEach((service) => { + if (!service.settings) return; + const serviceName = service.fullName || getServiceFullname(service); + + let basePaths = []; + if (_.isString(service.settings.rest)) { + basePaths = [service.settings.rest]; + } else if (_.isArray(service.settings.rest)) { + basePaths = service.settings.rest; + } else { + basePaths = [serviceName.replace(SLASH_REGEX, '/')]; + } + + // Skip multiple instances of services + if (processedServices.has(serviceName)) return; + + for (let basePath of basePaths) { + basePath = addSlashes( + _.isString(basePath) + ? basePath + : serviceName.replace(SLASH_REGEX, '/') + ); + + _.forIn(service.actions, (action) => { + if (action.rest) { + // Check visibility + if (action.visibility != null && action.visibility != 'published') + return; + + // Check whitelist + if ( + route.hasWhitelist && + !this.checkWhitelist(route, action.name) + ) + return; + + let restRoutes = []; + if (!_.isArray(action.rest)) { + restRoutes = [action.rest]; + } else { + restRoutes = action.rest; + } + + for (const restRoute of restRoutes) { + let alias = null; + + if (_.isString(restRoute)) { + alias = this.parseActionRestString(restRoute, basePath); + } else if (_.isObject(restRoute)) { + alias = this.parseActionRestObject( + restRoute, + action.rawName, + basePath + ); + } + + if (alias) { + alias.path = removeTrailingSlashes(normalizePath(alias.path)); + alias._generated = true; + this.aliases.push( + this.createAlias(route, alias, action.name) + ); + } + } + } + + processedServices.add(serviceName); + }); + } + }); + + if (this.settings.optimizeOrder) { + this.optimizeAliasesOrder(); + } + }, + + /** + * + */ + parseActionRestString(restRoute, basePath) { + if (restRoute.indexOf(' ') !== -1) { + // Handle route: "POST /import" + const p = restRoute.split(/\s+/); + return { + method: p[0], + path: basePath + p[1], + }; + } + // Handle route: "/import". In this case apply to all methods as "* /import" + return { + method: '*', + path: basePath + restRoute, + }; + }, + + /** + * + */ + parseActionRestObject(restRoute, rawName, basePath) { + // Handle route: { method: "POST", path: "/other", basePath: "newBasePath" } + return Object.assign({}, restRoute, { + method: restRoute.method || '*', + path: + (restRoute.basePath ? restRoute.basePath : basePath) + + (restRoute.path ? restRoute.path : rawName), + }); + }, + + /** + * Optimize order of alias path. + */ + optimizeAliasesOrder() { + this.aliases.sort((a, b) => { + let c = + addSlashes(b.path).split('/').length - + addSlashes(a.path).split('/').length; + if (c == 0) { + // Second level ordering (considering URL params) + c = a.path.split(':').length - b.path.split(':').length; + } + + if (c == 0) { + c = a.path.localeCompare(b.path); + } + + return c; + }); + }, + + /** + * Create alias for route. + * + * @param {Object} route + * @param {String|Object} matchPath + * @param {String|Object} action + */ + createAlias(route, path, action) { + const alias = new Alias(this, route, path, action); + this.logRouteRegistration(' ' + alias.toString()); + return alias; + }, + + /** + * Set log level and log registration route related activities + * + * @param {*} message + */ + logRouteRegistration(message) { + if ( + this.settings.logRouteRegistration && + this.settings.logRouteRegistration in this.logger + ) + this.logger[this.settings.logRouteRegistration](message); + }, + }, + + events: { + '$services.changed'() { + this.regenerateAllAutoAliases(); + }, + }, + + /** + * Service created lifecycle event handler + */ + created() { + if (this.settings.server !== false) { + if (_.isObject(this.settings.server)) { + // Use an existing server instance + this.server = this.settings.server; + } else { + // Create a new HTTP/HTTPS/HTTP2 server instance + this.createServer(); + } + + /* istanbul ignore next */ + this.server.on('error', (err) => { + this.logger.error('Server error', err); + }); + + this.logger.info('API Gateway server created.'); + } + + // Special char for internal services + const specChar = + this.settings.internalServiceSpecialChar != null + ? this.settings.internalServiceSpecialChar + : '~'; + this._isscRe = new RegExp(specChar); + + // Create static server middleware + if (this.settings.assets) { + const opts = this.settings.assets.options || {}; + this.serve = serveStatic(this.settings.assets.folder, opts); + } + + // Alias store + this.aliases = []; + + // Add default route + if ( + Array.isArray(this.settings.routes) && + this.settings.routes.length == 0 + ) { + this.settings.routes = [ + { + path: '/', + }, + ]; + } + + // Process routes + this.routes = []; + if (Array.isArray(this.settings.routes)) + this.settings.routes.forEach((route) => this.addRoute(route)); + + // Regenerate all auto aliases routes + const debounceTime = + this.settings.debounceTime > 0 + ? parseInt(this.settings.debounceTime) + : 500; + this.regenerateAllAutoAliases = _.debounce(() => { + /* istanbul ignore next */ + this.routes.forEach( + (route) => route.opts.autoAliases && this.regenerateAutoAliases(route) + ); + + this.broker.broadcast('$api.aliases.regenerated'); + }, debounceTime); + }, + + /** + * Service started lifecycle event handler + */ + started() { + if (this.settings.server === false) return this.Promise.resolve(); + + /* istanbul ignore next */ + return new this.Promise((resolve, reject) => { + this.server.listen(this.settings.port, this.settings.ip, (err) => { + if (err) return reject(err); + + const addr = this.server.address(); + const listenAddr = + addr.address == '0.0.0.0' && os.platform() == 'win32' + ? 'localhost' + : addr.address; + this.logger.info( + `API Gateway listening on ${ + this.isHTTPS ? 'https' : 'http' + }://${listenAddr}:${addr.port}` + ); + resolve(); + }); + }); + }, + + /** + * Service stopped lifecycle event handler + */ + stopped() { + if (this.settings.server !== false && this.server.listening) { + /* istanbul ignore next */ + return new this.Promise((resolve, reject) => { + this.server.close((err) => { + if (err) return reject(err); + + this.logger.info('API Gateway stopped!'); + resolve(); + }); + }); + } + + return this.Promise.resolve(); + }, + + bodyParser, + serveStatic, + + Errors: require('./errors'), + RateLimitStores: { + MemoryStore: require('./memory-store'), + }, +}; diff --git a/server/packages/sdk/src/services/lib/moleculer-web/memory-store.ts b/server/packages/sdk/src/services/lib/moleculer-web/memory-store.ts new file mode 100644 index 00000000000..ea6b0b80ce1 --- /dev/null +++ b/server/packages/sdk/src/services/lib/moleculer-web/memory-store.ts @@ -0,0 +1,53 @@ +/** + * Memory store for Rate limiter + * + * Inspired by https://github.com/dotcypress/micro-ratelimit/ + * + * @class MemoryStore + */ +export class MemoryStore { + hits; + resetTime; + timer; + + /** + * Creates an instance of MemoryStore. + * + * @param {Number} clearPeriod + * @memberof MemoryStore + */ + constructor(clearPeriod) { + this.hits = new Map(); + this.resetTime = Date.now() + clearPeriod; + + this.timer = setInterval(() => { + this.resetTime = Date.now() + clearPeriod; + this.reset(); + }, clearPeriod); + + this.timer.unref(); + } + + /** + * Increment the counter by key + * + * @param {String} key + * @returns {Number} + * @memberof MemoryStore + */ + inc(key) { + let counter = this.hits.get(key) || 0; + counter++; + this.hits.set(key, counter); + return counter; + } + + /** + * Reset all counters + * + * @memberof MemoryStore + */ + reset() { + this.hits.clear(); + } +} diff --git a/server/packages/sdk/src/services/lib/moleculer-web/utils.ts b/server/packages/sdk/src/services/lib/moleculer-web/utils.ts new file mode 100644 index 00000000000..a379131b726 --- /dev/null +++ b/server/packages/sdk/src/services/lib/moleculer-web/utils.ts @@ -0,0 +1,156 @@ +/* + * moleculer + * Copyright (c) 2021 MoleculerJS (https://github.com/moleculerjs/moleculer) + * MIT Licensed + */ + +import _ from 'lodash'; +import fresh from 'fresh'; +import etag from 'etag'; + +import { + BadRequestError, + ERR_UNABLE_DECODE_PARAM, + MoleculerError, +} from './errors'; + +/** + * Decode URI encoded param + * @param {String} param + */ +function decodeParam(param) { + try { + return decodeURIComponent(param); + } catch (_) { + /* istanbul ignore next */ + throw new BadRequestError(ERR_UNABLE_DECODE_PARAM, { param }); + } +} + +// Remove slashes "/" from the left & right sides and remove double "//" slashes +function removeTrailingSlashes(s) { + if (s.startsWith('/')) s = s.slice(1); + if (s.endsWith('/')) s = s.slice(0, -1); + return s; //.replace(/\/\//g, "/"); +} + +// Add slashes "/" to the left & right sides +function addSlashes(s) { + return (s.startsWith('/') ? '' : '/') + s + (s.endsWith('/') ? '' : '/'); +} + +// Normalize URL path (remove multiple slashes //) +function normalizePath(s) { + return s.replace(/\/{2,}/g, '/'); +} + +/** + * Compose middlewares + * + * @param {...Function} mws + */ +function compose(...mws) { + const self = this as any; + return (req, res, done) => { + const next = (i, err?) => { + if (i >= mws.length) { + if (_.isFunction(done)) return done.call(self, err); + + /* istanbul ignore next */ + return; + } + + if (err) { + // Call only error middlewares (err, req, res, next) + if (mws[i].length == 4) + mws[i].call(self, err, req, res, (err) => next(i + 1, err)); + else next(i + 1, err); + } else { + if (mws[i].length < 4) + mws[i].call(self, req, res, (err) => next(i + 1, err)); + else next(i + 1); + } + }; + + return next(0); + }; +} + +/** + * Compose middlewares and return Promise + * @param {...Function} mws + * @returns {Promise} + */ +function composeThen(req, res, ...mws) { + return new Promise((resolve, reject) => { + compose.call(this, ...mws)(req, res, (err) => { + if (err) { + /* istanbul ignore next */ + if (err instanceof MoleculerError) return reject(err); + + /* istanbul ignore next */ + if (err instanceof Error) + return reject( + new MoleculerError( + err.message, + (err as any).code || (err as any).status, + (err as any).type + ) + ); // TODO err.stack + + /* istanbul ignore next */ + return reject(new MoleculerError(err)); + } + + resolve(); + }); + }); +} + +/** + * Generate ETag from content. + * + * @param {any} body + * @param {Boolean|String|Function?} opt + * + * @returns {String} + */ +function generateETag(body, opt) { + if (_.isFunction(opt)) return opt.call(this, body); + + const buf = !Buffer.isBuffer(body) ? Buffer.from(body) : body; + + return etag(buf, opt === true || opt === 'weak' ? { weak: true } : null); +} + +/** + * Check the data freshness. + * + * @param {*} req + * @param {*} res + * + * @returns {Boolean} + */ +function isFresh(req, res) { + if ( + (res.statusCode >= 200 && res.statusCode < 300) || + 304 === res.statusCode + ) { + return fresh(req.headers, { + etag: res.getHeader('ETag'), + 'last-modified': res.getHeader('Last-Modified'), + }); + } + return false; +} + +export { + removeTrailingSlashes, + addSlashes, + normalizePath, + decodeParam, + compose, + composeThen, + generateETag, + isFresh, +}; diff --git a/server/packages/sdk/src/services/lib/role.ts b/server/packages/sdk/src/services/lib/role.ts new file mode 100644 index 00000000000..4294f7dd5c6 --- /dev/null +++ b/server/packages/sdk/src/services/lib/role.ts @@ -0,0 +1,22 @@ +export const PERMISSION = { + /** + * 非插件的权限点都叫core + */ + core: { + owner: '__group_owner__', // 保留字段, 用于标识群组所有者 + message: 'core.message', + invite: 'core.invite', + unlimitedInvite: 'core.unlimitedInvite', + editInvite: 'core.editInvite', // 编辑邀请码权限,需要有创建无限制邀请码的权限 + groupDetail: 'core.groupDetail', + groupBaseInfo: 'core.groupBaseInfo', + groupConfig: 'core.groupConfig', + manageUser: 'core.manageUser', + managePanel: 'core.managePanel', + manageInvite: 'core.manageInvite', + manageRoles: 'core.manageRoles', + deleteMessage: 'core.deleteMessage', + }, +}; + +export const allPermission = [...Object.values(PERMISSION.core)]; diff --git a/server/packages/sdk/src/services/lib/settings.ts b/server/packages/sdk/src/services/lib/settings.ts new file mode 100644 index 00000000000..e31baf3cdb2 --- /dev/null +++ b/server/packages/sdk/src/services/lib/settings.ts @@ -0,0 +1,106 @@ +import dotenv from 'dotenv'; +import _ from 'lodash'; + +dotenv.config(); + +/** + * 配置信息 + */ +const port = process.env.PORT ? Number(process.env.PORT) : 11000; +const apiUrl = process.env.API_URL || `http://127.0.0.1:${port}`; +const staticHost = process.env.STATIC_HOST || '{BACKEND}'; +const staticUrl = process.env.STATIC_URL || `${staticHost}/static/`; +const requestTimeout = process.env.REQUEST_TIMEOUT + ? Number(process.env.REQUEST_TIMEOUT) + : 10 * 1000; // default 0 (unit: milliseconds) + +export const config = { + port, + secret: process.env.SECRET || 'tailchat', + env: process.env.NODE_ENV || 'development', + /** + * 是否打开socket admin ui + */ + enableSocketAdmin: !!process.env.ADMIN, + redisUrl: process.env.REDIS_URL, + mongoUrl: process.env.MONGO_URL, + storage: { + type: 'minio', // 可选: minio + minioUrl: process.env.MINIO_URL, + ssl: checkEnvTrusty(process.env.MINIO_SSL) ?? false, + user: process.env.MINIO_USER, + pass: process.env.MINIO_PASS, + bucketName: process.env.MINIO_BUCKET_NAME || 'tailchat', + pathStyle: process.env.MINIO_PATH_STYLE === 'VirtualHosted' ? false : true, + + /** + * 文件上传限制 + * 单位byte + * 默认 1m + */ + limit: process.env.FILE_LIMIT + ? Number(process.env.FILE_LIMIT) + : 1 * 1024 * 1024, + }, + apiUrl, + staticUrl, + enableOpenapi: true, // 是否开始openapi + + emailVerification: checkEnvTrusty(process.env.EMAIL_VERIFY) || false, // 是否在注册后验证邮箱可用性 + smtp: { + senderName: process.env.SMTP_SENDER, // 发邮件者显示名称 + connectionUrl: process.env.SMTP_URI || '', + }, + enablePrometheus: checkEnvTrusty(process.env.PROMETHEUS), + runner: { + requestTimeout, + }, + /** + * 使用Tianji对网站进行监控 + */ + tianji: { + scriptUrl: process.env.TIANJI_SCRIPT_URL, + websiteId: process.env.TIANJI_WEBSITE_ID, + }, + feature: { + disableMsgpack: checkEnvTrusty(process.env.DISABLE_MESSAGEPACK), // 是否禁用socketio的 messgpack parser + disableFileCheck: checkEnvTrusty(process.env.DISABLE_FILE_CHECK), + disableLogger: checkEnvTrusty(process.env.DISABLE_LOGGER), // 是否关闭日志 + disableInfoLog: checkEnvTrusty(process.env.DISABLE_INFO_LOG), // 是否关闭常规日志(仅保留错误日志) + disableTracing: checkEnvTrusty(process.env.DISABLE_TRACING), // 是否关闭链路追踪 + disableUserRegister: checkEnvTrusty(process.env.DISABLE_USER_REGISTER), // 是否关闭用户注册功能 + disableGuestLogin: checkEnvTrusty(process.env.DISABLE_GUEST_LOGIN), // 是否关闭用户游客登录功能 + disableCreateGroup: checkEnvTrusty(process.env.DISABLE_CREATE_GROUP), // 是否禁用用户创建群组功能 + disablePluginStore: checkEnvTrusty(process.env.DISABLE_PLUGIN_STORE), // 是否禁用用户插件中心功能 + disableAddFriend: checkEnvTrusty(process.env.DISABLE_ADD_FRIEND), // 是否禁用用户添加好友功能 + disableTelemetry: checkEnvTrusty(process.env.DISABLE_TELEMETRY), // 是否禁用遥测 + }, +}; + +export const builtinAuthWhitelist = [ + '/gateway/health', + '/debug/hello', + '/user/login', + '/user/register', + '/user/createTemporaryUser', + '/user/resolveToken', + '/user/getUserInfo', + '/user/getUserInfoList', + '/user/checkTokenValid', + '/group/getGroupBasicInfo', + '/group/invite/findInviteByCode', +]; + +/** + * 构建上传地址 + */ +export function buildUploadUrl(objectName: string) { + return config.staticUrl + objectName; +} + +/** + * 判断环境变量是否为true + */ +export function checkEnvTrusty(env: string): boolean { + return env === '1' || env === 'true'; +} diff --git a/server/packages/sdk/src/services/mixins/db.mixin.ts b/server/packages/sdk/src/services/mixins/db.mixin.ts new file mode 100644 index 00000000000..6de1caca9cd --- /dev/null +++ b/server/packages/sdk/src/services/mixins/db.mixin.ts @@ -0,0 +1,99 @@ +import { Context, Errors, ServiceSchema } from 'moleculer'; +import BaseDBService, { MoleculerDB } from 'moleculer-db'; +import { MongooseDbAdapter } from '../lib/moleculer-db-adapter-mongoose'; +import type { Document, FilterQuery, Model } from 'mongoose'; +import { config } from '../lib/settings'; +import type { ReturnModelType } from '@typegoose/typegoose'; +import type { + AnyParamConstructor, + BeAnObject, +} from '@typegoose/typegoose/lib/types'; + +type EntityChangedType = 'created' | 'updated'; + +// type MoleculerDBMethods = MoleculerDB['methods']; +type MoleculerDBMethods = MoleculerDB['methods']; + +// fork from moleculer-db-adapter-mongoose/index.d.ts +interface FindFilters { + query?: FilterQuery; + search?: string; + searchFields?: string[]; // never used??? + sort?: string | string[]; + offset?: number; + limit?: number; +} + +// 复写部分 adapter 的方法类型 +interface TcDbAdapterOverwrite> { + model: M; + insert(entity: Partial): Promise; + find(filters: FindFilters): Promise; + findOne(query: FilterQuery): Promise; +} + +export interface TcDbService< + T extends Document = Document, + M extends Model = Model +> extends MoleculerDBMethods { + entityChanged(type: EntityChangedType, json: {}, ctx: Context): Promise; + + adapter: Omit, keyof TcDbAdapterOverwrite> & + TcDbAdapterOverwrite; + + /** + * 转换fetch出来的文档, 变成一个json + */ + transformDocuments: MoleculerDB< + // @ts-ignore + MongooseDbAdapter + >['methods']['transformDocuments']; +} + +export type TcDbModel = ReturnModelType, BeAnObject>; + +/** + * Tc 数据库mixin + * @param model 数据模型 + */ +export function TcDbService(model: TcDbModel): Partial { + const actions = { + /** + * 自动操作全关 + */ + find: false, + count: false, + list: false, + create: false, + insert: false, + get: false, + update: false, + remove: false, + }; + + const methods = { + /** + * 实体变更时触发事件 + */ + async entityChanged(type, json, ctx) { + await this.clearCache(); + const eventName = `${this.name}.entity.${type}`; + this.broker.emit(eventName, { meta: ctx.meta, entity: json }); + }, + }; + + if (!config.mongoUrl) { + throw new Errors.MoleculerClientError('需要环境变量 MONGO_URL'); + } + + return { + mixins: [BaseDBService], + adapter: new MongooseDbAdapter(config.mongoUrl, { + useNewUrlParser: true, + useUnifiedTopology: true, + }), + model, + actions, + methods, + }; +} diff --git a/server/packages/sdk/src/services/mixins/minio.mixin.ts b/server/packages/sdk/src/services/mixins/minio.mixin.ts new file mode 100644 index 00000000000..c7805fec129 --- /dev/null +++ b/server/packages/sdk/src/services/mixins/minio.mixin.ts @@ -0,0 +1,822 @@ +import { Client as MinioClient, CopyConditions } from 'minio'; +import { isString, isUndefined } from 'ramda-adjunct'; +import { Errors } from 'moleculer'; + +class MinioInitializationError extends Errors.MoleculerError { + /** + * Creates an instance of MinioInitializationError. + * + * @param {String?} message + * @param {Number?} code + * @param {String?} type + * @param {any} data + * + * @memberof MinioInitializationError + */ + constructor( + message = 'Minio can not be initialized', + code = 500, + type = 'MINIO_INITIALIZATION_ERROR', + data = {} + ) { + super(message); + this.code = code; + this.type = type; + this.data = data; + } +} + +class MinioPingError extends Errors.MoleculerRetryableError { + /** + * Creates an instance of MinioPingError. + * + * @param {String?} message + * @param {Number?} code + * @param {String?} type + * @param {any} data + * + * @memberof MinioPingError + */ + constructor( + message = 'Minio Backend not reachable', + code = 502, + type = 'MINIO_PING_ERROR', + data = {} + ) { + super(message); + this.code = code; + this.type = type; + this.data = data; + } +} + +/** + * Service mixin for managing files in a Minio S3 backend + * + * @name moleculer-minio + * @module Service + */ + +export const TcMinioService = { + // Service name + name: 'minio', + + // Default settings + settings: { + /** @type {String} The Hostname minio is running on and available at. Hostname or IP-Address */ + endPoint: undefined, + /** @type {Number} TCP/IP port number minio is listening on. Default value set to 80 for HTTP and 443 for HTTPs.*/ + port: undefined, + /** @type {Boolean?} If set to true, https is used instead of http. Default is true.*/ + useSSL: true, + /** @type {String} The AccessKey to use when connecting to minio */ + accessKey: undefined, + /** @type {String} The SecretKey to use when connecting to minio */ + secretKey: undefined, + /** @type {String?} Set this value to override region cache*/ + region: undefined, + /** @type {String?} Set this value to pass in a custom transport. (Optional)*/ + transport: undefined, + /** @type {String?} Set this value to provide x-amz-security-token (AWS S3 specific). (Optional)*/ + sessionToken: undefined, + /** @type {Number?} This service will perform a periodic healthcheck of Minio. Use this setting to configure the inverval in which the healthcheck is performed. Set to `0` to turn healthcheks of */ + minioHealthCheckInterval: 5000, + + /** + * Path Style: ://// + * Virtual hosted style: ://./ + */ + pathStyle: true, + }, + + methods: { + /** + * Creates and returns a new Minio client + * + * @methods + * + * @returns {Client} + */ + createMinioClient() { + return new MinioClient({ + endPoint: this.settings.endPoint, + port: this.settings.port, + useSSL: this.settings.useSSL, + accessKey: this.settings.accessKey, + secretKey: this.settings.secretKey, + region: this.settings.region, + transport: this.settings.transport, + sessionToken: this.settings.sessionToken, + pathStyle: this.settings.pathStyle, + }); + }, + /** + * Pings the configured minio backend + * + * @param {number} timeout - Amount of miliseconds to wait for a ping response + * @returns {PromiseLike} + */ + ping({ timeout = 5000 } = {}) { + return this.Promise.race([ + this.client.listBuckets().then(() => true), + this.Promise.delay(timeout).then(() => { + throw new MinioPingError(); + }), + ]); + }, + }, + actions: { + /** + * Creates a new Bucket + * + * @actions + * + * @param {string} bucketName - The name of the bucket + * @param {string} region - The region to create the bucket in. Defaults to "us-east-1" + * + * @returns {PromiseLike} + */ + makeBucket: { + params: { + bucketName: { type: 'string' }, + region: { type: 'string', optional: true }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ bucketName, region = '' }) => + this.client.makeBucket(bucketName, region) + ); + }, + }, + /** + * Lists all buckets. + * + * @actions + * + * @returns {PromiseLike} + */ + listBuckets: { + handler() { + return this.client + .listBuckets() + .then((buckets) => (isUndefined(buckets) ? [] : buckets)); + }, + }, + /** + * Checks if a bucket exists. + * + * @actions + * @param {string} bucketName - Name of the bucket + * + * @returns {PromiseLike} + */ + bucketExists: { + params: { + bucketName: { type: 'string' }, + }, + handler(ctx) { + return this.client.bucketExists(ctx.params.bucketName); + }, + }, + /** + * Removes a bucket. + * + * @actions + * @param {string} bucketName - Name of the bucket + * + * @returns {PromiseLike} + */ + removeBucket: { + params: { + bucketName: { type: 'string' }, + }, + handler(ctx) { + return this.client.removeBucket(ctx.params.bucketName); + }, + }, + /** + * Lists all objects in a bucket. + * + * @actions + * @param {string} bucketName - Name of the bucket + * @param {string} prefix - The prefix of the objects that should be listed (optional, default ''). + * @param {boolean} recursive - `true` indicates recursive style listing and false indicates directory style listing delimited by '/'. (optional, default `false`). + * + * @returns {PromiseLike} + */ + listObjects: { + params: { + bucketName: { type: 'string' }, + prefix: { type: 'string', optional: true }, + recursive: { type: 'boolean', optional: true }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ bucketName, prefix = '', recursive = false }) => { + return new this.Promise((resolve, reject) => { + try { + const stream = this.client.listObjects( + bucketName, + prefix, + recursive + ); + const objects = []; + stream.on('data', (el) => objects.push(el)); + stream.on('end', () => resolve(objects)); + stream.on('error', reject); + } catch (e) { + reject(e); + } + }); + } + ); + }, + }, + /** + * Lists all objects in a bucket using S3 listing objects V2 API + * + * @actions + * @param {string} bucketName - Name of the bucket + * @param {string} prefix - The prefix of the objects that should be listed (optional, default ''). + * @param {boolean} recursive - `true` indicates recursive style listing and false indicates directory style listing delimited by '/'. (optional, default `false`). + * @param {string} startAfter - Specifies the object name to start after when listing objects in a bucket. (optional, default ''). + * + * @returns {PromiseLike} + */ + listObjectsV2: { + params: { + bucketName: { type: 'string' }, + prefix: { type: 'string', optional: true }, + recursive: { type: 'boolean', optional: true }, + startAfter: { type: 'string', optional: true }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ bucketName, prefix = '', recursive = false, startAfter = '' }) => { + return new this.Promise((resolve, reject) => { + try { + const stream = this.client.listObjectsV2( + bucketName, + prefix, + recursive, + startAfter + ); + const objects = []; + stream.on('data', (el) => objects.push(el)); + stream.on('end', () => resolve(objects)); + stream.on('error', reject); + } catch (e) { + reject(e); + } + }); + } + ); + }, + }, + /** + * Lists partially uploaded objects in a bucket. + * + * @actions + * @param {string} bucketName - Name of the bucket + * @param {string} prefix - The prefix of the objects that should be listed (optional, default ''). + * @param {boolean} recursive - `true` indicates recursive style listing and false indicates directory style listing delimited by '/'. (optional, default `false`). + * + * @returns {PromiseLike} + */ + listIncompleteUploads: { + params: { + bucketName: { type: 'string' }, + prefix: { type: 'string', optional: true }, + recursive: { type: 'boolean', optional: true }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ bucketName, prefix = '', recursive = false }) => { + return new this.Promise((resolve, reject) => { + try { + const stream = this.client.listIncompleteUploads( + bucketName, + prefix, + recursive + ); + const objects = []; + stream.on('data', (el) => objects.push(el)); + stream.on('end', () => resolve(objects)); + stream.on('error', reject); + } catch (e) { + reject(e); + } + }); + } + ); + }, + }, + /** + * Downloads an object as a stream. + * + * @actions + * @param {string} bucketName - Name of the bucket + * @param {string} objectName - Name of the object. + * + * @returns {PromiseLike} + */ + getObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + }, + handler(ctx) { + return this.client.getObject( + ctx.params.bucketName, + ctx.params.objectName + ); + }, + }, + /** + * Downloads the specified range bytes of an object as a stream. + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * @param {number} offset - `offset` of the object from where the stream will start. + * @param {number} length - `length` of the object that will be read in the stream (optional, if not specified we read the rest of the file from the offset). + * + * @returns {PromiseLike} + */ + getPartialObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + offset: { type: 'number' }, + length: { type: 'number', optional: true }, + }, + handler(ctx) { + return this.client.getPartialObject( + ctx.params.bucketName, + ctx.params.objectName, + ctx.params.offset, + ctx.params.length + ); + }, + }, + /** + * Downloads and saves the object as a file in the local filesystem. + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * @param {string} filePath - Path on the local filesystem to which the object data will be written. + * + * @returns {PromiseLike} + */ + fGetObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + filePath: { type: 'string' }, + }, + handler(ctx) { + return this.client.fGetObject( + ctx.params.bucketName, + ctx.params.objectName, + ctx.params.filePath + ); + }, + }, + /** + * Uploads an object from a stream/Buffer. + * + * @actions + * @param {ReadableStream} params - Readable stream. + * + * @meta + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * @param {number} size - Size of the object (optional). + * @param {object} metaData - metaData of the object (optional). + * + * @returns {PromiseLike} + */ + putObject: { + handler(ctx) { + return this.Promise.resolve({ + stream: ctx.params, + meta: ctx.meta, + }).then(({ stream, meta }) => + this.client.putObject( + meta.bucketName, + meta.objectName, + stream, + meta.size, + meta.metaData + ) + ); + }, + }, + /** + * Uploads contents from a file to objectName. + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * @param {string} filePath - Path of the file to be uploaded. + * @param {object} metaData - metaData of the object (optional). + * + * @returns {PromiseLike} + */ + fPutObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + filePath: { type: 'string' }, + metaData: { type: 'object', optional: true }, + }, + handler(ctx) { + return this.client.fPutObject( + ctx.params.bucketName, + ctx.params.objectName, + ctx.params.filePath, + ctx.params.metaData + ); + }, + }, + /** + * Copy a source object into a new object in the specified bucket. + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * @param {string} sourceObject - Path of the file to be copied. + * @param {object} conditions - Conditions to be satisfied before allowing object copy. + * @param {object} metaData - metaData of the object (optional). + * + * @returns {PromiseLike<{etag: {string}, lastModified: {string}}|Error>} + */ + copyObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + sourceObject: { type: 'string' }, + conditions: { + type: 'object', + properties: { + modified: { type: 'string', optional: true }, + unmodified: { type: 'string', optional: true }, + matchETag: { type: 'string', optional: true }, + matchETagExcept: { type: 'string', optional: true }, + }, + }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ bucketName, objectName, sourceObject, conditions }) => { + const _conditions = new CopyConditions(); + if (conditions.modified) { + _conditions.setModified(new Date(conditions.modified)); + } + if (conditions.unmodified) { + _conditions.setUnmodified(new Date(conditions.unmodified)); + } + if (conditions.matchETag) { + _conditions.setMatchETag(conditions.matchETag); + } + if (conditions.matchETagExcept) { + _conditions.setMatchETagExcept(conditions.matchETagExcept); + } + conditions = _conditions; + return this.client.copyObject( + bucketName, + objectName, + sourceObject, + conditions + ); + } + ); + }, + }, + /** + * Gets metadata of an object. + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * + * @returns {PromiseLike<{size: {number}, metaData: {object}, lastModified: {string}, etag: {string}}|Error>} + */ + statObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + }, + handler(ctx) { + return this.client.statObject( + ctx.params.bucketName, + ctx.params.objectName + ); + }, + }, + /** + * Removes an Object + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * + * @returns {PromiseLike} + */ + removeObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + }, + handler(ctx) { + return this.client.removeObject( + ctx.params.bucketName, + ctx.params.objectName + ); + }, + }, + /** + * Removes a list of Objects + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string[]} objectNames - Names of the objects. + * + * @returns {PromiseLike} + */ + removeObjects: { + params: { + bucketName: { type: 'string' }, + objectNames: { type: 'array', items: 'string' }, + }, + handler(ctx) { + return this.client.removeObjects( + ctx.params.bucketName, + ctx.params.objectNames + ); + }, + }, + /** + * Removes a partially uploaded object. + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * + * @returns {PromiseLike} + */ + removeIncompleteUpload: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ bucketName, objectName }) => + this.client.removeIncompleteUpload(bucketName, objectName) + ); + }, + }, + /** + * Generates a presigned URL for the provided HTTP method, 'httpMethod'. Browsers/Mobile clients may point to this URL to directly download objects even if the bucket is private. This + * presigned URL can have an associated expiration time in seconds after which the URL is no longer valid. The default value is 7 days. + * + * @actions + * @param {string} httpMethod - The HTTP-Method (eg. `GET`). + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * @param {number} expires - Expiry time in seconds. Default value is 7 days. (optional) + * @param {object} reqParams - request parameters. (optional) + * @param {string} requestDate - An ISO date string, the url will be issued at. Default value is now. (optional) + * @returns {PromiseLike} + */ + presignedUrl: { + params: { + httpMethod: { type: 'string' }, + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + expires: { type: 'number', integer: true, optional: true }, + reqParams: { type: 'object', optional: true }, + requestDate: { type: 'string', optional: true }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ + httpMethod, + bucketName, + objectName, + expires, + reqParams, + requestDate, + }) => { + if (isString(requestDate)) { + requestDate = new Date(requestDate); + } + + return new this.Promise((resolve, reject) => { + this.client.presignedUrl( + httpMethod, + bucketName, + objectName, + expires, + reqParams, + requestDate, + (error, url) => { + if (error) { + reject(error); + } else { + resolve(url); + } + } + ); + }); + } + ); + }, + }, + /** + * Generates a presigned URL for HTTP GET operations. Browsers/Mobile clients may point to this URL to directly download objects even if the bucket is private. This presigned URL can have an + * associated expiration time in seconds after which the URL is no longer valid. The default value is 7 days. + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * @param {number} expires - Expiry time in seconds. Default value is 7 days. (optional) + * @param {object} reqParams - request parameters. (optional) + * @param {string} requestDate - An ISO date string, the url will be issued at. Default value is now. (optional) + * @returns {PromiseLike} + */ + presignedGetObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + expires: { type: 'number', integer: true, optional: true }, + reqParams: { type: 'object', optional: true }, + requestDate: { type: 'string', optional: true }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ bucketName, objectName, expires, reqParams, requestDate }) => { + if (isString(requestDate)) { + requestDate = new Date(requestDate); + } + + return new this.Promise((resolve, reject) => { + this.client.presignedGetObject( + bucketName, + objectName, + expires, + reqParams, + requestDate, + (error, url) => { + if (error) { + reject(error); + } else { + resolve(url); + } + } + ); + }); + } + ); + }, + }, + /** + * Generates a presigned URL for HTTP PUT operations. Browsers/Mobile clients may point to this URL to upload objects directly to a bucket even if it is private. This presigned URL can have + * an associated expiration time in seconds after which the URL is no longer valid. The default value is 7 days. + * + * @actions + * @param {string} bucketName - Name of the bucket. + * @param {string} objectName - Name of the object. + * @param {number} expires - Expiry time in seconds. Default value is 7 days. (optional) + * @returns {PromiseLike} + */ + presignedPutObject: { + params: { + bucketName: { type: 'string' }, + objectName: { type: 'string' }, + expires: { type: 'number', integer: true, optional: true }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then( + ({ bucketName, objectName, expires }) => { + return new this.Promise((resolve, reject) => { + this.client.presignedPutObject( + bucketName, + objectName, + expires, + (error, url) => { + if (error) { + reject(error); + } else { + resolve(url); + } + } + ); + }); + } + ); + }, + }, + /** + * Allows setting policy conditions to a presigned URL for POST operations. Policies such as bucket name to receive object uploads, key name prefixes, expiry policy may be set. + * + * @actions + * @param {object} policy - Policy object created by minioClient.newPostPolicy() + * @returns {PromiseLike<{postURL: {string}, formData: {object}}|Error>} + */ + presignedPostPolicy: { + params: { + policy: { + type: 'object', + properties: { + expires: { type: 'string', optional: true }, + key: { type: 'string', optional: true }, + keyStartsWith: { type: 'string', optional: true }, + bucket: { type: 'string', optional: true }, + contentType: { type: 'string', optional: true }, + contentLengthRangeMin: { + type: 'number', + integer: true, + optional: true, + }, + contentLengthRangeMax: { + type: 'number', + integer: true, + optional: true, + }, + }, + }, + }, + handler(ctx) { + return this.Promise.resolve(ctx.params).then(({ policy }) => { + const _policy = this.client.newPostPolicy(); + if (policy.expires) { + _policy.setExpires(new Date(policy.expires)); + } + if (policy.key) { + _policy.setKey(policy.key); + } + if (policy.keyStartsWith) { + _policy.setKeyStartsWith(policy.keyStartsWith); + } + if (policy.bucket) { + _policy.setBucket(policy.bucket); + } + if (policy.contentType) { + _policy.setContentType(policy.contentType); + } + if (policy.contentLengthRangeMin && policy.contentLengthRangeMax) { + _policy.setContentLengthRange( + policy.contentLengthRangeMin, + policy.contentLengthRangeMax + ); + } + return this.client.presignedPostPolicy(_policy); + }); + }, + }, + }, + + /** + * Service created lifecycle event handler. + * Constructs a new minio client entity + */ + created() { + this.client = this.createMinioClient(); + }, + /** + * Service started lifecycle event handler. Resolves when: + * * ping of S3 backend has been successful + * * a healthCheck has been registered, given minioHealthCheckInterval > 0 + * @returns {PromiseLike} + */ + started() { + /* istanbul ignore next */ + return this.Promise.resolve() + .then(() => this.ping()) + .then(() => { + this.settings.minioHealthCheckInterval + ? (this.healthCheckInterval = setInterval( + () => + this.ping().catch((e) => + this.logger.error('Minio backend can not be reached', e) + ), + this.settings.minioHealthCheckInterval + )) + : undefined; + return undefined; + }) + .catch((e) => { + throw new MinioInitializationError(e.message); + }); + }, + /** + * Service stopped lifecycle event handler. + * Removes the healthCheckInterval + */ + stopped() { + this.healthCheckInterval && clearInterval(this.healthCheckInterval); + }, +}; diff --git a/server/packages/sdk/src/services/types.ts b/server/packages/sdk/src/services/types.ts new file mode 100644 index 00000000000..eb790434be7 --- /dev/null +++ b/server/packages/sdk/src/services/types.ts @@ -0,0 +1,68 @@ +import type { Context } from 'moleculer'; +import type { TFunction } from 'i18next'; +import type { GroupStruct } from '../structs/group'; +import type { BuiltinEventMap } from '../structs/events'; + +export type { + ServiceSchema as PureServiceSchema, + Service as PureService, +} from 'moleculer'; + +export interface UserJWTPayload { + _id: string; + nickname: string; + email: string; + avatar: string; +} + +interface TranslationMeta { + t: TFunction; + language: string; +} + +export type PureContext

= Context; + +export interface TcPureContext

+ extends Omit, 'emit'> { + meta: TranslationMeta & M; + + // 事件类型重写 + emit( + eventName: K, + data: K extends keyof BuiltinEventMap ? BuiltinEventMap[K] : unknown, + groups?: string | string[] + ): Promise; + emit(eventName: string): Promise; +} + +export type TcContext

= TcPureContext< + P, + { + user: UserJWTPayload; + token: string; + userId: string; + + /** + * 仅在 socket.io 的请求中会出现 + */ + socketId?: string; + + /** + * 仅在 afterActionHook 请求中会出现 + */ + actionResult?: any; + } & M +>; + +export type GroupBaseInfo = Pick< + GroupStruct, + 'name' | 'avatar' | 'owner' | 'description' +> & { + memberCount: number; + backgroundImage?: string; +}; + +/** + * 面板能力 + */ +export type PanelFeature = 'subscribe'; // 订阅变更,即用户登录时自动加入面板的房间 diff --git a/server/packages/sdk/src/structs/chat.ts b/server/packages/sdk/src/structs/chat.ts new file mode 100644 index 00000000000..cf667275b66 --- /dev/null +++ b/server/packages/sdk/src/structs/chat.ts @@ -0,0 +1,71 @@ +import type { InboxItem } from 'tailchat-types'; + +export interface MessageReactionStruct { + name: string; + author?: string; +} + +export interface MessageStruct { + _id: string; + content: string; + author: string; + groupId?: string; + converseId: string; + hasRecall: boolean; + reactions: MessageReactionStruct[]; +} + +export interface MessageMetaStruct { + mentions?: string[]; + reply?: { + _id: string; + author: string; + content: string; + }; +} + +interface InboxMessageStruct { + /** + * 消息所在群组Id + */ + groupId?: string; + + /** + * 消息所在会话Id + */ + converseId: string; + + /** + * 消息ID + */ + messageId: string; + + /** + * 消息片段,用于消息的预览/发送通知 + */ + messageSnippet: string; +} + +/** + * 收件箱记录项类型 + */ +export interface BasicInboxItem { + _id: string; + userId: string; + type: string; + message?: InboxMessageStruct; + + /** + * 信息体,没有类型 + */ + payload?: object; + + /** + * 是否已读 + */ + readed: boolean; +} + +export type InboxStruct = InboxItem; + +export type { ChatConverse as ChatConverseStruct } from 'tailchat-types'; diff --git a/server/packages/sdk/src/structs/events.ts b/server/packages/sdk/src/structs/events.ts new file mode 100644 index 00000000000..e90f46d3141 --- /dev/null +++ b/server/packages/sdk/src/structs/events.ts @@ -0,0 +1,28 @@ +import type { InboxStruct, MessageMetaStruct } from './chat'; + +/** + * 默认服务的事件映射 + */ +export interface BuiltinEventMap { + 'gateway.auth.addWhitelists': { urls: string[] }; + 'chat.message.updateMessage': + | { + type: 'add'; + groupId?: string; + converseId: string; + messageId: string; + author: string; + content: string; + plain?: string; + meta: MessageMetaStruct; + } + | { + type: 'recall' | 'delete'; + groupId?: string; + converseId: string; + messageId: string; + meta: MessageMetaStruct; + }; + 'config.updated': { config: Record }; + 'chat.inbox.append': InboxStruct; +} diff --git a/server/packages/sdk/src/structs/group.ts b/server/packages/sdk/src/structs/group.ts new file mode 100644 index 00000000000..dbfc3cb122b --- /dev/null +++ b/server/packages/sdk/src/structs/group.ts @@ -0,0 +1,63 @@ +export enum GroupPanelType { + TEXT = 0, + GROUP = 1, + PLUGIN = 2, +} + +// TODO +export type GroupPanelMeta = {}; + +interface GroupMemberStruct { + roles?: string[]; // 角色 + + userId: string; + + muteUntil?: string; +} + +export interface GroupPanelStruct { + id: string; // 在群组中唯一, 可以用任意方式进行生成。这里使用ObjectId, 但不是ObjectId类型 + + name: string; // 用于显示的名称 + + parentId?: string; // 父节点id + + type: GroupPanelType; // 面板类型: Reference: https://discord.com/developers/docs/resources/channel#channel-object-channel-types + + provider?: string; // 面板提供者,为插件的标识,仅面板类型为插件时有效 + + pluginPanelName?: string; // 插件面板名, 如 com.msgbyte.webview/grouppanel + + /** + * 面板的其他数据 + */ + meta?: GroupPanelMeta; +} + +/** + * 群组权限组 + */ +export interface GroupRoleStruct { + name: string; // 权限组名 + permissions: string[]; // 拥有的权限, 是一段字符串 +} + +export interface GroupStruct { + _id: string; + + name: string; + + avatar?: string; + + owner: string; + + description?: string; + + members: GroupMemberStruct[]; + + panels: GroupPanelStruct[]; + + roles?: GroupRoleStruct[]; + + config: Record; +} diff --git a/server/packages/sdk/src/structs/user.ts b/server/packages/sdk/src/structs/user.ts new file mode 100644 index 00000000000..747bfc6be1a --- /dev/null +++ b/server/packages/sdk/src/structs/user.ts @@ -0,0 +1,9 @@ +import type { UserBaseInfo, UserInfoWithToken, UserType } from 'tailchat-types'; +import { userType } from 'tailchat-types'; + +export { + userType, + UserType, + UserBaseInfo as UserStruct, + UserInfoWithToken as UserStructWithToken, +}; diff --git a/server/packages/sdk/src/utils.ts b/server/packages/sdk/src/utils.ts new file mode 100644 index 00000000000..73e6ee2bd0d --- /dev/null +++ b/server/packages/sdk/src/utils.ts @@ -0,0 +1,16 @@ +const noConflictKey = '__'; + +/** + * 因为微服务的名称中经常会有 `.` , 而 `.` 在一些场景(如lodash.set) 有特殊含义,因此增加一个工具用于解决这个问题 + */ +export function encodeNoConflictServiceNameKey(key: string): string { + return key.replaceAll('.', noConflictKey); +} + +export function decodeNoConflictServiceNameKey(key: string): string { + if (typeof key !== 'string') { + return ''; + } + + return key.replaceAll(noConflictKey, '.'); +} diff --git a/server/packages/sdk/tsconfig.json b/server/packages/sdk/tsconfig.json new file mode 100644 index 00000000000..f4c03c7b5a0 --- /dev/null +++ b/server/packages/sdk/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "skipLibCheck": true, + "typeRoots": ["./node_modules/@types"], + "rootDir": "./src", + "outDir": "dist" + }, + "include": ["./src/**/*"], + "exclude": ["node_modules/**/*"] +} diff --git a/server/packages/swagger-jsdoc-generator/package.json b/server/packages/swagger-jsdoc-generator/package.json new file mode 100644 index 00000000000..0bd14f885f1 --- /dev/null +++ b/server/packages/swagger-jsdoc-generator/package.json @@ -0,0 +1,29 @@ +{ + "name": "tailchat-service-swagger-generator", + "private": true, + "version": "1.0.0", + "description": "", + "main": "index.js", + "bin": "./dist/index.js", + "scripts": { + "dev": "tsc --watch", + "prepare": "tsc", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "msgbyte", + "moonrailgun", + "tailchat" + ], + "author": "moonrailgun ", + "license": "MIT", + "dependencies": { + "globby": "11.1.0", + "ts-morph": "^16.0.0", + "ts-node": "^10.9.1" + }, + "devDependencies": { + "@types/node": "^18.11.18", + "typescript": "^4.9.4" + } +} diff --git a/server/packages/swagger-jsdoc-generator/src/index.ts b/server/packages/swagger-jsdoc-generator/src/index.ts new file mode 100644 index 00000000000..3883b5d7243 --- /dev/null +++ b/server/packages/swagger-jsdoc-generator/src/index.ts @@ -0,0 +1,31 @@ +import { Project } from 'ts-morph'; +import path from 'path'; +import globby from 'globby'; +import { processService } from './processService'; + +/** + * https://ts-morph.com/setup/ + */ + +/** + * 扫描服务 + */ +async function scanServices() { + const serviceFiles = await globby('./services/**/*.service.ts'); + + console.time('parse project usage'); + const project = new Project({ + tsConfigFilePath: path.resolve(process.cwd(), './tsconfig.json'), + }); + console.timeEnd('parse project usage'); + + console.time('parse source usage'); + + // 单个测试 + const sourceFile = project.getSourceFileOrThrow(serviceFiles[0]); + processService(sourceFile); + + console.timeEnd('parse source usage'); +} + +scanServices(); diff --git a/server/packages/swagger-jsdoc-generator/src/processService.ts b/server/packages/swagger-jsdoc-generator/src/processService.ts new file mode 100644 index 00000000000..0c5e2fdf352 --- /dev/null +++ b/server/packages/swagger-jsdoc-generator/src/processService.ts @@ -0,0 +1,205 @@ +import { SourceFile, SyntaxKind, TypeReferenceNode } from 'ts-morph'; +import { getMethodParameters } from './utils'; + +/** + * 解析并处理 service 文件, 把所有的 Action 都自动加上jsdoc + */ +export async function processService(sourceFile: SourceFile) { + const serviceNameDeclaration = sourceFile + .getDescendantsOfKind(SyntaxKind.GetAccessor) + .find((item) => item.getSymbol().getName() === 'serviceName'); + + if (!serviceNameDeclaration) { + // 没有定义 serviceName, 不是一个正确的服务,跳过 + return; + } + + // 目前只先视为一个文件只有一个service,不考虑多个 + const serviceName = serviceNameDeclaration + .getFirstDescendantByKind(SyntaxKind.ReturnStatement) + .getExpression() + .asKindOrThrow(SyntaxKind.StringLiteral) + .getLiteralText(); + + console.log('process service:', serviceName); + + const actions = findActionMethods(sourceFile); + + for (const action of actions) { + const jsdocs = action.getJsDocs(); + const len = jsdocs.length; + const lastJsDoc = jsdocs[len - 1]; // 最后一条记录 + if (lastJsDoc && lastJsDoc.getText().includes('@swagger')) { + continue; + } + + const actionName = action.getSymbol().getEscapedName(); + + const requestTypeReferenceNode = action + .getFirstChildByKind(SyntaxKind.Parameter) + .getFirstChildByKind(SyntaxKind.TypeReference); + + const text = generateOpenapiSchemaText( + serviceName, + actionName, + lastJsDoc?.getCommentText().replaceAll('\n', ' ') ?? '', + getPropertySignatureToSwagger(requestTypeReferenceNode) + ); + + if (lastJsDoc) { + // 移除以前的注释 + lastJsDoc.remove(); + } + + // 将之前的描述填写到里面 + action.addJsDoc(text); + } + + await sourceFile.save(); // 将改动保存到原文件中 +} + +/** + * 获取Action方法列表 + */ +function findActionMethods(sourceFile: SourceFile) { + const actions = sourceFile + .getDescendantsOfKind(SyntaxKind.MethodDeclaration) + .filter((item) => { + const parameters = getMethodParameters(item); + if ( + parameters.length === 1 && + ['TcPureContext', 'TcContext'].includes( + parameters[0].getType().getSymbol().getEscapedName() + ) + ) { + return true; + } + + return false; + }); + + return actions; +} + +interface SwaggerParamType { + name: string; + type: 'string' | 'integer' | 'string[]' | 'integer[]'; // https://graphql-faas.github.io/OpenAPI-Specification/versions/2.0.html#data-types +} + +function generateOpenapiSchemaText( + serviceName: string, + actionName: string, + description: string, + requestParams: SwaggerParamType[], + responseParams?: 'boolean' | SwaggerParamType[] +) { + actionName = actionName.replaceAll('.', '/'); + + const responseData = responseParams + ? responseParams === 'boolean' + ? `data: + type: boolean` + : `data: + type: object + properties: + ${generateProperties(responseParams, 4)}` + : ''; + + return `@swagger + +/api/${actionName}/${serviceName}: + post: + tags: + - ${actionName} + description: ${description} + requestBody: + content: + application/json: + schema: + type: object + properties: + ${generateProperties(requestParams, 14)} + responses: + 200: + content: + application/json: + schema: + type: object + properties: + code: + type: integer + example: 200 + message: + type: string + example: ok + ${paddingWithIndent(responseData, 16)} +`; +} + +function generateProperties( + params: SwaggerParamType[], + indent: number +): string { + return paddingWithIndent( + params + .map((p) => { + if (p.type.endsWith('[]')) { + const t = p.type.substring(0, p.type.length - 2); + return `${p.name}: + type: array + items: + type: ${t}`; + } else { + return `${p.name}: + type: ${p.type}`; + } + }) + .join('\n'), + indent + ); +} + +function paddingWithIndent(text: string, indent: number) { + let indentText = ''; + Array.from({ length: indent }).forEach(() => { + indentText += ' '; + }); + + return text.split('\n').join('\n' + indentText); +} + +/** + * 将ts的类型转换为swagger可以认识的类型 + */ +function getPropertySignatureToSwagger( + typeReferenceNode: TypeReferenceNode +): SwaggerParamType[] { + if (!typeReferenceNode) { + return []; + } + + return typeReferenceNode + .getDescendantsOfKind(SyntaxKind.PropertySignature) + .map((item) => { + const name = item.getName(); + const type = item.getType(); + + let typeText: SwaggerParamType['type'] = 'string'; + if (type.isArray()) { + typeText = 'string[]'; + + if (type.isNumber()) { + typeText = 'integer[]'; + } + } else { + if (type.isNumber()) { + typeText = 'integer'; + } + } + + return { + name, + type: typeText, + }; + }); +} diff --git a/server/packages/swagger-jsdoc-generator/src/utils.ts b/server/packages/swagger-jsdoc-generator/src/utils.ts new file mode 100644 index 00000000000..84ae39f5e47 --- /dev/null +++ b/server/packages/swagger-jsdoc-generator/src/utils.ts @@ -0,0 +1,10 @@ +import { MethodDeclaration, ParameterDeclaration, SyntaxKind } from 'ts-morph'; + +/** + * 获取函数参数列表 + */ +export function getMethodParameters( + methodDeclaration: MethodDeclaration +): ParameterDeclaration[] { + return methodDeclaration.getChildrenOfKind(SyntaxKind.Parameter); +} diff --git a/server/packages/swagger-jsdoc-generator/tsconfig.json b/server/packages/swagger-jsdoc-generator/tsconfig.json new file mode 100644 index 00000000000..5138ab83651 --- /dev/null +++ b/server/packages/swagger-jsdoc-generator/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "rootDir": "./src", + "outDir": "./dist", + "typeRoots": ["./node_modules/@types"], + }, + "include": ["./src/**/*"], + "exclude": ["./node_modules/**/*", "./dist/**/*"] +} diff --git a/server/plugins/com.msgbyte.agora/.ministarrc.js b/server/plugins/com.msgbyte.agora/.ministarrc.js new file mode 100644 index 00000000000..76d5d996ae2 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/.ministarrc.js @@ -0,0 +1,57 @@ +const path = require('path'); +const copy = require('rollup-plugin-copy'); +const normalize = require('normalize-path'); +const replace = require('@rollup/plugin-replace'); + +const pluginRoot = path.resolve(__dirname, './web'); +const outDir = path.resolve(__dirname, '../../public'); + +module.exports = { + externalDeps: [ + 'react', + 'react-router', + 'axios', + 'styled-components', + 'zustand', + 'zustand/middleware/immer', + ], + pluginRoot, + outDir, + rollupPlugins: ({ pluginName }) => [ + copy({ + targets: [ + { + src: path.resolve( + pluginRoot, + `./plugins/${pluginName}`, + './assets/**/*' + ), + dest: path.resolve(outDir, `./plugins/${pluginName}/assets/`), + }, + { + src: path.resolve( + pluginRoot, + `./plugins/${pluginName}`, + './docs/**/*' + ), + dest: path.resolve(outDir, `./plugins/${pluginName}/docs/`), + }, + { + src: path.resolve( + pluginRoot, + `./plugins/${pluginName}`, + './README.md' + ), + dest: path.resolve(outDir, `./plugins/${pluginName}/`), + }, + ].map((item) => ({ + // For windows + src: normalize(item.src), + dest: normalize(item.dest, false), + })), + }), + replace({ + 'process.env.NODE_ENV': JSON.stringify('production'), + }), + ], +}; diff --git a/server/plugins/com.msgbyte.agora/models/agora-meeting.ts b/server/plugins/com.msgbyte.agora/models/agora-meeting.ts new file mode 100644 index 00000000000..7475b9a49cc --- /dev/null +++ b/server/plugins/com.msgbyte.agora/models/agora-meeting.ts @@ -0,0 +1,61 @@ +import { db } from 'tailchat-server-sdk'; +const { getModelForClass, prop, modelOptions, TimeStamps } = db; + +@modelOptions({ + options: { + customName: 'p_agora_meeting', + }, +}) +export class AgoraMeeting extends TimeStamps implements db.Base { + _id: db.Types.ObjectId; + id: string; + + @prop() + converseId: string; + + @prop() + groupId?: string; + + @prop() + messageId: string; + + @prop() + channelName: string; + + @prop() + active: boolean; + + /** + * 参会人 + */ + @prop({ + default: [], + }) + members: string[]; + + /** + * 结束时间 + */ + @prop() + endAt?: Date; + + static async findLastestMeetingByConverseId( + this: db.ReturnModelType, + converseId: string + ) { + return this.findOne({ + converseId, + active: true, + }).sort({ + _id: -1, + }); + } +} + +export type AgoraMeetingDocument = db.DocumentType; + +const model = getModelForClass(AgoraMeeting); + +export type AgoraMeetingModel = typeof model; + +export default model; diff --git a/server/plugins/com.msgbyte.agora/package.json b/server/plugins/com.msgbyte.agora/package.json new file mode 100644 index 00000000000..d6af6cb7b39 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/package.json @@ -0,0 +1,24 @@ +{ + "name": "tailchat-plugin-agora", + "version": "1.0.0", + "main": "index.js", + "author": "moonrailgun", + "description": "为Tailchat增加声网音视频通信功能", + "license": "MIT", + "private": true, + "scripts": { + "build:web": "ministar buildPlugin all", + "build:web:watch": "ministar watchPlugin all" + }, + "devDependencies": { + "@rollup/plugin-replace": "^5.0.2", + "@types/react": "18.0.20", + "mini-star": "*", + "normalize-path": "^3.0.0", + "rollup-plugin-copy": "^3.4.0" + }, + "dependencies": { + "got": "11.8.6", + "tailchat-server-sdk": "*" + } +} diff --git a/server/plugins/com.msgbyte.agora/services/agora.service.ts b/server/plugins/com.msgbyte.agora/services/agora.service.ts new file mode 100644 index 00000000000..bc7c074668c --- /dev/null +++ b/server/plugins/com.msgbyte.agora/services/agora.service.ts @@ -0,0 +1,434 @@ +import { + DataNotFoundError, + MessageStruct, + TcContext, + TcPureContext, +} from 'tailchat-server-sdk'; +import { TcService, TcDbService, db } from 'tailchat-server-sdk'; +import type { + AgoraMeetingDocument, + AgoraMeetingModel, +} from '../models/agora-meeting'; +import { RtcTokenBuilder, Role as RtcRole } from './utils/RtcTokenBuilder2'; +import got from 'got'; +import _ from 'lodash'; + +// Reference: https://docs.agora.io/cn/metachat/rtc_channel_management_restfulapi#查询用户列表 +interface ChannelUserListRet { + success: boolean; + data: + | { + channel_exist: false; + } + | { + channel_exist: true; + mode: 1 | 2; + total: number; + users: string[]; // 频道内所有用户的用户 ID + broadcasters: string[]; // 频道内所有主播的用户 ID。该字段仅在直播场景 + audience: string[]; // 频道内观众的用户 ID。最多包含当前频道内前 10,000 名观众的用户 ID。该字段仅在直播场景 (mode 的值为 2)下返回。 + audience_total: number; // 频道内的观众总人数。该字段仅在直播场景 (mode 的值为 2)下返回。 + }; +} + +const noticeCacheKey = 'agora:notice:'; + +/** + * 声网音视频 + * + * 为Tailchat增加声网音视频通信功能 + */ +interface AgoraService + extends TcService, + TcDbService {} +class AgoraService extends TcService { + botUserId: string | undefined; + + get serviceName() { + return 'plugin:com.msgbyte.agora'; + } + + /** + * 声网服务端的appid + */ + get serverAppId() { + return process.env.AGORA_APP_ID; + } + + /** + * 声网服务端的app证书 + */ + get serverAppCertificate() { + return process.env.AGORA_APP_CERT; + } + + /** + * 声网服务端restful的客户 ID + */ + get serverCustomerKey() { + return process.env.AGORA_CUSTOMER_KEY; + } + + /** + * 声网服务端restful的客户 秘钥 + */ + get serverCustomerSecret() { + return process.env.AGORA_CUSTOMER_SECRET; + } + + /** + * 返回服务是否可用 + */ + get serverAvailable(): boolean { + if ( + this.serverAppId && + this.serverAppCertificate && + this.serverCustomerKey && + this.serverCustomerSecret + ) { + return true; + } + + return false; + } + + onInit() { + this.registerAvailableAction(() => this.serverAvailable); + + if (!this.serverAvailable) { + console.warn( + '声网服务启动失败, 缺少必要的环境变量: AGORA_APP_ID, AGORA_APP_CERT, AGORA_CUSTOMER_KEY, AGORA_CUSTOMER_SECRET' + ); + return; + } + this.registerLocalDb(require('../models/agora-meeting').default); + + this.registerAction('generateJoinInfo', this.generateJoinInfo, { + params: { + channelName: 'string', + userId: { type: 'string', optional: true }, + }, + }); + this.registerAction('getChannelUserList', this.getChannelUserList, { + params: { + channelName: 'string', + }, + }); + this.registerAction('webhook', this.webhook, { + params: { + noticeId: 'string', + productId: 'number', + eventType: 'number', + notifyMs: 'number', + payload: 'any', + }, + }); + + this.registerAuthWhitelist(['/webhook']); + } + + protected onInited(): void { + // 确保机器人用户存在, 并记录机器人用户id + this.waitForServices(['user']).then(async () => { + try { + const botUserId = await this.broker.call('user.ensurePluginBot', { + botId: 'agora-meeting', + nickname: 'Agora Bot', + avatar: '{BACKEND}/plugins/com.msgbyte.agora/assets/icon.png', + }); + + this.logger.info('Agora Meeting Bot Id:', botUserId); + + this.botUserId = String(botUserId); + } catch (e) { + this.logger.error(e); + } + }); + } + + generateJoinInfo( + ctx: TcContext<{ + channelName: string; + userId?: string; + }> + ) { + const { channelName } = ctx.params; + const appId = this.serverAppId; + const appCert = this.serverAppCertificate; + + if (!appId || !appCert) { + throw new Error('Agora.io AppId/AppCert not init'); + } + + const role = RtcRole.PUBLISHER; + + const userId = ctx.params.userId ?? ctx.meta.userId; + + const tokenExpirationInSecond = 3600; // 1h + const privilegeExpirationInSecond = 3600; // 1h + + // Build token with user account + const token = RtcTokenBuilder.buildTokenWithUserAccount( + appId, + appCert, + channelName, + userId, + role, + tokenExpirationInSecond, + privilegeExpirationInSecond + ); + + return { appId, token }; + } + + /** + * 获取频道用户列表 + */ + async getChannelUserList( + ctx: TcContext<{ + channelName: string; + }> + ): Promise { + const { channelName } = ctx.params; + + const { data } = await got + .get( + `https://api.agora.io/dev/v1/channel/user/${this.serverAppId}/${channelName}`, + { + headers: this.generateRESTfulHeaders(), + } + ) + .json(); + + if (data.channel_exist === false) { + throw new DataNotFoundError('Channel not exist'); + } + + return data; + } + + /** + * agora服务的回调 + * NOTICE: 暂不支持密钥验证(因为拿不到header) + * Reference: https://docs.agora.io/cn/live-streaming-premium-legacy/rtc_channel_event?platform=RESTful#101-channel-create + */ + async webhook( + ctx: TcContext<{ + noticeId: string; + productId: number; + eventType: number; + notifyMs: number; + payload: any; + }> + ) { + const { eventType, payload, noticeId } = ctx.params; + const { t } = ctx.meta; + const channelName = payload.channelName; + + const valid = await this.checkNoticeValid(noticeId); + if (!valid) { + this.logger.debug('agora notice has been handled'); + return true; + } + + this.logger.info('webhook received', { eventType, payload }); + if (channelName === 'test_webhook') { + // 连通性检查 + return true; + } + + if (eventType === 101) { + // 频道被创建 + const ts = payload.ts; + + const [converseId, groupId] = this.getSourceFromChannelName(channelName); + + const existedMeeting = + await this.adapter.model.findLastestMeetingByConverseId(converseId); + if (existedMeeting) { + // 已经创建了,则跳过 + return; + } + + const message = await this.sendPluginBotMessage(ctx, { + converseId, + groupId, + content: t('本频道开启了通话'), + }); + const messageId = String(message._id); + + const meeting = await this.adapter.model.create({ + channelName, + converseId, + groupId, + messageId, + active: true, + createdAt: new Date(ts * 1000), + }); + + this.roomcastNotify(ctx, converseId, 'agoraChannelCreate', { + converseId, + groupId, + meetingId: String(meeting._id), + }); + } else if (eventType === 102) { + // 频道被销毁 + const ts = payload.ts; + + const [converseId, groupId] = this.getSourceFromChannelName(channelName); + + const meeting = await this.adapter.model.findLastestMeetingByConverseId( + converseId + ); + if (!meeting) { + // 会议不存在,直接跳过 + return; + } + + meeting.active = false; + meeting.endAt = new Date(ts * 1000); + await meeting.save(); + this.roomcastNotify(ctx, converseId, 'agoraChannelDestroy', { + converseId, + groupId, + meetingId: String(meeting._id), + }); + + const duration = + new Date(meeting.endAt).valueOf() - + new Date(meeting.createdAt).valueOf(); + + this.sendPluginBotMessage(ctx, { + converseId, + groupId, + content: t('通话已结束, 时长: {{num}}分钟', { + num: Math.round(duration / 1000 / 60), + }), + }); + } else if (eventType === 103) { + // 用户加入 + const { channelName, uid: userId } = payload; + const [converseId, groupId] = this.getSourceFromChannelName(channelName); + + const meeting = await this.adapter.model.findLastestMeetingByConverseId( + converseId + ); + if (!meeting) { + return; + } + meeting.members = _.uniq([...meeting.members, userId]); + await meeting.save(); + + this.roomcastNotify(ctx, converseId, 'agoraBroadcasterJoin', { + converseId, + groupId, + meetingId: String(meeting._id), + userId, + }); + } else if (eventType === 104) { + // 用户离开 + const { channelName, uid } = payload; + const [converseId, groupId] = this.getSourceFromChannelName(channelName); + + const meeting = await this.adapter.model.findLastestMeetingByConverseId( + converseId + ); + if (!meeting) { + return; + } + + this.roomcastNotify(ctx, converseId, 'agoraBroadcasterLeave', { + converseId, + groupId, + meetingId: String(meeting._id), + userId: uid, + }); + } + } + + /** + * 生成restful api需要的请求头 + */ + private generateRESTfulHeaders() { + const encodedCredential = Buffer.from( + this.serverCustomerKey + ':' + this.serverCustomerSecret + ).toString('base64'); + + return { + Authorization: 'Basic ' + encodedCredential, + 'Content-Type': 'application/json', + }; + } + + /** + * NOTICE: 这里不用每次唯一的ChannelName是期望设计是会话维度的,即可以重复使用 + */ + private getSourceFromChannelName( + channelName: string + ): [string, string | undefined] { + if (!channelName) { + this.logger.error('channel name invalid', channelName); + throw new Error('channel name invalid'); + } + + const [groupId, converseId] = channelName.split('|'); + if (!db.Types.ObjectId.isValid(converseId)) { + this.logger.error('converseId invalid:', converseId); + throw new Error('converseId invalid'); + } + + if (groupId === 'personal') { + return [converseId, undefined]; + } else { + if (!db.Types.ObjectId.isValid(groupId)) { + this.logger.error('groupId invalid:', groupId); + throw new Error('groupId invalid'); + } + + return [converseId, groupId]; + } + } + + private async checkNoticeValid(noticeId: string) { + const key = noticeCacheKey + noticeId; + const v = await this.broker.cacher.get(key); + if (v) { + return false; + } + + await this.broker.cacher.set(key, '1', 60 * 10); // 1分钟 + + return true; + } + + private async sendPluginBotMessage( + ctx: TcPureContext, + messagePayload: { + converseId: string; + groupId?: string; + content: string; + meta?: any; + } + ): Promise { + if (!this.botUserId) { + this.logger.warn('机器人尚未初始化,无法发送插件消息'); + return; + } + + const res = await ctx.call( + 'chat.message.sendMessage', + { + ...messagePayload, + }, + { + meta: { + userId: this.botUserId, + }, + } + ); + + return res as MessageStruct; + } +} + +export default AgoraService; diff --git a/server/plugins/com.msgbyte.agora/services/utils/AccessToken2.ts b/server/plugins/com.msgbyte.agora/services/utils/AccessToken2.ts new file mode 100644 index 00000000000..f8e4de608af --- /dev/null +++ b/server/plugins/com.msgbyte.agora/services/utils/AccessToken2.ts @@ -0,0 +1,452 @@ +import crypto from 'crypto'; +import zlib from 'zlib'; +const VERSION_LENGTH = 3; +const APP_ID_LENGTH = 32; + +const getVersion = () => { + return '007'; +}; + +class Service { + __type; + __privileges; + + constructor(service_type) { + this.__type = service_type; + this.__privileges = {}; + } + + __pack_type() { + const buf = new ByteBuf(); + buf.putUint16(this.__type); + return buf.pack(); + } + + __pack_privileges() { + const buf = new ByteBuf(); + buf.putTreeMapUInt32(this.__privileges); + return buf.pack(); + } + + service_type() { + return this.__type; + } + + add_privilege(privilege, expire) { + this.__privileges[privilege] = expire; + } + + pack() { + return Buffer.concat([this.__pack_type(), this.__pack_privileges()]); + } + + unpack(buffer) { + const bufReader = new ReadByteBuf(buffer); + this.__privileges = bufReader.getTreeMapUInt32(); + return bufReader; + } +} + +const kRtcServiceType = 1; + +class ServiceRtc extends Service { + static kPrivilegeJoinChannel = 1; + static kPrivilegePublishAudioStream = 2; + static kPrivilegePublishVideoStream = 3; + static kPrivilegePublishDataStream = 4; + + __channel_name; + __uid; + + constructor(channel_name, uid) { + super(kRtcServiceType); + this.__channel_name = channel_name; + this.__uid = uid === 0 ? '' : `${uid}`; + } + + pack() { + const buffer = new ByteBuf(); + buffer.putString(this.__channel_name).putString(this.__uid); + return Buffer.concat([super.pack(), buffer.pack()]); + } + + unpack(buffer) { + const bufReader = super.unpack(buffer); + this.__channel_name = bufReader.getString(); + this.__uid = bufReader.getString(); + return bufReader; + } +} + +const kRtmServiceType = 2; + +class ServiceRtm extends Service { + __user_id; + + constructor(user_id) { + super(kRtmServiceType); + this.__user_id = user_id || ''; + } + + pack() { + const buffer = new ByteBuf(); + buffer.putString(this.__user_id); + return Buffer.concat([super.pack(), buffer.pack()]); + } + + unpack(buffer) { + const bufReader = super.unpack(buffer); + this.__user_id = bufReader.getString(); + return bufReader; + } +} + +(ServiceRtm as any).kPrivilegeLogin = 1; + +const kFpaServiceType = 4; + +class ServiceFpa extends Service { + constructor() { + super(kFpaServiceType); + } + + pack() { + return super.pack(); + } + + unpack(buffer) { + const bufReader = super.unpack(buffer); + return bufReader; + } +} + +(ServiceFpa as any).kPrivilegeLogin = 1; + +const kChatServiceType = 5; + +class ServiceChat extends Service { + __user_id; + + constructor(user_id) { + super(kChatServiceType); + this.__user_id = user_id || ''; + } + + pack() { + const buffer = new ByteBuf(); + buffer.putString(this.__user_id); + return Buffer.concat([super.pack(), buffer.pack()]); + } + + unpack(buffer) { + const bufReader = super.unpack(buffer); + this.__user_id = bufReader.getString(); + return bufReader; + } +} + +(ServiceChat as any).kPrivilegeUser = 1; +(ServiceChat as any).kPrivilegeApp = 2; + +const kEducationServiceType = 7; + +class ServiceEducation extends Service { + __room_uuid; + __user_uuid; + __role; + + constructor(roomUuid, userUuid, role) { + super(kEducationServiceType); + this.__room_uuid = roomUuid || ''; + this.__user_uuid = userUuid || ''; + this.__role = role || -1; + } + + pack() { + const buffer = new ByteBuf(); + buffer.putString(this.__room_uuid); + buffer.putString(this.__user_uuid); + buffer.putInt16(this.__role); + return Buffer.concat([super.pack(), buffer.pack()]); + } + + unpack(buffer) { + const bufReader = super.unpack(buffer); + this.__room_uuid = bufReader.getString(); + this.__user_uuid = bufReader.getString(); + this.__role = bufReader.getInt16(); + return bufReader; + } +} + +(ServiceEducation as any).PRIVILEGE_ROOM_USER = 1; +(ServiceEducation as any).PRIVILEGE_USER = 2; +(ServiceEducation as any).PRIVILEGE_APP = 3; + +class AccessToken2 { + appId; + appCertificate; + issueTs; + expire; + salt; + services; + + constructor(appId, appCertificate, issueTs, expire) { + this.appId = appId; + this.appCertificate = appCertificate; + this.issueTs = issueTs || new Date().getTime() / 1000; + this.expire = expire; + // salt ranges in (1, 99999999) + this.salt = Math.floor(Math.random() * 99999999) + 1; + this.services = {}; + } + + __signing() { + let signing = encodeHMac( + new ByteBuf().putUint32(this.issueTs).pack(), + this.appCertificate + ); + signing = encodeHMac(new ByteBuf().putUint32(this.salt).pack(), signing); + return signing; + } + + __build_check() { + const is_uuid = (data) => { + if (data.length !== APP_ID_LENGTH) { + return false; + } + const buf = Buffer.from(data, 'hex'); + return !!buf; + }; + + const { appId, appCertificate, services } = this; + if (!is_uuid(appId) || !is_uuid(appCertificate)) { + return false; + } + + if (Object.keys(services).length === 0) { + return false; + } + return true; + } + + add_service(service) { + this.services[service.service_type()] = service; + } + + build() { + if (!this.__build_check()) { + return ''; + } + + const signing = this.__signing(); + let signing_info = new ByteBuf() + .putString(this.appId) + .putUint32(this.issueTs) + .putUint32(this.expire) + .putUint32(this.salt) + .putUint16(Object.keys(this.services).length) + .pack(); + Object.values(this.services).forEach((service: any) => { + signing_info = Buffer.concat([signing_info, service.pack()]); + }); + + const signature = encodeHMac(signing, signing_info); + const content = Buffer.concat([ + new ByteBuf().putString(signature).pack(), + signing_info, + ]); + const compressed = zlib.deflateSync(content); + return `${getVersion()}${Buffer.from(compressed).toString('base64')}`; + } + + from_string(origin_token) { + const origin_version = origin_token.substring(0, VERSION_LENGTH); + if (origin_version !== getVersion()) { + return false; + } + + const origin_content = origin_token.substring( + VERSION_LENGTH, + origin_token.length + ); + const buffer = zlib.inflateSync(new Buffer(origin_content, 'base64')); + const bufferReader = new ReadByteBuf(buffer); + + const signature = bufferReader.getString(); + this.appId = bufferReader.getString(); + this.issueTs = bufferReader.getUint32(); + this.expire = bufferReader.getUint32(); + this.salt = bufferReader.getUint32(); + const service_count = bufferReader.getUint16(); + + let remainBuf = bufferReader.pack(); + for (let i = 0; i < service_count; i++) { + const bufferReaderService = new ReadByteBuf(remainBuf); + const service_type = bufferReaderService.getUint16(); + const service = new (AccessToken2 as any).kServices[service_type](); + remainBuf = service.unpack(bufferReaderService.pack()).pack(); + this.services[service_type] = service; + } + } +} + +const encodeHMac: any = function (key, message) { + return crypto.createHmac('sha256', key).update(message).digest(); +}; + +const ByteBuf: any = function () { + const that: any = { + buffer: Buffer.alloc(1024), + position: 0, + }; + + that.buffer.fill(0); + + that.pack = function () { + const out = Buffer.alloc(that.position); + that.buffer.copy(out, 0, 0, out.length); + return out; + }; + + that.putUint16 = function (v) { + that.buffer.writeUInt16LE(v, that.position); + that.position += 2; + return that; + }; + + that.putUint32 = function (v) { + that.buffer.writeUInt32LE(v, that.position); + that.position += 4; + return that; + }; + that.putInt32 = function (v) { + that.buffer.writeInt32LE(v, that.position); + that.position += 4; + return that; + }; + + that.putInt16 = function (v) { + that.buffer.writeInt16LE(v, that.position); + that.position += 2; + return that; + }; + + that.putBytes = function (bytes) { + that.putUint16(bytes.length); + bytes.copy(that.buffer, that.position); + that.position += bytes.length; + return that; + }; + + that.putString = function (str) { + return that.putBytes(Buffer.from(str)); + }; + + that.putTreeMap = function (map) { + if (!map) { + that.putUint16(0); + return that; + } + + that.putUint16(Object.keys(map).length); + for (const key in map) { + that.putUint16(key); + that.putString(map[key]); + } + + return that; + }; + + that.putTreeMapUInt32 = function (map) { + if (!map) { + that.putUint16(0); + return that; + } + + that.putUint16(Object.keys(map).length); + for (const key in map) { + that.putUint16(key); + that.putUint32(map[key]); + } + + return that; + }; + + return that; +}; + +const ReadByteBuf: any = function (bytes) { + const that: any = { + buffer: bytes, + position: 0, + }; + + that.getUint16 = function () { + const ret = that.buffer.readUInt16LE(that.position); + that.position += 2; + return ret; + }; + + that.getUint32 = function () { + const ret = that.buffer.readUInt32LE(that.position); + that.position += 4; + return ret; + }; + + that.getInt16 = function () { + const ret = that.buffer.readUInt16LE(that.position); + that.position += 2; + return ret; + }; + + that.getString = function () { + const len = that.getUint16(); + + const out = Buffer.alloc(len); + that.buffer.copy(out, 0, that.position, that.position + len); + that.position += len; + return out; + }; + + that.getTreeMapUInt32 = function () { + const map = {}; + const len = that.getUint16(); + for (let i = 0; i < len; i++) { + const key = that.getUint16(); + const value = that.getUint32(); + map[key] = value; + } + return map; + }; + + that.pack = function () { + const length = that.buffer.length; + const out = Buffer.alloc(length); + that.buffer.copy(out, 0, that.position, length); + return out; + }; + + return that; +}; + +(AccessToken2 as any).kServices = {}; +(AccessToken2 as any).kServices[kRtcServiceType] = ServiceRtc; +(AccessToken2 as any).kServices[kRtmServiceType] = ServiceRtm; +(AccessToken2 as any).kServices[kFpaServiceType] = ServiceFpa; +(AccessToken2 as any).kServices[kChatServiceType] = ServiceChat; +(AccessToken2 as any).kServices[kEducationServiceType] = ServiceEducation; + +export { + AccessToken2, + ServiceRtc, + ServiceRtm, + ServiceFpa, + ServiceChat, + ServiceEducation, + kRtcServiceType, + kRtmServiceType, + kFpaServiceType, + kChatServiceType, + kEducationServiceType, +}; diff --git a/server/plugins/com.msgbyte.agora/services/utils/README.md b/server/plugins/com.msgbyte.agora/services/utils/README.md new file mode 100644 index 00000000000..1ef5bf52e08 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/services/utils/README.md @@ -0,0 +1 @@ +Copy from https://github.com/AgoraIO/Tools/tree/master/DynamicKey/AgoraDynamicKey/nodejs diff --git a/server/plugins/com.msgbyte.agora/services/utils/RtcTokenBuilder2.ts b/server/plugins/com.msgbyte.agora/services/utils/RtcTokenBuilder2.ts new file mode 100644 index 00000000000..1e7c1efc45d --- /dev/null +++ b/server/plugins/com.msgbyte.agora/services/utils/RtcTokenBuilder2.ts @@ -0,0 +1,266 @@ +import { AccessToken2 as AccessToken, ServiceRtc } from './AccessToken2'; + +export const Role = { + // for live broadcaster + PUBLISHER: 1, + + // default, for live audience + SUBSCRIBER: 2, +}; + +export class RtcTokenBuilder { + /** + * Builds an RTC token using an Integer uid. + * @param {*} appId The App ID issued to you by Agora. + * @param {*} appCertificate Certificate of the application that you registered in the Agora Dashboard. + * @param {*} channelName The unique channel name for the AgoraRTC session in the string format. The string length must be less than 64 bytes. Supported character scopes are: + * - The 26 lowercase English letters: a to z. + * - The 26 uppercase English letters: A to Z. + * - The 10 digits: 0 to 9. + * - The space. + * - "!", "#", "$", "%", "&", "(", ")", "+", "-", ":", ";", "<", "=", ".", ">", "?", "@", "[", "]", "^", "_", " {", "}", "|", "~", ",". + * @param {*} uid User ID. A 32-bit unsigned integer with a value ranging from 1 to (2^32-1). + * @param {*} role See #userRole. + * - Role.PUBLISHER; RECOMMENDED. Use this role for a voice/video call or a live broadcast. + * - Role.SUBSCRIBER: ONLY use this role if your live-broadcast scenario requires authentication for [Hosting-in](https://docs.agora.io/en/Agora%20Platform/terms?platform=All%20Platforms#hosting-in). In order for this role to take effect, please contact our support team to enable authentication for Hosting-in for you. Otherwise, Role_Subscriber still has the same privileges as Role_Publisher. + * @param {*} token_expire epresented by the number of seconds elapsed since now. If, for example, you want to access the Agora Service within 10 minutes after the token is generated, set token_expire as 600(seconds) + * @param {*} privilege_expire represented by the number of seconds elapsed since now. If, for example, you want to enable your privilege for 10 minutes, set privilege_expire as 600(seconds). * @return The new Token. + */ + static buildTokenWithUid( + appId, + appCertificate, + channelName, + uid, + role, + token_expire, + privilege_expire = 0 + ) { + return this.buildTokenWithUserAccount( + appId, + appCertificate, + channelName, + uid, + role, + token_expire, + privilege_expire + ); + } + + /** + * Builds an RTC token using an Integer uid. + * @param {*} appId The App ID issued to you by Agora. + * @param {*} appCertificate Certificate of the application that you registered in the Agora Dashboard. + * @param {*} channelName The unique channel name for the AgoraRTC session in the string format. The string length must be less than 64 bytes. Supported character scopes are: + * - The 26 lowercase English letters: a to z. + * - The 26 uppercase English letters: A to Z. + * - The 10 digits: 0 to 9. + * - The space. + * - "!", "#", "$", "%", "&", "(", ")", "+", "-", ":", ";", "<", "=", ".", ">", "?", "@", "[", "]", "^", "_", " {", "}", "|", "~", ",". + * @param {*} account The user account. + * @param {*} role See #userRole. + * - Role.PUBLISHER; RECOMMENDED. Use this role for a voice/video call or a live broadcast. + * - Role.SUBSCRIBER: ONLY use this role if your live-broadcast scenario requires authentication for [Hosting-in](https://docs.agora.io/en/Agora%20Platform/terms?platform=All%20Platforms#hosting-in). In order for this role to take effect, please contact our support team to enable authentication for Hosting-in for you. Otherwise, Role_Subscriber still has the same privileges as Role_Publisher. + * @param {*} token_expire epresented by the number of seconds elapsed since now. If, for example, you want to access the Agora Service within 10 minutes after the token is generated, set token_expire as 600(seconds) + * @param {*} privilege_expire represented by the number of seconds elapsed since now. If, for example, you want to enable your privilege for 10 minutes, set privilege_expire as 600(seconds). + * @return The new Token. + */ + static buildTokenWithUserAccount( + appId, + appCertificate, + channelName, + account, + role, + token_expire, + privilege_expire = 0 + ) { + const token = new AccessToken(appId, appCertificate, 0, token_expire); + + const serviceRtc = new ServiceRtc(channelName, account); + serviceRtc.add_privilege( + ServiceRtc.kPrivilegeJoinChannel, + privilege_expire + ); + if (role == Role.PUBLISHER) { + serviceRtc.add_privilege( + ServiceRtc.kPrivilegePublishAudioStream, + privilege_expire + ); + serviceRtc.add_privilege( + ServiceRtc.kPrivilegePublishVideoStream, + privilege_expire + ); + serviceRtc.add_privilege( + ServiceRtc.kPrivilegePublishDataStream, + privilege_expire + ); + } + token.add_service(serviceRtc); + + return token.build(); + } + + /** + * Generates an RTC token with the specified privilege. + * + * This method supports generating a token with the following privileges: + * - Joining an RTC channel. + * - Publishing audio in an RTC channel. + * - Publishing video in an RTC channel. + * - Publishing data streams in an RTC channel. + * + * The privileges for publishing audio, video, and data streams in an RTC channel apply only if you have + * enabled co-host authentication. + * + * A user can have multiple privileges. Each privilege is valid for a maximum of 24 hours. + * The SDK triggers the onTokenPrivilegeWillExpire and onRequestToken callbacks when the token is about to expire + * or has expired. The callbacks do not report the specific privilege affected, and you need to maintain + * the respective timestamp for each privilege in your app logic. After receiving the callback, you need + * to generate a new token, and then call renewToken to pass the new token to the SDK, or call joinChannel to re-join + * the channel. + * + * @note + * Agora recommends setting a reasonable timestamp for each privilege according to your scenario. + * Suppose the expiration timestamp for joining the channel is set earlier than that for publishing audio. + * When the token for joining the channel expires, the user is immediately kicked off the RTC channel + * and cannot publish any audio stream, even though the timestamp for publishing audio has not expired. + * + * @param appId The App ID of your Agora project. + * @param appCertificate The App Certificate of your Agora project. + * @param channelName The unique channel name for the Agora RTC session in string format. The string length must be less than 64 bytes. The channel name may contain the following characters: + * - All lowercase English letters: a to z. + * - All uppercase English letters: A to Z. + * - All numeric characters: 0 to 9. + * - The space character. + * - "!", "#", "$", "%", "&", "(", ")", "+", "-", ":", ";", "<", "=", ".", ">", "?", "@", "[", "]", "^", "_", " {", "}", "|", "~", ",". + * @param uid The user ID. A 32-bit unsigned integer with a value range from 1 to (2^32 - 1). It must be unique. Set uid as 0, if you do not want to authenticate the user ID, that is, any uid from the app client can join the channel. + * @param tokenExpire represented by the number of seconds elapsed since now. If, for example, you want to access the + * Agora Service within 10 minutes after the token is generated, set token_expire as 600(seconds). + * @param joinChannelPrivilegeExpire The Unix timestamp when the privilege for joining the channel expires, represented + * by the sum of the current timestamp plus the valid time period of the token. For example, if you set joinChannelPrivilegeExpire as the + * current timestamp plus 600 seconds, the token expires in 10 minutes. + * @param pubAudioPrivilegeExpire The Unix timestamp when the privilege for publishing audio expires, represented + * by the sum of the current timestamp plus the valid time period of the token. For example, if you set pubAudioPrivilegeExpire as the + * current timestamp plus 600 seconds, the token expires in 10 minutes. If you do not want to enable this privilege, + * set pubAudioPrivilegeExpire as the current Unix timestamp. + * @param pubVideoPrivilegeExpire The Unix timestamp when the privilege for publishing video expires, represented + * by the sum of the current timestamp plus the valid time period of the token. For example, if you set pubVideoPrivilegeExpire as the + * current timestamp plus 600 seconds, the token expires in 10 minutes. If you do not want to enable this privilege, + * set pubVideoPrivilegeExpire as the current Unix timestamp. + * @param pubDataStreamPrivilegeExpire The Unix timestamp when the privilege for publishing data streams expires, represented + * by the sum of the current timestamp plus the valid time period of the token. For example, if you set pubDataStreamPrivilegeExpire as the + * current timestamp plus 600 seconds, the token expires in 10 minutes. If you do not want to enable this privilege, + * set pubDataStreamPrivilegeExpire as the current Unix timestamp. + * @return The new Token + */ + static buildTokenWithUidAndPrivilege( + appId, + appCertificate, + channelName, + uid, + tokenExpire, + joinChannelPrivilegeExpire, + pubAudioPrivilegeExpire, + pubVideoPrivilegeExpire, + pubDataStreamPrivilegeExpire + ) { + return this.BuildTokenWithUserAccountAndPrivilege( + appId, + appCertificate, + channelName, + uid, + tokenExpire, + joinChannelPrivilegeExpire, + pubAudioPrivilegeExpire, + pubVideoPrivilegeExpire, + pubDataStreamPrivilegeExpire + ); + } + + /** + * Generates an RTC token with the specified privilege. + * + * This method supports generating a token with the following privileges: + * - Joining an RTC channel. + * - Publishing audio in an RTC channel. + * - Publishing video in an RTC channel. + * - Publishing data streams in an RTC channel. + * + * The privileges for publishing audio, video, and data streams in an RTC channel apply only if you have + * enabled co-host authentication. + * + * A user can have multiple privileges. Each privilege is valid for a maximum of 24 hours. + * The SDK triggers the onTokenPrivilegeWillExpire and onRequestToken callbacks when the token is about to expire + * or has expired. The callbacks do not report the specific privilege affected, and you need to maintain + * the respective timestamp for each privilege in your app logic. After receiving the callback, you need + * to generate a new token, and then call renewToken to pass the new token to the SDK, or call joinChannel to re-join + * the channel. + * + * @note + * Agora recommends setting a reasonable timestamp for each privilege according to your scenario. + * Suppose the expiration timestamp for joining the channel is set earlier than that for publishing audio. + * When the token for joining the channel expires, the user is immediately kicked off the RTC channel + * and cannot publish any audio stream, even though the timestamp for publishing audio has not expired. + * + * @param appId The App ID of your Agora project. + * @param appCertificate The App Certificate of your Agora project. + * @param channelName The unique channel name for the Agora RTC session in string format. The string length must be less than 64 bytes. The channel name may contain the following characters: + * - All lowercase English letters: a to z. + * - All uppercase English letters: A to Z. + * - All numeric characters: 0 to 9. + * - The space character. + * - "!", "#", "$", "%", "&", "(", ")", "+", "-", ":", ";", "<", "=", ".", ">", "?", "@", "[", "]", "^", "_", " {", "}", "|", "~", ",". + * @param userAccount The user account. + * @param tokenExpire represented by the number of seconds elapsed since now. If, for example, you want to access the + * Agora Service within 10 minutes after the token is generated, set token_expire as 600(seconds). + * @param joinChannelPrivilegeExpire The Unix timestamp when the privilege for joining the channel expires, represented + * by the sum of the current timestamp plus the valid time period of the token. For example, if you set joinChannelPrivilegeExpire as the + * current timestamp plus 600 seconds, the token expires in 10 minutes. + * @param pubAudioPrivilegeExpire The Unix timestamp when the privilege for publishing audio expires, represented + * by the sum of the current timestamp plus the valid time period of the token. For example, if you set pubAudioPrivilegeExpire as the + * current timestamp plus 600 seconds, the token expires in 10 minutes. If you do not want to enable this privilege, + * set pubAudioPrivilegeExpire as the current Unix timestamp. + * @param pubVideoPrivilegeExpire The Unix timestamp when the privilege for publishing video expires, represented + * by the sum of the current timestamp plus the valid time period of the token. For example, if you set pubVideoPrivilegeExpire as the + * current timestamp plus 600 seconds, the token expires in 10 minutes. If you do not want to enable this privilege, + * set pubVideoPrivilegeExpire as the current Unix timestamp. + * @param pubDataStreamPrivilegeExpire The Unix timestamp when the privilege for publishing data streams expires, represented + * by the sum of the current timestamp plus the valid time period of the token. For example, if you set pubDataStreamPrivilegeExpire as the + * current timestamp plus 600 seconds, the token expires in 10 minutes. If you do not want to enable this privilege, + * set pubDataStreamPrivilegeExpire as the current Unix timestamp. + * @return The new Token. + */ + static BuildTokenWithUserAccountAndPrivilege( + appId, + appCertificate, + channelName, + account, + tokenExpire, + joinChannelPrivilegeExpire, + pubAudioPrivilegeExpire, + pubVideoPrivilegeExpire, + pubDataStreamPrivilegeExpire + ) { + const token = new AccessToken(appId, appCertificate, 0, tokenExpire); + + const serviceRtc = new ServiceRtc(channelName, account); + serviceRtc.add_privilege( + ServiceRtc.kPrivilegeJoinChannel, + joinChannelPrivilegeExpire + ); + serviceRtc.add_privilege( + ServiceRtc.kPrivilegePublishAudioStream, + pubAudioPrivilegeExpire + ); + serviceRtc.add_privilege( + ServiceRtc.kPrivilegePublishVideoStream, + pubVideoPrivilegeExpire + ); + serviceRtc.add_privilege( + ServiceRtc.kPrivilegePublishDataStream, + pubDataStreamPrivilegeExpire + ); + token.add_service(serviceRtc); + + return token.build(); + } +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/assets/icon.png b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/assets/icon.png new file mode 100644 index 00000000000..0b93e8b9fb9 Binary files /dev/null and b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/assets/icon.png differ diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/manifest.json b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/manifest.json new file mode 100644 index 00000000000..e3bad16464f --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "Agora", + "label.zh-CN": "声网音视频", + "name": "com.msgbyte.agora", + "url": "{BACKEND}/plugins/com.msgbyte.agora/index.js", + "icon": "{BACKEND}/plugins/com.msgbyte.agora/assets/icon.png", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add the Agora audio and video communication feature to Tailchat", + "description.zh-CN": "为Tailchat增加声网音视频通信功能", + "requireRestart": false +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/package.json b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/package.json new file mode 100644 index 00000000000..4b20679ddcd --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/package.json @@ -0,0 +1,21 @@ +{ + "name": "@plugins/com.msgbyte.agora", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "为Tailchat增加声网音视频通信功能", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": { + "agora-rtc-react": "^1.1.3", + "ahooks": "^3.7.4", + "lodash": "^4.17.21" + }, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6", + "zustand": "^4.3.6" + } +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/Controls.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/Controls.tsx new file mode 100644 index 00000000000..5b545c5efb8 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/Controls.tsx @@ -0,0 +1,122 @@ +import { useAsyncFn } from '@capital/common'; +import { IconBtn } from '@capital/component'; +import { useMemoizedFn } from 'ahooks'; +import React from 'react'; +import { Translate } from '../translate'; +import { + useClient, + createMicrophoneAudioTrack, + createCameraVideoTrack, +} from './client'; +import { useMeetingStore } from './store'; +import { useScreenSharing } from './useScreenSharing'; +import { getClientLocalTrack } from './utils'; + +/** + * 媒体控制器 + */ +export const Controls: React.FC<{ + onClose: () => void; +}> = React.memo((props) => { + const client = useClient(); + const { startScreenSharing, stopScreenSharing } = useScreenSharing(); + const mediaPerm = useMeetingStore((state) => state.mediaPerm); + + const [{ loading }, mute] = useAsyncFn( + useMemoizedFn(async (type: 'audio' | 'video' | 'screensharing') => { + if (type === 'audio') { + if (mediaPerm.audio === true) { + const track = getClientLocalTrack(client, 'audio'); + if (track) { + await client.unpublish(track); + } + } else { + const track = await createMicrophoneAudioTrack(); + await client.publish(track); + } + + useMeetingStore.getState().setMediaPerm({ audio: !mediaPerm.audio }); + } else if (type === 'video') { + if (mediaPerm.video === true) { + const track = getClientLocalTrack(client, 'video'); + if (track) { + await client.unpublish(track); + } + } else { + const track = await createCameraVideoTrack(); + await client.publish(track); + } + + useMeetingStore.getState().setMediaPerm({ video: !mediaPerm.video }); + } else if (type === 'screensharing') { + if (mediaPerm.screensharing === true) { + // 关闭屏幕共享 + await stopScreenSharing(); + } else { + // 开始屏幕共享 + await startScreenSharing(); + } + } + }), + [] + ); + + const leaveChannel = async () => { + await client.leave(); + client.removeAllListeners(); + useMeetingStore.getState().reset(); + // we close the tracks to perform cleanup + client.localTracks.forEach((track) => { + track.close(); + }); + props.onClose(); + }; + + return ( +

+ mute('screensharing')} + /> + + mute('video')} + /> + + mute('audio')} + /> + + +
+ ); +}); +Controls.displayName = 'Controls'; diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/MeetingView.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/MeetingView.tsx new file mode 100644 index 00000000000..1243843332a --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/MeetingView.tsx @@ -0,0 +1,133 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { getJWTUserInfo, isValidStr, showErrorToasts } from '@capital/common'; +import { useClient } from './client'; +import { Videos } from './Videos'; +import { Controls } from './Controls'; +import { LoadingSpinner } from '@capital/component'; +import { useMemoizedFn } from 'ahooks'; +import styled from 'styled-components'; +import { useMeetingStore } from './store'; +import { NetworkStats } from './NetworkStats'; +import _once from 'lodash/once'; +import type { IAgoraRTCClient } from 'agora-rtc-react'; +import { Translate } from '../translate'; +import { request } from '../request'; + +const Root = styled.div` + .body { + flex: 1; + } + + .controller { + text-align: center; + padding: 10px 0; + + * + * { + margin-left: 10px; + } + } +`; + +const enableDualStream = _once((client: IAgoraRTCClient) => { + return client.enableDualStream(); +}); + +export interface MeetingViewProps { + meetingId: string; + onClose: () => void; +} +export const MeetingView: React.FC = React.memo((props) => { + const client = useClient(); + const channelName = props.meetingId; + const [start, setStart] = useState(false); + const initedRef = useRef(false); + + const init = useMemoizedFn(async (channelName: string) => { + const { _id } = await getJWTUserInfo(); + + client.on('user-published', async (user, mediaType) => { + if (String(user.uid).startsWith(_id)) { + // 不监听自身 + return; + } + + await client.subscribe(user, mediaType); + console.log('subscribe success'); + if (mediaType === 'audio') { + user.audioTrack?.play(); + } + + useMeetingStore.getState().updateUserInfo(user); + }); + + client.on('user-unpublished', async (user, mediaType) => { + console.log('unpublished', user, mediaType); + await client.unsubscribe(user, mediaType); + if (mediaType === 'audio') { + user.audioTrack?.stop(); + } + useMeetingStore.getState().updateUserInfo(user); + }); + + client.on('user-joined', (user) => { + console.log('user-joined', user); + useMeetingStore.getState().appendUser(user); + }); + + client.on('user-left', (user) => { + console.log('user-left', user); + useMeetingStore.getState().removeUser(user); + }); + + client.on('volume-indicator', (volumes) => { + useMeetingStore.setState({ + volumes: volumes.map((v) => ({ + uid: String(v.uid), + level: v.level, + })), + }); + }); + + try { + const { _id } = await getJWTUserInfo(); + const { data } = await request.post('generateJoinInfo', { + channelName, + }); + + const { appId, token } = data ?? {}; + + await client.join(appId, channelName, token, _id); + await enableDualStream(client); + client.enableAudioVolumeIndicator(); + setStart(true); + } catch (err) { + showErrorToasts(err); + } + }); + + useEffect(() => { + if (initedRef.current) { + return; + } + + if (isValidStr(channelName)) { + init(channelName); + initedRef.current = true; + } + }, [channelName]); + + return ( + + + +
+ {start ? : } +
+ +
+ +
+
+ ); +}); +MeetingView.displayName = 'MeetingView'; diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/NetworkStats.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/NetworkStats.tsx new file mode 100644 index 00000000000..f0f54fe26f7 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/NetworkStats.tsx @@ -0,0 +1,78 @@ +import { localTrans } from '@capital/common'; +import type { NetworkQuality } from 'agora-rtc-react'; +import React, { useEffect, useState } from 'react'; +import styled from 'styled-components'; +import { Translate } from '../translate'; +import { useClient } from './client'; + +const Root = styled.div` + display: flex; + position: absolute; + padding: 4px 8px; + z-index: 20; + + div + div { + margin-left: 8px; + } +`; + +export const NetworkStats: React.FC = React.memo(() => { + const client = useClient(); + const [stats, setStats] = useState(undefined); + + useEffect(() => { + const cb = (stats: NetworkQuality) => { + setStats(stats); + }; + + client.on('network-quality', cb); + + return () => { + client.off('network-quality', cb); + }; + }, []); + + if (!stats) { + return null; + } + + return ( + +
+ {Translate.uplink}: {parseQualityText(stats.uplinkNetworkQuality)} +
+
+ {Translate.downlink}: {parseQualityText(stats.downlinkNetworkQuality)} +
+
+ ); +}); +NetworkStats.displayName = 'NetworkStats'; + +function parseQualityText(quality: 0 | 1 | 2 | 3 | 4 | 5 | 6) { + if (quality === 1 || quality === 2) { + return localTrans({ + 'zh-CN': '优秀', + 'en-US': 'Good', + }); + } + + if (quality === 3 || quality === 4) { + return localTrans({ + 'zh-CN': '一般', + 'en-US': 'Normal', + }); + } + + if (quality === 5 || quality === 6) { + return localTrans({ + 'zh-CN': '差', + 'en-US': 'Bad', + }); + } + + return localTrans({ + 'zh-CN': '未知', + 'en-US': 'Unknown', + }); +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/SpeakerNames.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/SpeakerNames.tsx new file mode 100644 index 00000000000..79e341ce31c --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/SpeakerNames.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { joinArray } from '@capital/common'; +import { useMeetingStore } from './store'; +import { UserName } from '@capital/component'; +import { Translate } from '../translate'; + +export const SpeakerNames: React.FC = React.memo(() => { + const volumes = useMeetingStore((state) => state.volumes); + const activeUserNames = volumes + .filter((v) => v.level >= 60) + .map((v) => ); + + return ( + + {joinArray(activeUserNames, ',')} + + {activeUserNames.length > 0 + ? ' ' + Translate.isSpeaking + : Translate.nomanSpeaking} + + ); +}); +SpeakerNames.displayName = 'SpeakerNames'; diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/VideoView.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/VideoView.tsx new file mode 100644 index 00000000000..fbe9cc08401 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/VideoView.tsx @@ -0,0 +1,140 @@ +import { Icon, UserAvatar, UserName } from '@capital/component'; +import { AgoraVideoPlayer, IAgoraRTCRemoteUser } from 'agora-rtc-react'; +import React from 'react'; +import styled from 'styled-components'; +import { Translate } from '../translate'; +import { useClient } from './client'; +import { useMeetingStore } from './store'; +import { getClientLocalTrack } from './utils'; + +const Root = styled.div<{ + active?: boolean; +}>` + width: 95%; + height: auto; + position: relative; + background-color: #333; + border-radius: 10px; + aspect-ratio: 16/9; + justify-self: center; + align-self: center; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + + border-width: 3px; + border-color: ${(props) => (props.active ? '#7ab157;' : 'transparent')}; + transition: border-color 0.2s; + + .player { + width: 100%; + height: 100%; + } + + .name { + position: absolute; + left: 0; + bottom: 0; + padding: 4px 8px; + color: white; + background-color: rgba(0, 0, 0, 0.2); + border-radius: 6px; + } + + .screen-icon { + width: 96px; + height: 96px; + font-size: 96px; + } +`; + +/** + * 界面Icon + */ +const VideViewIcon: React.FC<{ uid: string }> = React.memo(({ uid }) => { + if (uid.endsWith('_screen')) { + // 是屏幕共享 + return ( +
+ +
+ ); + } else { + return ; + } +}); +VideViewIcon.displayName = 'VideViewIcon'; + +/** + * 界面名称 + */ +const VideViewName: React.FC<{ uid: string }> = React.memo(({ uid }) => { + if (uid.endsWith('_screen')) { + const userId = uid.substring(0, uid.length - '_screen'.length); + + return ( + + + {Translate.someoneScreenName} + + ); + } else { + return ; + } +}); +VideViewName.displayName = 'VideViewName'; + +export const VideoView: React.FC<{ + user: IAgoraRTCRemoteUser; +}> = (props) => { + const user = props.user; + const active = useVolumeActive(String(user.uid)); + + return ( + + {user.hasVideo && user.videoTrack ? ( + + ) : ( + + )} + + + + ); +}; +VideoView.displayName = 'VideoView'; + +export const OwnVideoView: React.FC<{}> = React.memo(() => { + const client = useClient(); + const mediaPerm = useMeetingStore((state) => state.mediaPerm); + const active = useVolumeActive(String(client.uid)); + + if (!client.uid) { + return null; + } + + const videoTrack = getClientLocalTrack(client, 'video'); + + return ( + + {mediaPerm.video ? ( + + ) : ( + + )} + + + + ); +}); +OwnVideoView.displayName = 'OwnVideoView'; + +function useVolumeActive(uid: string) { + const volume = useMeetingStore((state) => + state.volumes.find((v) => v.uid === uid) + ); + const volumeLevel = volume?.level ?? 0; + + return volumeLevel >= 60; +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/Videos.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/Videos.tsx new file mode 100644 index 00000000000..a649a62ed3a --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/Videos.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import styled from 'styled-components'; +import { useMeetingStore } from './store'; +import { OwnVideoView, VideoView } from './VideoView'; + +const Root = styled.div` + height: 70vh; + overflow: hidden; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(440px, 1fr)); +`; + +export const Videos: React.FC = React.memo(() => { + const users = useMeetingStore((state) => state.users); + + return ( + + + + {users.length > 0 && + users.map((user) => { + return ; + })} + + ); +}); +Videos.displayName = 'Videos'; diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/client.ts b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/client.ts new file mode 100644 index 00000000000..230132594fa --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/client.ts @@ -0,0 +1,14 @@ +import AgoraRTC, { ClientConfig, createClient } from 'agora-rtc-react'; + +const config: ClientConfig = { + mode: 'rtc', + codec: 'vp8', +}; + +export const useClient = createClient(config); +export const createCameraVideoTrack = AgoraRTC.createCameraVideoTrack; +export const createMicrophoneAudioTrack = AgoraRTC.createMicrophoneAudioTrack; + +// 屏幕共享 +export const useScreenSharingClient = createClient(config); +export const createScreenVideoTrack = AgoraRTC.createScreenVideoTrack; diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/index.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/index.tsx new file mode 100644 index 00000000000..d952a5a97c4 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/index.tsx @@ -0,0 +1,37 @@ +import { showToasts } from '@capital/common'; +import { PortalAdd, PortalRemove, Loadable } from '@capital/component'; +import React from 'react'; +import { Translate } from '../translate'; + +const FloatMeetingWindow = Loadable( + () => import('./window').then((module) => module.FloatMeetingWindow), + { + showLoading: true, + } +); + +let currentMeeting: string | null = null; + +/** + * 启动快速会议 + * + * 表现形式是在浏览器内有个小的浮动窗口 + */ +export function startFastMeeting(meetingId: string) { + if (currentMeeting) { + showToasts(Translate.repeatTip); + return; + } + + currentMeeting = meetingId; + + const key = PortalAdd( + { + PortalRemove(key); + currentMeeting = null; + }} + /> + ); +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/store.ts b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/store.ts new file mode 100644 index 00000000000..88a36d16b4c --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/store.ts @@ -0,0 +1,86 @@ +import type { IAgoraRTCRemoteUser } from 'agora-rtc-react'; +import create from 'zustand'; + +interface MediaPerm { + video: boolean; + audio: boolean; + screensharing: boolean; +} + +interface MeetingState { + /** + * 本次会议用户列表 + */ + users: IAgoraRTCRemoteUser[]; + /** + * 本地媒体权限 + */ + mediaPerm: MediaPerm; + /** + * 音量信息 + */ + volumes: { + /** + * 音量, 0~100, 一般认为60以上视为正在发言. + */ + level: number; + uid: string; + }[]; + appendUser: (user: IAgoraRTCRemoteUser) => void; + removeUser: (user: IAgoraRTCRemoteUser) => void; + /** + * 更新用户信息 + */ + updateUserInfo: (user: IAgoraRTCRemoteUser) => void; + setMediaPerm: (perm: Partial) => void; + + reset: () => void; +} + +export const useMeetingStore = create((set) => ({ + users: [], + mediaPerm: { video: false, audio: false, screensharing: false }, + volumes: [], + appendUser: (user: IAgoraRTCRemoteUser) => { + set((state) => ({ + users: [...state.users, user], + })); + }, + removeUser: (user: IAgoraRTCRemoteUser) => { + set((state) => { + return { + users: state.users.filter((_u) => _u.uid !== user.uid), + }; + }); + }, + updateUserInfo: (user: IAgoraRTCRemoteUser) => { + set((state) => { + const users = [...state.users]; + const targetUserIndex = state.users.findIndex((u) => u.uid === user.uid); + if (targetUserIndex === -1) { + return {}; + } + + users[targetUserIndex] = user; + + return { + users, + }; + }); + }, + setMediaPerm: (perm: Partial) => { + set((state) => ({ + mediaPerm: { + ...state.mediaPerm, + ...perm, + }, + })); + }, + + reset: () => { + set({ + users: [], + mediaPerm: { video: false, audio: false }, + }); + }, +})); diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/useScreenSharing.ts b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/useScreenSharing.ts new file mode 100644 index 00000000000..89610413eb1 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/useScreenSharing.ts @@ -0,0 +1,76 @@ +import { getJWTUserInfo } from '@capital/common'; +import type { ILocalVideoTrack } from 'agora-rtc-react'; +import { useMemoizedFn } from 'ahooks'; +import { useEffect } from 'react'; +import { request } from '../request'; +import { + createScreenVideoTrack, + useClient, + useScreenSharingClient, +} from './client'; +import { useMeetingStore } from './store'; + +/** + * 屏幕共享 + */ +export function useScreenSharing() { + const client = useClient(); + const screenSharingClient = useScreenSharingClient(); + + useEffect(() => { + () => { + screenSharingClient.leave(); + }; + }, []); + + const startScreenSharing = useMemoizedFn(async () => { + if (!client.channelName) { + return; + } + + const track = await createScreenVideoTrack( + { + optimizationMode: 'detail', + }, + 'auto' + ); + + let t: ILocalVideoTrack; + if (Array.isArray(track)) { + t = track[0]; + } else { + t = track; + } + t.on('track-ended', () => { + // 画面断开时自动触发停止共享(用户点击停止共享按钮) + stopScreenSharing(); + }); + + const channelName = client.channelName; + const { _id } = await getJWTUserInfo(); + const uid = _id + '_screen'; + const { data } = await request.post('generateJoinInfo', { + channelName, + userId: uid, + }); + + const { appId, token } = data ?? {}; + await screenSharingClient.join(appId, channelName, token, uid); + await screenSharingClient.publish(track); + + useMeetingStore.getState().setMediaPerm({ screensharing: true }); + }); + + const stopScreenSharing = useMemoizedFn(async () => { + screenSharingClient.localTracks.forEach((t) => t.close()); + await screenSharingClient.unpublish(); + await screenSharingClient.leave(); + + useMeetingStore.getState().setMediaPerm({ screensharing: false }); + }); + + return { + startScreenSharing, + stopScreenSharing, + }; +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/utils.ts b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/utils.ts new file mode 100644 index 00000000000..7abe8bbbe51 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/utils.ts @@ -0,0 +1,28 @@ +import type { + IAgoraRTCClient, + ILocalAudioTrack, + ILocalTrack, + ILocalVideoTrack, +} from 'agora-rtc-react'; + +/** + * 获取客户端本地轨道 + */ +export function getClientLocalTrack( + client: IAgoraRTCClient, + trackMediaType: 'video' +): ILocalVideoTrack | null; +export function getClientLocalTrack( + client: IAgoraRTCClient, + trackMediaType: 'audio' +): ILocalAudioTrack | null; +export function getClientLocalTrack( + client: IAgoraRTCClient, + trackMediaType: string +): ILocalTrack | null { + return ( + client.localTracks.find( + (track) => track.trackMediaType === trackMediaType + ) ?? null + ); +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/window.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/window.tsx new file mode 100644 index 00000000000..dec06eccd54 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/FloatWindow/window.tsx @@ -0,0 +1,79 @@ +import React, { useEffect, useState } from 'react'; +import styled from 'styled-components'; +import { Divider, ErrorBoundary } from '@capital/component'; +import { MeetingView, MeetingViewProps } from './MeetingView'; +import { SpeakerNames } from './SpeakerNames'; +import { Translate } from '../translate'; +import { sharedEvent } from '@capital/common'; + +const FloatWindow = styled.div` + z-index: 100; + position: fixed; + background-color: var(--tc-content-background-color); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + left: 0; + right: 0; + top: 0; + min-height: 240px; + transition: all 0.2s ease-in-out; + display: flex; + flex-direction: column; + + .folder-btn-container { + position: absolute; + bottom: -30px; + left: 0; + right: 0; + display: flex; + + > .folder-btn { + background-color: var(--tc-content-background-color); + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); + height: 30px; + line-height: 30px; + cursor: pointer; + border-radius: 0 0 3px 3px; + margin: auto; + display: inline-block; + padding: 0 8px; + } + } +`; + +/** + * 音视频会议弹窗 + */ +export const FloatMeetingWindow: React.FC = React.memo( + (props) => { + const [folder, setFolder] = useState(false); + + useEffect(() => { + sharedEvent.emit('ensureWebRTCPermission'); + }, []); + + return ( + + + + + +
+
setFolder(!folder)}> + + + + + + {folder ? Translate.expand : Translate.foldup} + +
+
+
+ ); + } +); +FloatMeetingWindow.displayName = 'FloatMeetingWindow'; diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/index.tsx b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/index.tsx new file mode 100644 index 00000000000..2472a724637 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/index.tsx @@ -0,0 +1,23 @@ +import { regPluginPanelAction } from '@capital/common'; +import { openConfirmModal } from '@capital/component'; +import { startFastMeeting } from './FloatWindow'; +import { Translate } from './translate'; + +console.log('Plugin 声网音视频 is loaded'); + +// 发起群组会议 +regPluginPanelAction({ + name: 'plugin:com.msgbyte.agora/groupAction', + label: Translate.startCall, + position: 'group', + icon: 'mdi:video-box', + onClick: ({ groupId, panelId }) => { + openConfirmModal({ + title: Translate.startCall, + content: Translate.startCallContent, + onConfirm: async () => { + startFastMeeting(`${groupId}|${panelId}`); + }, + }); + }, +}); diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/request.ts b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/request.ts new file mode 100644 index 00000000000..4809debc78c --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/request.ts @@ -0,0 +1,3 @@ +import { createPluginRequest } from '@capital/common'; + +export const request = createPluginRequest('com.msgbyte.agora'); diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/translate.ts b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/translate.ts new file mode 100644 index 00000000000..7097c750140 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/src/translate.ts @@ -0,0 +1,78 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + uplink: localTrans({ + 'zh-CN': '上行网络', + 'en-US': 'Uplink', + }), + downlink: localTrans({ + 'zh-CN': '下行网络', + 'en-US': 'Downlink', + }), + isSpeaking: localTrans({ + 'zh-CN': '正在发言', + 'en-US': 'is Speaking', + }), + nomanSpeaking: localTrans({ + 'zh-CN': '无人发言', + 'en-US': 'No one Speaking', + }), + startCall: localTrans({ + 'zh-CN': '发起/加入通话', + 'en-US': 'Start/Join Call', + }), + startCallContent: localTrans({ + 'zh-CN': '是否通过声网插件在当前会话开启/加入音视频通讯?', + 'en-US': + 'Do you want to enable audio and video communication in the current session through the Agora plugin?', + }), + expand: localTrans({ + 'zh-CN': '展开', + 'en-US': 'expand', + }), + foldup: localTrans({ + 'zh-CN': '收起', + 'en-US': 'foldup', + }), + joinTip: localTrans({ + 'zh-CN': '正在加入通话...', + 'en-US': 'Joining call...', + }), + repeatTip: localTrans({ + 'zh-CN': '当前已有正在进行中的通话, 请先结束上一场通话', + 'en-US': + 'There is currently an active call, please end the previous call first', + }), + hangUp: localTrans({ + 'zh-CN': '挂断', + 'en-US': 'Hang Up', + }), + openCamera: localTrans({ + 'zh-CN': '开启摄像头', + 'en-US': 'Open Camera', + }), + closeCamera: localTrans({ + 'zh-CN': '关闭摄像头', + 'en-US': 'Close Camera', + }), + openMic: localTrans({ + 'zh-CN': '开启麦克风', + 'en-US': 'Open Mic', + }), + closeMic: localTrans({ + 'zh-CN': '关闭麦克风', + 'en-US': 'Close Mic', + }), + openScreensharing: localTrans({ + 'zh-CN': '开启屏幕共享', + 'en-US': 'Open Screensharing', + }), + closeScreensharing: localTrans({ + 'zh-CN': '关闭屏幕共享', + 'en-US': 'Close Screensharing', + }), + someoneScreenName: localTrans({ + 'zh-CN': ' 的屏幕', + 'en-US': "'s Screen", + }), +}; diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/tsconfig.json b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/tsconfig.json new file mode 100644 index 00000000000..79e593c1e54 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/types/tailchat.d.ts b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/types/tailchat.d.ts new file mode 100644 index 00000000000..29b85e70097 --- /dev/null +++ b/server/plugins/com.msgbyte.agora/web/plugins/com.msgbyte.agora/types/tailchat.d.ts @@ -0,0 +1,488 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/// + +/** + * 该文件由 Tailchat 自动生成 + * 用于插件的类型声明 + * 生成命令: pnpm run plugins:declaration:generate + */ + +/** + * Tailchat 通用 + */ +declare module '@capital/common' { + export const useGroupPanelParams: any; + + /** + * 打开模态框 + * @deprecated 请从 @capital/component 引入 + */ + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const closeModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const ModalWrapper: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const useModalContext: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const openConfirmModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const openReconfirmModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const Loadable: any; + + export const getGlobalState: any; + + export const useGlobalSocketEvent: ( + eventName: string, + callback: (data: T) => void + ) => void; + + export const getJWTUserInfo: () => Promise<{ + _id?: string; + nickname?: string; + email?: string; + avatar?: string; + }>; + + export const dataUrlToFile: any; + + export const urlSearchStringify: any; + + export const urlSearchParse: any; + + export const appendUrlSearch: any; + + export const getServiceWorkerRegistration: any; + + export const getServiceUrl: () => string; + + export const getCachedUserInfo: ( + userId: string, + refetch?: boolean + ) => Promise<{ + _id: string; + email: string; + nickname: string; + discriminator: string; + avatar: string | null; + temporary: boolean; + }>; + + export const getCachedConverseInfo: any; + + /** + * 本地翻译 + * @example + * localTrans({'zh-CN': '你好', 'en-US': 'Hello'}); + * + * @param trans 翻译对象 + */ + export const localTrans: (trans: Record<'zh-CN' | 'en-US', string>) => string; + + export const getLanguage: any; + + export const sharedEvent: any; + + export const useAsync: Promise>( + fn: T, + deps?: React.DependencyList + ) => { loading: boolean; value?: any; error?: Error }; + + export const useAsyncFn: Promise>( + fn: T, + deps?: React.DependencyList + ) => [{ loading: boolean; value?: any; error?: Error }, T]; + + export const useAsyncRefresh: Promise>( + fn: T, + deps?: React.DependencyList + ) => { loading: boolean; value?: any; error?: Error; refresh: () => void }; + + export const useAsyncRequest: Promise>( + fn: T, + deps?: React.DependencyList + ) => [{ loading: boolean; value?: any }, T]; + + export const uploadFile: any; + + export const showToasts: ( + message: string, + type?: 'info' | 'success' | 'error' | 'warning' + ) => void; + + export const showSuccessToasts: any; + + export const showErrorToasts: (error: any) => void; + + export const fetchAvailableServices: any; + + export const isValidStr: (str: any) => str is string; + + export const useGroupPanelInfo: any; + + export const sendMessage: any; + + export const showMessageTime: any; + + export const joinArray: any; + + export const useLocation: any; + + export const useNavigate: any; + + /** + * @deprecated please use createMetaFormSchema from @capital/component + */ + export const createFastFormSchema: any; + + /** + * @deprecated please use metaFormFieldSchema from @capital/component + */ + export const fieldSchema: any; + + export const useCurrentUserInfo: any; + + export const createPluginRequest: (pluginName: string) => { + get: (actionName: string, config?: any) => Promise; + post: (actionName: string, data?: any, config?: any) => Promise; + }; + + export const postRequest: any; + + export const pluginCustomPanel: any; + + export const regCustomPanel: any; + + export const pluginGroupPanel: any; + + export const regGroupPanel: any; + + export const messageInterpreter: { + name?: string; + explainMessage: (message: string) => React.ReactNode; + }[]; + + export const regMessageInterpreter: (interpreter: { + name?: string; + explainMessage: (message: string) => React.ReactNode; + }) => void; + + export const getMessageRender: (message: string) => React.ReactNode; + + export const regMessageRender: ( + render: (message: string) => React.ReactNode + ) => void; + + export const getMessageTextDecorators: any; + + export const regMessageTextDecorators: any; + + export const ChatInputActionContextProps: any; + + export const pluginChatInputActions: any; + + export const regChatInputAction: any; + + export const regSocketEventListener: (item: { + eventName: string; + eventFn: (...args: any[]) => void; + }) => void; + + export const pluginColorScheme: any; + + export const regPluginColorScheme: any; + + export const pluginInspectServices: any; + + export const regInspectService: any; + + export const pluginMessageExtraParsers: any; + + export const regMessageExtraParser: any; + + export const pluginRootRoute: any; + + export const regPluginRootRoute: any; + + export const pluginPanelActions: any; + + export const regPluginPanelAction: ( + action: + | { + name: string; + label: string; + icon: string; + position: 'group'; + onClick: (ctx: { groupId: string; panelId: string }) => void; + } + | { + name: string; + label: string; + icon: string; + position: 'dm'; + onClick: (ctx: { converseId: string }) => void; + } + ) => void; + + export const pluginPermission: any; + + export const regPluginPermission: (permission: { + /** + * 权限唯一key, 用于写入数据库 + * 如果为插件则权限点应当符合命名规范, 如: plugin.com.msgbyte.github.manage + */ + key: string; + /** + * 权限点显示名称 + */ + title: string; + /** + * 权限描述 + */ + desc: string; + /** + * 是否默认开启 + */ + default: boolean; + /** + * 是否依赖其他权限点 + */ + required?: string[]; + }) => void; + + export const pluginGroupPanelBadges: any; + + export const regGroupPanelBadge: any; + + export const pluginGroupTextPanelExtraMenus: any; + + export const regPluginGroupTextPanelExtraMenu: any; + + export const pluginUserExtraInfo: any; + + export const regUserExtraInfo: any; + + export const useGroupIdContext: () => string; + + export const useGroupPanelContext: () => { + groupId: string; + panelId: string; + } | null; + + export const useSocketContext: any; +} + +/** + * Tailchat 组件 + */ +declare module '@capital/component' { + export const Button: any; + + export const Checkbox: any; + + export const Input: any; + + export const Divider: any; + + export const Space: any; + + export const Menu: any; + + export const Table: any; + + export const Switch: any; + + export const Tooltip: any; + + /** + * @link https://ant.design/components/notification-cn/ + */ + export const notification: any; + + export const Empty: React.FC< + React.PropsWithChildren<{ + prefixCls?: string; + className?: string; + style?: React.CSSProperties; + imageStyle?: React.CSSProperties; + image?: React.ReactNode; + description?: React.ReactNode; + }> + >; + + export const TextArea: any; + + export const Avatar: any; + + export const SensitiveText: React.FC<{ className?: string; text: string }>; + + export const Icon: React.FC<{ icon: string } & React.SVGProps>; + + export const CopyableText: React.FC<{ + className?: string; + style?: React.CSSProperties; + config?: + | boolean + | { + text?: string; + onCopy?: (event?: React.MouseEvent) => void; + icon?: React.ReactNode; + tooltips?: boolean | React.ReactNode; + format?: 'text/plain' | 'text/html'; + }; + }>; + + export const WebFastForm: any; + + export const WebMetaForm: any; + + export const createMetaFormSchema: any; + + export const metaFormFieldSchema: any; + + export const Image: any; + + export const IconBtn: React.FC<{ + icon: string; + className?: string; + iconClassName?: string; + size?: 'small' | 'middle' | 'large'; + shape?: 'circle' | 'square'; + title?: string; + danger?: boolean; + active?: boolean; + disabled?: boolean; + onClick?: React.MouseEventHandler; + }>; + + export const PillTabs: any; + + export const PillTabPane: any; + + export const LoadingSpinner: React.FC<{ tip?: string }>; + + export const FullModalField: any; + + export const DefaultFullModalInputEditorRender: any; + + export const DefaultFullModalTextAreaEditorRender: any; + + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loadable: any; + + export const Loading: React.FC<{ + spinning: boolean; + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + }>; + + export const LoadingOnFirst: React.FC<{ + spinning: boolean; + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + }>; + + export const SidebarView: any; + + export const GroupPanelSelector: any; + + export const Emoji: any; + + export const PortalAdd: any; + + export const PortalRemove: any; + + export const ErrorBoundary: any; + + export const UserAvatar: React.FC<{ + userId: string; + className?: string; + style?: React.CSSProperties; + size?: 'large' | 'small' | 'default' | number; + }>; + + export const UserName: React.FC<{ + userId: string; + className?: string; + style?: React.CSSProperties; + }>; + + export const Markdown: any; + + export const Webview: any; + + export const WebviewKeepAlive: any; +} diff --git a/server/plugins/com.msgbyte.autojoinGroup/package.json b/server/plugins/com.msgbyte.autojoinGroup/package.json new file mode 100644 index 00000000000..a65e5935d44 --- /dev/null +++ b/server/plugins/com.msgbyte.autojoinGroup/package.json @@ -0,0 +1,20 @@ +{ + "name": "tailchat-plugin-autojoingroup", + "version": "1.0.0", + "main": "index.js", + "author": "moonrailgun", + "description": "Auto join group after register", + "license": "MIT", + "private": true, + "scripts": { + "build:web": "ministar buildPlugin all", + "build:web:watch": "ministar watchPlugin all" + }, + "devDependencies": { + "@types/react": "18.0.20", + "mini-star": "*" + }, + "dependencies": { + "tailchat-server-sdk": "*" + } +} diff --git a/server/plugins/com.msgbyte.autojoinGroup/services/autojoinGroup.service.ts b/server/plugins/com.msgbyte.autojoinGroup/services/autojoinGroup.service.ts new file mode 100644 index 00000000000..576f088b103 --- /dev/null +++ b/server/plugins/com.msgbyte.autojoinGroup/services/autojoinGroup.service.ts @@ -0,0 +1,71 @@ +import { call, TcContext } from 'tailchat-server-sdk'; +import { TcService } from 'tailchat-server-sdk'; + +/** + * Autojoin Group + * + * Auto join group after register + */ +class AutojoinGroupService extends TcService { + get serviceName() { + return 'plugin:com.msgbyte.autojoinGroup'; + } + + get autojoinGroupIds(): string[] | null { + const ids = process.env.AUTOJOIN_GROUP_ID; + if (!ids) { + return null; + } + + return ids.split(','); + } + + onInit() { + if (!this.autojoinGroupIds) { + return; + } + + this.registerAfterActionHook('user.register', 'autojoinGroup'); + this.registerAfterActionHook('user.createTemporaryUser', 'autojoinGroup'); + + this.registerAction('autojoinGroup', this.autojoinGroup, { + visibility: 'public', + }); + } + + async autojoinGroup(ctx: TcContext) { + const autojoinGroupIds = this.autojoinGroupIds; + if (!autojoinGroupIds) { + return; + } + + console.log(ctx.params, ctx.meta); + + const userId = ctx.meta.actionResult?._id; + const t = ctx.meta.t; + + if (!userId) { + this.logger.fatal('Autojoin Group Failed: cannot found userId from ctx'); + return; + } + + await Promise.all( + autojoinGroupIds.map(async (groupId: string) => { + await ctx.call('group.addMember', { + groupId, + userId, + }); + + const nickname = ctx.meta.actionResult?.nickname; + await call(ctx).addGroupSystemMessage( + String(groupId), + t('{{nickname}} 通过系统自动加入群组', { + nickname, + }) + ); + }) + ); + } +} + +export default AutojoinGroupService; diff --git a/server/plugins/com.msgbyte.discover/.ministarrc.js b/server/plugins/com.msgbyte.discover/.ministarrc.js new file mode 100644 index 00000000000..3c4db17957d --- /dev/null +++ b/server/plugins/com.msgbyte.discover/.ministarrc.js @@ -0,0 +1,14 @@ +const path = require('path'); + +module.exports = { + externalDeps: [ + 'react', + 'react-router', + 'axios', + 'styled-components', + 'zustand', + 'zustand/middleware/immer', + ], + pluginRoot: path.resolve(__dirname, './web'), + outDir: path.resolve(__dirname, '../../public'), +}; diff --git a/server/plugins/com.msgbyte.discover/models/discover.ts b/server/plugins/com.msgbyte.discover/models/discover.ts new file mode 100644 index 00000000000..d5bd23d6adc --- /dev/null +++ b/server/plugins/com.msgbyte.discover/models/discover.ts @@ -0,0 +1,30 @@ +import { db } from 'tailchat-server-sdk'; +import { Group } from '../../../models/group/group'; +const { getModelForClass, prop, modelOptions, TimeStamps } = db; + +@modelOptions({ + options: { + customName: 'p_discover', + }, +}) +export class Discover extends TimeStamps implements db.Base { + _id: db.Types.ObjectId; + id: string; + + @prop({ ref: () => Group }) + groupId: db.Ref; + + @prop({ default: true }) + active: boolean; + + @prop({ default: 0 }) + order: number; +} + +export type DiscoverDocument = db.DocumentType; + +const model = getModelForClass(Discover); + +export type DiscoverModel = typeof model; + +export default model; diff --git a/server/plugins/com.msgbyte.discover/package.json b/server/plugins/com.msgbyte.discover/package.json new file mode 100644 index 00000000000..6ecd1301466 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/package.json @@ -0,0 +1,20 @@ +{ + "name": "tailchat-plugin-discover", + "version": "1.0.0", + "main": "index.js", + "author": "moonrailgun", + "description": "Add Discover panel which can help user found groups", + "license": "MIT", + "private": true, + "scripts": { + "build:web": "ministar buildPlugin all", + "build:web:watch": "ministar watchPlugin all" + }, + "devDependencies": { + "@types/react": "18.0.20", + "mini-star": "*" + }, + "dependencies": { + "tailchat-server-sdk": "*" + } +} diff --git a/server/plugins/com.msgbyte.discover/services/discover.service.ts b/server/plugins/com.msgbyte.discover/services/discover.service.ts new file mode 100644 index 00000000000..0841dfd6d5d --- /dev/null +++ b/server/plugins/com.msgbyte.discover/services/discover.service.ts @@ -0,0 +1,77 @@ +import { call, TcContext } from 'tailchat-server-sdk'; +import { TcService, TcDbService } from 'tailchat-server-sdk'; +import type { DiscoverDocument, DiscoverModel } from '../models/discover'; + +/** + * Discover + * + * Add Discover panel which can help user found groups + */ +interface DiscoverService + extends TcService, + TcDbService {} +class DiscoverService extends TcService { + get serviceName() { + return 'plugin:com.msgbyte.discover'; + } + + onInit() { + this.registerLocalDb(require('../models/discover').default); + + this.registerAction('all', this.all, { + params: { + page: { type: 'number', default: 1 }, + size: { type: 'number', default: 20 }, + }, + }); + this.registerAction('join', this.join, { + params: { + groupId: 'string', + }, + }); + } + + async all(ctx: TcContext<{ page: number; size: number }>) { + const { page, size } = ctx.params; + + const docs = await this.adapter.model + .find({ + active: true, + }) + .sort({ order: 'desc' }) + .limit(size) + .skip(size * (page - 1)) + .exec(); + + const list = await this.transformDocuments(ctx, {}, docs); + + return { list }; + } + + async join(ctx: TcContext<{ groupId: string }>) { + const { groupId } = ctx.params; + const t = ctx.meta.t; + + const isExists = await this.adapter.model.exists({ + groupId, + active: true, + }); + + if (!isExists) { + throw new Error(t('该群组并非公开群组, 无法直接加入')); + } + + await ctx.call('group.joinGroup', { + groupId: String(groupId), + }); + + await call(ctx).addGroupSystemMessage( + String(groupId), + t('{{nickname}} 通过公共社区加入群组', { + nickname: ctx.meta.user.nickname, + }) + ); + } +} + +export default DiscoverService; diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/manifest.json b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/manifest.json new file mode 100644 index 00000000000..14a4afd3668 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Discover", + "label.zh-CN": "发现群组", + "name": "com.msgbyte.discover", + "url": "{BACKEND}/plugins/com.msgbyte.discover/index.js", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Add Discover panel which can help user found groups", + "description.zh-CN": "增加一个发现面板,用于探索公开的群组", + "requireRestart": true +} diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/package.json b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/package.json new file mode 100644 index 00000000000..16a3ecf2798 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/com.msgbyte.discover", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Add Discover panel which can help user found groups", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/DiscoverPanel/DiscoverServerCard.tsx b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/DiscoverPanel/DiscoverServerCard.tsx new file mode 100644 index 00000000000..73a1c6e57b9 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/DiscoverPanel/DiscoverServerCard.tsx @@ -0,0 +1,189 @@ +import React, { useMemo } from 'react'; +import styled from 'styled-components'; +import { + postRequest, + useAsync, + useAsyncRequest, + getTextColorHex, + getGlobalState, + useNavigate, + useEvent, +} from '@capital/common'; +import { Avatar, Skeleton, Button } from '@capital/component'; +import { Translate } from '../translate'; +import { request } from '../request'; + +const Root = styled.div` + --discover-server-card: #fff; + + .dark & { + --discover-server-card: #2c3441; + } + + width: 100%; + height: 320px; + display: flex; + flex-direction: column; + overflow: hidden; + border-radius: 8px; + position: relative; + background-color: var(--discover-server-card); + + .header { + height: 143px; + position: relative; + display: block; + overflow: visible; + margin-bottom: 32px; + + .icon { + position: absolute; + bottom: -21px; + left: 12px; + border: 6px solid var(--discover-server-card); + border-radius: 6px; + } + } + + .body { + flex: 1; + display: flex; + flex-direction: column; + padding: 0 16px 16px; + overflow: hidden; + width: 100%; + + .name { + font-weight: 600; + } + + .desc { + opacity: 0.8; + overflow: auto; + font-size: 0.9rem; + + > pre { + text-wrap: wrap; + } + } + } + + .footer { + padding: 0 16px 16px; + font-size: 0.7rem; + opacity: 0.8; + display: flex; + justify-content: space-between; + align-items: center; + + * + * { + margin-left: 4px; + } + } +`; + +interface DiscoverServerCardProps { + groupId: string; +} + +export const DiscoverServerCard: React.FC = React.memo( + (props) => { + const navigate = useNavigate(); + const { value: groupBasicInfo } = useAsync(async () => { + const { data } = await postRequest('/group/getGroupBasicInfo', { + groupId: props.groupId, + }); + + return data; + }, [props.groupId]); + + const [{ loading: joinLoading }, handleJoin] = useAsyncRequest(async () => { + await request.post('join', { + groupId: props.groupId, + }); + }, [props.groupId]); + + const handleJumpTo = useEvent(() => { + navigate(`/main/group/${props.groupId}`); + }); + + const isJoined = useMemo(() => { + try { + return Object.keys(getGlobalState().group.groups).includes( + props.groupId + ); + } catch (err) { + console.error(err); + return false; + } + }, [props.groupId]); + + if (!groupBasicInfo) { + return ( + +
+
+ +
+
+
+ +
+
+ ); + } + + return ( + +
+
+ +
+
+
+
{groupBasicInfo.name}
+
+
{groupBasicInfo.description}
+
+
+
+
+ {Translate.memberCount.replace( + '{count}', + groupBasicInfo.memberCount + )} +
+ + {isJoined ? ( + + ) : ( + + )} +
+
+ ); + } +); +DiscoverServerCard.displayName = 'DiscoverServerCard'; diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/DiscoverPanel/index.tsx b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/DiscoverPanel/index.tsx new file mode 100644 index 00000000000..be2520b7166 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/DiscoverPanel/index.tsx @@ -0,0 +1,68 @@ +import React from 'react'; +import { useAsync } from '@capital/common'; +import { LoadingSpinner, ErrorView, NoData } from '@capital/component'; +import { request } from '../request'; +import styled from 'styled-components'; +import { DiscoverServerCard } from './DiscoverServerCard'; +import { Translate } from '../translate'; + +interface DiscoverServerItem { + groupId: string; + order: number; + active: boolean; +} + +const Root = styled.div` + width: 100%; + overflow: auto; +`; + +const DiscoverServerHeader = styled.div` + font-size: 1.5rem; + padding: 32px 0; + text-align: center; +`; + +const DiscoverServerList = styled.div` + margin-top: 16px; + display: grid; + grid-gap: 16px; + grid-template-columns: repeat(auto-fill, minmax(248px, 1fr)); + padding: 10px; +`; + +export const DiscoverPanel: React.FC = React.memo(() => { + const { + error, + loading, + value: list = [], + } = useAsync(async (): Promise => { + const { data } = await request.get('all'); + + return data.list ?? []; + }, []); + + if (loading) { + return ; + } + + if (error) { + return ; + } + + return ( + + {Translate.discoverHeader} + {Array.isArray(list) && list.length > 0 ? ( + + {list.map((item, i) => ( + + ))} + + ) : ( + + )} + + ); +}); +DiscoverPanel.displayName = 'DiscoverPanel'; diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/index.tsx b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/index.tsx new file mode 100644 index 00000000000..6f87e09fe36 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/index.tsx @@ -0,0 +1,16 @@ +import { regCustomPanel, Loadable } from '@capital/common'; +import { Translate } from './translate'; + +console.log('Plugin Discover is loaded'); + +const DiscoverPanel = Loadable(() => + import('./DiscoverPanel').then((m) => m.DiscoverPanel) +); + +regCustomPanel({ + position: 'navbar-group', + icon: 'mdi:compass', + name: 'plugin:com.msgbyte.discover/entry', + label: Translate.discover, + render: DiscoverPanel, +}); diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/request.ts b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/request.ts new file mode 100644 index 00000000000..0a3dd344a73 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/request.ts @@ -0,0 +1,3 @@ +import { createPluginRequest } from '@capital/common'; + +export const request = createPluginRequest('com.msgbyte.discover'); diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/translate.ts b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/translate.ts new file mode 100644 index 00000000000..062c1d896d3 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/src/translate.ts @@ -0,0 +1,24 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + discover: localTrans({ + 'zh-CN': '探索', + 'en-US': 'Discover', + }), + memberCount: localTrans({ + 'zh-CN': '{count} 位成员', + 'en-US': '{count} members', + }), + discoverHeader: localTrans({ + 'zh-CN': '在这里探索你感兴趣的群组', + 'en-US': 'Explore the groups you are interested in here', + }), + join: localTrans({ + 'zh-CN': '加入', + 'en-US': 'Join', + }), + joined: localTrans({ + 'zh-CN': '已加入', + 'en-US': 'Joined', + }), +}; diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/tsconfig.json b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/types/tailchat.d.ts b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/server/plugins/com.msgbyte.discover/web/plugins/com.msgbyte.discover/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/server/plugins/com.msgbyte.getui/lib/GetuiClient.ts b/server/plugins/com.msgbyte.getui/lib/GetuiClient.ts new file mode 100644 index 00000000000..7496026a781 --- /dev/null +++ b/server/plugins/com.msgbyte.getui/lib/GetuiClient.ts @@ -0,0 +1,167 @@ +import got from 'got'; +import crypto from 'crypto'; +import _ from 'lodash'; + +function sha256(data: string) { + return crypto.createHash('sha256').update(data).digest('hex'); +} + +interface AuthResPayload { + msg: string; + code: number; + data: { + expire_time: string; + token: string; + }; +} + +interface SinglePushResPayload { + msg: string; + code: number; + data: { + [taskid: string]: { + [cid: string]: + | 'successed_offline' + | 'successed_online' + | 'successed_ignore'; + }; + }; +} + +interface AllPushResPayload { + msg: string; + code: number; + data: { + [taskid: string]: string; + }; +} + +export class GetuiClient { + token: string; + expireTime: number; + + constructor( + public appId: string, + public appkey: string, + public mastersecret: string + ) {} + + get baseUrl() { + return `https://restapi.getui.com/v2/${this.appId}`; + } + + /** + * Generate Request ID with fixed prefix and timestamp and random number + */ + generateRequestId(): string { + return ( + 'tailchat' + + String(Date.now()) + + _.padStart(String(Math.floor(Math.random() * 1e8)), 8, '0') + ); + } + + signBody() { + const timestamp = String(Date.now()); + + return { + sign: sha256(this.appkey + String(Date.now()) + this.mastersecret), + timestamp, + appkey: this.appkey, + }; + } + + private async fetchToken() { + try { + const res = await got(`${this.baseUrl}/auth`, { + method: 'POST', + headers: { + 'content-type': 'application/json;charset=utf-8', + }, + json: { + ...this.signBody(), + }, + }).json(); + + if (res.code === 0) { + this.token = res.data.token; + this.expireTime = Number(res.data.expire_time) - 60 * 1000; // 提前60s过期 + } + } catch (err) { + console.error(err); + } + } + + async getToken(): Promise { + if (!this.token || Date.now() > this.expireTime) { + // 如果token不存在或者token过期 + await this.fetchToken(); + } + + return this.token; + } + + async singlePush( + userId: string, + title: string, + body: string, + payload: {} + ): Promise<{ requestId: string; res: SinglePushResPayload }> { + const token = await this.getToken(); + const requestId = this.generateRequestId(); + const res = await got(`${this.baseUrl}/push/single/alias`, { + method: 'POST', + headers: { + 'content-type': 'application/json;charset=utf-8', + token, + }, + json: { + request_id: requestId, + audience: { + alias: [userId], + }, + push_message: { + notification: { + title: title, + body: body, + click_type: 'payload', + payload: JSON.stringify(payload), + }, + }, + }, + }).json(); + + return { requestId, res }; + } + + async allPush( + title: string, + body: string, + payload: {} + ): Promise<{ requestId: string; res: AllPushResPayload }> { + const token = await this.getToken(); + console.log('token', token); + const requestId = this.generateRequestId(); + const res = await got(`${this.baseUrl}/push/all`, { + method: 'POST', + headers: { + 'content-type': 'application/json;charset=utf-8', + token, + }, + json: { + request_id: requestId, + audience: 'all', + push_message: { + notification: { + title: title, + body: body, + click_type: 'payload', + payload: JSON.stringify(payload), + }, + }, + }, + }).json(); + + return { requestId, res }; + } +} diff --git a/server/plugins/com.msgbyte.getui/models/log.ts b/server/plugins/com.msgbyte.getui/models/log.ts new file mode 100644 index 00000000000..1b5cfb06587 --- /dev/null +++ b/server/plugins/com.msgbyte.getui/models/log.ts @@ -0,0 +1,42 @@ +import { db } from 'tailchat-server-sdk'; +const { getModelForClass, prop, modelOptions, TimeStamps, Severity } = db; + +@modelOptions({ + options: { + customName: 'p_getui_log', + allowMixed: Severity.ALLOW, + }, +}) +export class GetuiLog extends TimeStamps implements db.Base { + _id: db.Types.ObjectId; + id: string; + + @prop() + requestId: string; + + @prop() + userId: string; + + @prop() + title: string; + + @prop() + content: string; + + @prop() + payload: object; + + @prop() + success: boolean; + + @prop() + errorMsg?: string; +} + +export type GetuiLogDocument = db.DocumentType; + +const model = getModelForClass(GetuiLog); + +export type GetuiLogModel = typeof model; + +export default model; diff --git a/server/plugins/com.msgbyte.getui/package.json b/server/plugins/com.msgbyte.getui/package.json new file mode 100644 index 00000000000..43aa3f20957 --- /dev/null +++ b/server/plugins/com.msgbyte.getui/package.json @@ -0,0 +1,18 @@ +{ + "name": "tailchat-plugin-getui", + "version": "1.0.0", + "main": "index.js", + "author": "moonrailgun", + "description": "Support Getui Notify in chinese mainland", + "license": "MIT", + "private": true, + "scripts": {}, + "dependencies": { + "got": "^11.8.3", + "lodash": "^4.17.21", + "tailchat-server-sdk": "*" + }, + "devDependencies": { + "@types/lodash": "^4.14.191" + } +} diff --git a/server/plugins/com.msgbyte.getui/services/getui.service.ts b/server/plugins/com.msgbyte.getui/services/getui.service.ts new file mode 100644 index 00000000000..44b038c75cb --- /dev/null +++ b/server/plugins/com.msgbyte.getui/services/getui.service.ts @@ -0,0 +1,102 @@ +import { RequestError } from 'got'; +import { TcService, TcDbService, InboxStruct, call } from 'tailchat-server-sdk'; +import { GetuiClient } from '../lib/GetuiClient'; +import type { GetuiLogDocument, GetuiLogModel } from '../models/log'; + +/** + * Support Getui Notify in chinese mainland + */ +interface GetuiService + extends TcService, + TcDbService {} +class GetuiService extends TcService { + get serviceName() { + return 'plugin:com.msgbyte.getui'; + } + + get getuiInfo() { + return { + appId: process.env.GETUI_APPID, + appKey: process.env.GETUI_APPKEY, + masterSecert: process.env.GETUI_MASTERSECRET, + }; + } + + get getuiAvailable(): boolean { + const { appId, appKey, masterSecert } = this.getuiInfo; + if (appId && appKey && masterSecert) { + return true; + } + + return false; + } + + onInit() { + this.registerAvailableAction(() => this.getuiAvailable); + + if (!this.getuiAvailable) { + console.warn( + '[plugin:com.msgbyte.getui] require env: GETUI_APPID, GETUI_APPKEY, GETUI_MASTERSECRET' + ); + return; + } + + const { appId, appKey, masterSecert } = this.getuiInfo; + const client = new GetuiClient(appId, appKey, masterSecert); + + this.registerLocalDb(require('../models/log').default); + this.registerEventListener( + 'chat.inbox.append', + async (inboxItem: InboxStruct, ctx) => { + if (inboxItem.type === 'message') { + const userId = inboxItem.userId; + const message = inboxItem.payload; + + let title = 'new'; + if (message.groupId) { + const groupInfo = await call(ctx).getGroupInfo(message.groupId); + title = groupInfo.name; + } + const content = message.messagePlainContent ?? message.messageSnippet; + const payload = { + converseId: message.converseId, + groupId: message.groupId, + }; + + try { + const { requestId } = await client.singlePush( + userId, + title, + content, + payload + ); + await this.adapter.model.create({ + requestId, + userId, + title, + content, + payload, + success: true, + }); + } catch (err) { + let errorMsg = String(err); + + if (err instanceof RequestError && err.response) { + errorMsg = String(err.response.body); + } + await this.adapter.model.create({ + userId, + title, + content, + payload, + success: false, + errorMsg, + }); + } + } + } + ); + } +} + +export default GetuiService; diff --git a/server/plugins/com.msgbyte.github/.ministarrc.js b/server/plugins/com.msgbyte.github/.ministarrc.js new file mode 100644 index 00000000000..f47ca317fce --- /dev/null +++ b/server/plugins/com.msgbyte.github/.ministarrc.js @@ -0,0 +1,7 @@ +const path = require('path'); + +module.exports = { + externalDeps: ['react', 'react-router'], + pluginRoot: path.resolve(__dirname, './web'), + outDir: path.resolve(__dirname, '../../public'), +}; diff --git a/server/plugins/com.msgbyte.github/models/repo.ts b/server/plugins/com.msgbyte.github/models/repo.ts new file mode 100644 index 00000000000..b654e46c1c9 --- /dev/null +++ b/server/plugins/com.msgbyte.github/models/repo.ts @@ -0,0 +1,34 @@ +import { + getModelForClass, + prop, + DocumentType, + modelOptions, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; + +@modelOptions({ + options: { + customName: 'p_githubRepo', + }, +}) +export class Repo extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop({ + unique: true, + }) + repoName: string; // 完整地址 + + @prop() + groupId: string; +} + +export type RepoDocument = DocumentType; + +const model = getModelForClass(Repo); + +export type RepoModel = typeof model; + +export default model; diff --git a/server/plugins/com.msgbyte.github/models/subscribe.ts b/server/plugins/com.msgbyte.github/models/subscribe.ts new file mode 100644 index 00000000000..cda59dab0ea --- /dev/null +++ b/server/plugins/com.msgbyte.github/models/subscribe.ts @@ -0,0 +1,35 @@ +import { + getModelForClass, + prop, + DocumentType, + modelOptions, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; + +@modelOptions({ + options: { + customName: 'p_githubSubscribe', + }, +}) +export class Subscribe extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop() + groupId: string; + + @prop() + textPanelId: string; + + @prop() + repoName: string; +} + +export type SubscribeDocument = DocumentType; + +const model = getModelForClass(Subscribe); + +export type SubscribeModel = typeof model; + +export default model; diff --git a/server/plugins/com.msgbyte.github/package.json b/server/plugins/com.msgbyte.github/package.json new file mode 100644 index 00000000000..d0a32aa7396 --- /dev/null +++ b/server/plugins/com.msgbyte.github/package.json @@ -0,0 +1,21 @@ +{ + "name": "tailchat-plugin-github", + "version": "1.0.0", + "main": "index.js", + "author": "moonrailgun", + "license": "MIT", + "private": true, + "scripts": { + "build:web": "ministar buildPlugin all", + "build:web:watch": "ministar watchPlugin all" + }, + "dependencies": { + "@octokit/webhooks-types": "^5.4.0" + }, + "devDependencies": { + "@types/react-router": "^5.1.20", + "less": "^4.1.2", + "mini-star": "^1.2.8", + "rollup-plugin-less": "^1.1.3" + } +} diff --git a/server/plugins/com.msgbyte.github/services/repo.service.dev.ts b/server/plugins/com.msgbyte.github/services/repo.service.dev.ts new file mode 100644 index 00000000000..dbe753825a3 --- /dev/null +++ b/server/plugins/com.msgbyte.github/services/repo.service.dev.ts @@ -0,0 +1,99 @@ +import type { GroupStruct } from 'tailchat-server-sdk'; +import { GroupPanelType, TcContext } from 'tailchat-server-sdk'; +import { TcService, TcDbService } from 'tailchat-server-sdk'; +import type { RepoDocument, RepoModel } from '../models/repo'; + +const ACTIVITY_PANEL_NAME = 'Activity'; + +const defaultGroupPanel = [ + { + id: '00', + name: 'Default', + type: GroupPanelType.GROUP, + }, + { + id: '01', + name: 'Lobby', + parentId: '00', + type: GroupPanelType.TEXT, + }, + { + id: '02', + name: ACTIVITY_PANEL_NAME, + parentId: '00', + type: GroupPanelType.TEXT, + }, + { + id: '10', + name: 'Project', + type: GroupPanelType.GROUP, + }, +]; + +/** + * Github项目管理服务 + */ + +interface GithubRepoService + extends TcService, + TcDbService {} +class GithubRepoService extends TcService { + get serviceName() { + return 'plugin:com.msgbyte.github.repo'; + } + + onInit() { + this.registerLocalDb(require('../models/repo').default); + + this.registerAction('ensure', this.ensure, { + params: { + repoName: 'string', + }, + }); + } + + async ensure(ctx: TcContext<{ repoName: string }>): Promise<{ + repoName: string; + groupId: string; + }> { + const { repoName } = ctx.params; + + let doc = await this.adapter.model.findOne({ + repoName, + }); + + if (!doc) { + // 不存在 + const group = await this.systemCall( + ctx, + 'group.createGroup', + { + name: repoName, + panels: defaultGroupPanel, + } + ); + const groupId = String(group._id); + const activityPanel = group.panels.find( + (item) => item.name === ACTIVITY_PANEL_NAME + ); + if (activityPanel) { + await this.systemCall(ctx, 'plugin:com.msgbyte.github.subscribe.add', { + groupId, + textPanelId: activityPanel.id, + repoName, + }); + } + + doc = await this.adapter.model.create({ + repoName, + groupId, + }); + } + + const json = await this.transformDocuments(ctx, {}, doc); + + return json; + } +} + +export default GithubRepoService; diff --git a/server/plugins/com.msgbyte.github/services/subscribe.service.ts b/server/plugins/com.msgbyte.github/services/subscribe.service.ts new file mode 100644 index 00000000000..e1ffe6a6b34 --- /dev/null +++ b/server/plugins/com.msgbyte.github/services/subscribe.service.ts @@ -0,0 +1,303 @@ +import { + TcService, + TcPureContext, + TcContext, + TcDbService, + call, + NoPermissionError, +} from 'tailchat-server-sdk'; +import type { WebhookEvent } from '@octokit/webhooks-types'; +import type { SubscribeDocument, SubscribeModel } from '../models/subscribe'; + +const PERMISSION_MANAGE = 'plugin.com.msgbyte.github.subscribe.manage'; + +/** + * Github订阅服务 + */ + +interface GithubSubscribeService + extends TcService, + TcDbService {} +class GithubSubscribeService extends TcService { + botUserId: string | undefined; + + get serviceName() { + return 'plugin:com.msgbyte.github.subscribe'; + } + + onInit() { + this.registerLocalDb(require('../models/subscribe').default); + + this.registerAction('add', this.add, { + params: { + groupId: 'string', + textPanelId: 'string', + repoName: 'string', + }, + }); + this.registerAction('list', this.list, { + params: { + groupId: 'string', + }, + }); + this.registerAction('delete', this.delete, { + params: { + groupId: 'string', + subscribeId: 'string', + }, + }); + this.registerAction('webhook.callback', this.webhookHandler); + + this.registerAuthWhitelist(['/webhook/callback']); + } + + protected onInited(): void { + // 确保机器人用户存在, 并记录机器人用户id + this.waitForServices(['user']).then(async () => { + try { + const botUserId = await this.broker.call('user.ensurePluginBot', { + botId: 'github-bot', + nickname: 'Github Bot', + avatar: '/images/avatar/github-dark.svg', + }); + + this.logger.info('Github Bot Id:', botUserId); + + this.botUserId = String(botUserId); + } catch (e) { + this.logger.error(e); + } + }); + } + + /** + * 添加订阅 + */ + async add( + ctx: TcContext<{ + groupId: string; + textPanelId: string; + repoName: string; + }> + ) { + const { groupId, textPanelId, repoName } = ctx.params; + const { userId, t } = ctx.meta; + + if (!groupId || !textPanelId || !repoName) { + throw new Error('Incomplete parameters'); + } + + const [hasPermission] = await call(ctx).checkUserPermissions( + groupId, + userId, + [PERMISSION_MANAGE] + ); + if (!hasPermission) { + throw new NoPermissionError(t('没有操作权限')); + } + + // TODO: 需要检查textPanelId是否合法 + + await this.adapter.model.create({ + groupId, + textPanelId, + repoName, + }); + } + + /** + * 列出所有订阅 + */ + async list( + ctx: TcContext<{ + groupId: string; + }> + ) { + const groupId = ctx.params.groupId; + const { userId, t } = ctx.meta; + + const [hasPermission] = await call(ctx).checkUserPermissions( + groupId, + userId, + [PERMISSION_MANAGE] + ); + if (!hasPermission) { + throw new NoPermissionError(t('没有查看权限')); + } + + const docs = await this.adapter.model + .find({ + groupId, + }) + .exec(); + + return await this.transformDocuments(ctx, {}, docs); + } + + /** + * 列出指定订阅 + */ + async delete( + ctx: TcContext<{ + groupId: string; + subscribeId: string; + }> + ) { + const { groupId, subscribeId } = ctx.params; + const { userId, t } = ctx.meta; + + const [hasPermission] = await call(ctx).checkUserPermissions( + groupId, + userId, + [PERMISSION_MANAGE] + ); + if (!hasPermission) { + throw new NoPermissionError(t('没有删除权限')); + } + + await this.adapter.model.deleteOne({ + _id: subscribeId, + }); + } + + /** + * 处理github webhook 回调 + */ + async webhookHandler(ctx: TcPureContext) { + if (!this.botUserId) { + throw new Error('Not github bot'); + } + + const event = ctx.params as WebhookEvent; + + if ('pusher' in event) { + // Is push event + const name = event.pusher.name; + const userUrl = event.sender.html_url; + const repo = event.repository.full_name; + const repoUrl = event.repository.html_url; + const compareUrl = event.compare; + const commits = event.commits.map((c) => `- ${c.message}`).join('\n'); + + const message = `[url=${userUrl}]${name}[/url] committed new content in [url=${repoUrl}]${repo}[/url]:\n${commits}\n\nView changes: ${compareUrl}`; + + await this.sendMessageToSubscribes(ctx, repo, message); + } else if ('pull_request' in event) { + const name = event.sender.login; + const userUrl = event.sender.html_url; + const repo = event.repository.full_name; + const repoUrl = event.repository.html_url; + const url = event.pull_request.html_url; + const title = event.pull_request.title; + const body = event.pull_request.body; + + let message = `[url=${userUrl}]${name}[/url] updated PR request at [url=${repoUrl}]${repo}[/url]:\nURL: ${url}`; + if (event.action === 'opened') { + message = `[url=${userUrl}]${name}[/url] created a PR request at [url=${repoUrl}]${repo}[/url]:\n${title}\n[markdown]${ + body ?? '' + }[/markdown]\nURL: ${url}`; + } else if (event.action === 'created') { + const comment = event.comment; + message = `[url=${userUrl}]${name}[/url] replied PR request at [url=${repoUrl}]${repo}[/url]:\n${title}\n[markdown]${ + comment.body ?? '' + }[/markdown]\nURL: ${url}`; + } else if (event.action === 'closed') { + message = `[url=${userUrl}]${name}[/url] closed PR request at [url=${repoUrl}]${repo}[/url]:\n${title}\n\nURL: ${url}`; + } + + await this.sendMessageToSubscribes(ctx, repo, message); + } else if ('issue' in event) { + const name = event.sender.login; + const userUrl = event.sender.html_url; + const repo = event.repository.full_name; + const repoUrl = event.repository.html_url; + const url = event.issue.html_url; + const title = event.issue.title; + + let message = `[url=${userUrl}]${name}[/url] updated Issue in [url=${repoUrl}]${repo}[/url]:\n${title}\n\nURL: ${url}`; + if (event.action === 'opened') { + // @ts-ignore 这里不知道为什么判断issue为never 跳过 + const body = event.issue.body; + message = `[url=${userUrl}]${name}[/url] created an Issue in [url=${repoUrl}]${repo}[/url]:\n${title}\n[markdown]${ + body ?? '' + }[/markdown]\nURL: ${url}`; + } else if (event.action === 'created') { + const comment = event.comment; + message = `[url=${userUrl}]${name}[/url] replied to Issue in [url=${repoUrl}]${repo}[/url]:\n${title}\nReply content:[markdown]${ + comment.body ?? '' + }[/markdown]\nURL: ${url}`; + } else if (event.action === 'closed') { + message = `[url=${userUrl}]${name}[/url] closed Issue in [url=${repoUrl}]${repo}[/url]:\n${title}\n\nURL: ${url}`; + } + + await this.sendMessageToSubscribes(ctx, repo, message); + } else if ('starred_at' in event) { + if (event.action === 'created') { + const name = event.sender.login; + const userUrl = event.sender.html_url; + const repo = event.repository.full_name; + const repoUrl = event.repository.html_url; + const repoStarCount = event.repository.stargazers_count; + const message = `[emoji]tada[/emoji] [url=${userUrl}]${name}[/url] starred [url=${repoUrl}]${repo}[/url](total ${repoStarCount} stargazers)`; + await this.sendMessageToSubscribes(ctx, repo, message); + } + } + } + + /** + * 向订阅者发送消息 + */ + private async sendMessageToSubscribes( + ctx: TcPureContext, + repoName: string, + message: string + ) { + const subscribes = await this.adapter.model.find({ + repoName, + }); + + this.logger.info( + 'Send Github push notification:', + subscribes + .map((s) => `${s.repoName}|${s.groupId}|${s.textPanelId}`) + .join(',') + ); + + for (const s of subscribes) { + const groupId = String(s.groupId); + const converseId = String(s.textPanelId); + + this.sendPluginBotMessage(ctx, { + groupId, + converseId, + content: message, + }); + } + } + + private async sendPluginBotMessage( + ctx: TcPureContext, + messagePayload: { + converseId: string; + groupId?: string; + content: string; + meta?: any; + } + ) { + const res = await ctx.call( + 'chat.message.sendMessage', + { + ...messagePayload, + }, + { + meta: { + userId: this.botUserId, + }, + } + ); + + return res; + } +} + +export default GithubSubscribeService; diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/manifest.json b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/manifest.json new file mode 100644 index 00000000000..a29ef2801f7 --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "Github Subscription", + "label.zh-CN": "Github 订阅", + "name": "com.msgbyte.github", + "url": "{BACKEND}/plugins/com.msgbyte.github/index.js", + "icon": "https://api.iconify.design/entypo-social/github.svg", + "version": "0.0.0", + "author": "msgbyte", + "description": "Subscribe to the Github project dynamics to the group", + "description.zh-CN": "订阅Github项目动态到群组", + "requireRestart": true +} diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/package.json b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/package.json new file mode 100644 index 00000000000..8a192b9a1d8 --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/package.json @@ -0,0 +1,7 @@ +{ + "name": "@plugins/com.msgbyte.github", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": {} +} diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/GroupSubscribePanel/AddGroupSubscribeModal.tsx b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/GroupSubscribePanel/AddGroupSubscribeModal.tsx new file mode 100644 index 00000000000..b355675f864 --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/GroupSubscribePanel/AddGroupSubscribeModal.tsx @@ -0,0 +1,83 @@ +import React, { useMemo } from 'react'; +import { + createFastFormSchema, + fieldSchema, + useAsyncRequest, + showToasts, +} from '@capital/common'; +import { + WebFastForm, + GroupPanelSelector, + ModalWrapper, +} from '@capital/component'; +import { request } from '../request'; +import { Translate } from '../translate'; + +interface Values { + repoName: string; + textPanelId: string; +} + +const schema = createFastFormSchema({ + repoName: fieldSchema.string().required(Translate.repoNameEmpty), + textPanelId: fieldSchema.string().required(Translate.textPanelEmpty), +}); + +export const AddGroupSubscribeModal: React.FC<{ + groupId: string; + onSuccess?: () => void; +}> = React.memo((props) => { + const groupId = props.groupId; + const [, handleSubmit] = useAsyncRequest( + async (values: Values) => { + const { repoName, textPanelId } = values; + await request.post('subscribe.add', { + groupId, + textPanelId, + repoName, + }); + + showToasts(Translate.success, 'success'); + props.onSuccess?.(); + }, + [groupId, props.onSuccess] + ); + + const fields = useMemo( + () => [ + { + type: 'text', + name: 'repoName', + label: Translate.repoName, + placeholder: Translate.repoNamePlaceholder, + }, + { + type: 'custom', + name: 'textPanelId', + label: Translate.textPanel, + render: (props: { + value: any; + error: string | undefined; + onChange: (val: any) => void; // 修改数据的回调函数 + }) => { + return ( + + ); + }, + }, + ], + [groupId] + ); + + return ( + + + + ); +}); +AddGroupSubscribeModal.displayName = 'AddGroupSubscribeModal'; diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/GroupSubscribePanel/index.tsx b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/GroupSubscribePanel/index.tsx new file mode 100644 index 00000000000..2584c1c6dcb --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/GroupSubscribePanel/index.tsx @@ -0,0 +1,152 @@ +import React, { useCallback, useMemo } from 'react'; +import { + useGroupIdContext, + useAsyncRefresh, + useAsyncRequest, + getServiceUrl, + useGroupPanelInfo, +} from '@capital/common'; +import { + openModal, + closeModal, + Button, + CopyableText, + Space, + Table, +} from '@capital/component'; +import { Translate } from '../translate'; +import { AddGroupSubscribeModal } from './AddGroupSubscribeModal'; +import { request } from '../request'; + +interface SubscribeItem { + _id: string; + groupId: string; + repoName: string; + textPanelId: string; + createdAt: string; + updatedAt: string; +} + +const GroupPanelName: React.FC<{ + groupId: string; + panelId: string; +}> = React.memo(({ groupId, panelId }) => { + const groupPanelInfo = useGroupPanelInfo(groupId, panelId); + + return groupPanelInfo?.name ?? ''; +}); +GroupPanelName.displayName = 'GroupPanelName'; + +const GroupSubscribePanel: React.FC = React.memo(() => { + const groupId = useGroupIdContext(); + + const { value: subscribes, refresh } = useAsyncRefresh(async () => { + const { data } = await request.post('subscribe.list', { groupId }); + return data; + }, [groupId]); + + const handleAdd = useCallback(() => { + const key = openModal( + { + closeModal(key); + refresh(); + }} + /> + ); + }, [groupId, refresh]); + + const [, handleDelete] = useAsyncRequest( + async (subscribeId) => { + await request.post('subscribe.delete', { + groupId, + subscribeId, + }); + + refresh(); + }, + [groupId, refresh] + ); + + const columns = useMemo( + () => [ + { + title: Translate.repo, + key: 'repoName', + dataIndex: 'repoName', + }, + { + title: Translate.panel, + key: 'textPanelId', + dataIndex: 'textPanelId', + render: (panelId: string) => ( + + ), + }, + { + title: Translate.createdTime, + key: 'createdAt', + dataIndex: 'createdAt', + render: (date: string) => new Date(date).toLocaleString(), + }, + { + title: Translate.action, + key: 'action', + render: (_, record: SubscribeItem) => ( + + + + ), + }, + ], + [handleDelete] + ); + const url = `${getServiceUrl()}/api/plugin:com.msgbyte.github.subscribe/webhook/callback`; + + return ( +
+
+

{Translate.groupSubscribe}

+ + +
+ +
+ + {Array.isArray(subscribes) && subscribes.length > 0 && ( +
+

如何接入:

+

+ 在对应 Github 仓库中添加 github webhook, 回调地址指向:{' '} + + {url} + +

+

+ 并确保 Content type 类型为{' '} + application/json +

+
+ )} + + ); +}); +GroupSubscribePanel.displayName = 'GroupSubscribePanel'; + +export default GroupSubscribePanel; diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/components/GithubRepoInfo.tsx b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/components/GithubRepoInfo.tsx new file mode 100644 index 00000000000..2778b82992d --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/components/GithubRepoInfo.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { useParams } from 'react-router'; + +interface GithubRepoName { + owner: string; + repo: string; +} + +export const GithubRepoInfo: React.FC = React.memo((props) => { + return
GithubRepoInfo {JSON.stringify(props)}
; +}); +GithubRepoInfo.displayName = 'GithubRepoInfo'; + +export const GithubRepoInfoRoute: React.FC = React.memo(() => { + const params = useParams(); + + return ( +
+ +
+ ); +}); +GithubRepoInfoRoute.displayName = 'GithubRepoInfoRoute'; diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/index.tsx b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/index.tsx new file mode 100644 index 00000000000..c563f4ad50d --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/index.tsx @@ -0,0 +1,40 @@ +import { + regCustomPanel, + regInspectService, + regPluginPermission, + regPluginRootRoute, + isDevelopment, +} from '@capital/common'; +import { Loadable } from '@capital/component'; +import { Translate } from './translate'; + +const PLUGIN_ID = 'com.msgbyte.github'; + +regCustomPanel({ + position: 'groupdetail', + name: `${PLUGIN_ID}/groupSubscribe`, + label: Translate.groupSubscribe, + render: Loadable(() => import('./GroupSubscribePanel')), +}); + +regInspectService({ + name: `plugin:${PLUGIN_ID}.subscribe`, + label: Translate.githubService, +}); + +regPluginPermission({ + key: `plugin.${PLUGIN_ID}.subscribe.manage`, + title: Translate.permissionTitle, + desc: Translate.permissionDesc, + default: false, +}); + +if (isDevelopment) { + regPluginRootRoute({ + name: `plugin:${PLUGIN_ID}/route`, + path: '/github/:owner/:repo', + component: Loadable(() => + import('./components/GithubRepoInfo').then((m) => m.GithubRepoInfoRoute) + ), + }); +} diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/request.ts b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/request.ts new file mode 100644 index 00000000000..63fb30ac2e5 --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/request.ts @@ -0,0 +1,3 @@ +import { createPluginRequest } from '@capital/common'; + +export const request = createPluginRequest('com.msgbyte.github'); diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/translate.ts b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/translate.ts new file mode 100644 index 00000000000..8954b4ecc7d --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/src/translate.ts @@ -0,0 +1,72 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + groupSubscribe: localTrans({ + 'zh-CN': 'Github 群组订阅', + 'en-US': 'Github Group Subscribe', + }), + githubService: localTrans({ + 'zh-CN': 'Github 群组订阅服务', + 'en-US': 'Github Group Subscribe Service', + }), + add: localTrans({ + 'zh-CN': '新增', + 'en-US': 'Add', + }), + repo: localTrans({ + 'zh-CN': '项目', + 'en-US': 'Repository', + }), + panel: localTrans({ + 'zh-CN': '面板', + 'en-US': 'Panel', + }), + createdTime: localTrans({ + 'zh-CN': '创建时间', + 'en-US': 'Created Time', + }), + action: localTrans({ + 'zh-CN': '操作', + 'en-US': 'Action', + }), + delete: localTrans({ + 'zh-CN': '删除', + 'en-US': 'Delete', + }), + repoName: localTrans({ + 'zh-CN': '仓库名', + 'en-US': 'Repo Name', + }), + repoNamePlaceholder: localTrans({ + 'zh-CN': '(示例: msgbyte/tailchat)', + 'en-US': '(example: msgbyte/tailchat)', + }), + textPanel: localTrans({ + 'zh-CN': '文本频道', + 'en-US': 'Text Channel', + }), + success: localTrans({ + 'zh-CN': '成功', + 'en-US': 'Success', + }), + createApplication: localTrans({ + 'zh-CN': '创建应用', + 'en-US': 'Create Application', + }), + repoNameEmpty: localTrans({ + 'zh-CN': '仓库名不能为空', + 'en-US': 'Github Repo Name Not Allowd Empty', + }), + textPanelEmpty: localTrans({ + 'zh-CN': '文本频道不能为空', + 'en-US': 'Text Panel Not Allowd Empty', + }), + permissionTitle: localTrans({ + 'zh-CN': 'Github 订阅管理', + 'en-US': 'Github Subscribe Manager', + }), + permissionDesc: localTrans({ + 'zh-CN': '允许管理Github订阅列表', + 'en-US': 'Allows to manage Github subscription list', + }), +}; diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/tsconfig.json b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/types/tailchat.d.ts b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/types/tailchat.d.ts new file mode 100644 index 00000000000..21a171d27a9 --- /dev/null +++ b/server/plugins/com.msgbyte.github/web/plugins/com.msgbyte.github/types/tailchat.d.ts @@ -0,0 +1,453 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/// + +/** + * 该文件由 Tailchat 自动生成 + * 用于插件的类型声明 + * 生成命令: pnpm run plugins:declaration:generate + */ + +/** + * Tailchat 通用 + */ +declare module '@capital/common' { + export const useGroupPanelParams: any; + + /** + * 打开模态框 + * @deprecated 请从 @capital/component 引入 + */ + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const closeModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const ModalWrapper: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const useModalContext: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const openConfirmModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const openReconfirmModal: any; + + /** + * @deprecated 请从 @capital/component 引入 + */ + export const Loadable: any; + + export const getGlobalState: any; + + export const useGlobalSocketEvent: ( + eventName: string, + callback: (data: T) => void + ) => void; + + export const getJWTUserInfo: () => Promise<{ + _id?: string; + nickname?: string; + email?: string; + avatar?: string; + }>; + + export const dataUrlToFile: any; + + export const urlSearchStringify: any; + + export const urlSearchParse: any; + + export const appendUrlSearch: any; + + export const getServiceWorkerRegistration: any; + + export const getServiceUrl: () => string; + + export const getCachedUserInfo: ( + userId: string, + refetch?: boolean + ) => Promise<{ + _id: string; + email: string; + nickname: string; + discriminator: string; + avatar: string | null; + temporary: boolean; + }>; + + export const getCachedConverseInfo: any; + + /** + * 本地翻译 + * @example + * localTrans({'zh-CN': '你好', 'en-US': 'Hello'}); + * + * @param trans 翻译对象 + */ + export const localTrans: (trans: Record<'zh-CN' | 'en-US', string>) => string; + + export const getLanguage: any; + + export const sharedEvent: any; + + export const useAsync: Promise>( + fn: T, + deps?: React.DependencyList + ) => { loading: boolean; value?: any; error?: Error }; + + export const useAsyncFn: Promise>( + fn: T, + deps?: React.DependencyList + ) => [{ loading: boolean; value?: any; error?: Error }, T]; + + export const useAsyncRefresh: Promise>( + fn: T, + deps?: React.DependencyList + ) => { loading: boolean; value?: any; error?: Error; refresh: () => void }; + + export const useAsyncRequest: Promise>( + fn: T, + deps?: React.DependencyList + ) => [{ loading: boolean; value?: any }, T]; + + export const uploadFile: any; + + export const showToasts: ( + message: string, + type?: 'info' | 'success' | 'error' | 'warning' + ) => void; + + export const showSuccessToasts: any; + + export const showErrorToasts: (error: any) => void; + + export const fetchAvailableServices: any; + + export const isValidStr: (str: any) => str is string; + + export const useGroupPanelInfo: any; + + export const sendMessage: any; + + export const showMessageTime: any; + + export const useLocation: any; + + export const useNavigate: any; + + /** + * @deprecated please use createMetaFormSchema from @capital/component + */ + export const createFastFormSchema: any; + + /** + * @deprecated please use metaFormFieldSchema from @capital/component + */ + export const fieldSchema: any; + + export const useCurrentUserInfo: any; + + export const createPluginRequest: (pluginName: string) => { + get: (actionName: string, config?: any) => Promise; + post: (actionName: string, data?: any, config?: any) => Promise; + }; + + export const postRequest: any; + + export const pluginCustomPanel: any; + + export const regCustomPanel: any; + + export const pluginGroupPanel: any; + + export const regGroupPanel: any; + + export const messageInterpreter: { + name?: string; + explainMessage: (message: string) => React.ReactNode; + }[]; + + export const regMessageInterpreter: (interpreter: { + name?: string; + explainMessage: (message: string) => React.ReactNode; + }) => void; + + export const getMessageRender: (message: string) => React.ReactNode; + + export const regMessageRender: ( + render: (message: string) => React.ReactNode + ) => void; + + export const getMessageTextDecorators: any; + + export const regMessageTextDecorators: any; + + export const ChatInputActionContextProps: any; + + export const pluginChatInputActions: any; + + export const regChatInputAction: any; + + export const regSocketEventListener: (item: { + eventName: string; + eventFn: (...args: any[]) => void; + }) => void; + + export const pluginColorScheme: any; + + export const regPluginColorScheme: any; + + export const pluginInspectServices: any; + + export const regInspectService: any; + + export const pluginMessageExtraParsers: any; + + export const regMessageExtraParser: any; + + export const pluginRootRoute: any; + + export const regPluginRootRoute: any; + + export const pluginPanelActions: any; + + export const regPluginPanelAction: any; + + export const pluginPermission: any; + + export const regPluginPermission: (permission: { + /** + * 权限唯一key, 用于写入数据库 + * 如果为插件则权限点应当符合命名规范, 如: plugin.com.msgbyte.github.manage + */ + key: string; + /** + * 权限点显示名称 + */ + title: string; + /** + * 权限描述 + */ + desc: string; + /** + * 是否默认开启 + */ + default: boolean; + /** + * 是否依赖其他权限点 + */ + required?: string[]; + }) => void; + + export const pluginGroupPanelBadges: any; + + export const regGroupPanelBadge: any; + + export const pluginGroupTextPanelExtraMenus: any; + + export const regPluginGroupTextPanelExtraMenu: any; + + export const useGroupIdContext: () => string; + + export const useGroupPanelContext: () => { + groupId: string; + panelId: string; + } | null; + + export const useSocketContext: any; +} + +/** + * Tailchat 组件 + */ +declare module '@capital/component' { + export const Button: any; + + export const Checkbox: any; + + export const Input: any; + + export const Divider: any; + + export const Space: any; + + export const Menu: any; + + export const Table: any; + + export const Switch: any; + + export const Tooltip: any; + + /** + * @link https://ant.design/components/notification-cn/ + */ + export const notification: any; + + export const Empty: React.FC< + React.PropsWithChildren<{ + prefixCls?: string; + className?: string; + style?: React.CSSProperties; + imageStyle?: React.CSSProperties; + image?: React.ReactNode; + description?: React.ReactNode; + }> + >; + + export const TextArea: any; + + export const Avatar: any; + + export const SensitiveText: React.FC<{ className?: string; text: string }>; + + export const Icon: React.FC<{ icon: string } & React.SVGProps>; + + export const CopyableText: React.FC<{ + className?: string; + style?: React.CSSProperties; + config?: + | boolean + | { + text?: string; + onCopy?: (event?: React.MouseEvent) => void; + icon?: React.ReactNode; + tooltips?: boolean | React.ReactNode; + format?: 'text/plain' | 'text/html'; + }; + }>; + + export const WebFastForm: any; + + export const WebMetaForm: any; + + export const createMetaFormSchema: any; + + export const metaFormFieldSchema: any; + + export const Image: any; + + export const IconBtn: React.FC<{ + icon: string; + className?: string; + iconClassName?: string; + size?: 'small' | 'middle' | 'large'; + shape?: 'circle' | 'square'; + title?: string; + onClick?: React.MouseEventHandler; + }>; + + export const PillTabs: any; + + export const PillTabPane: any; + + export const LoadingSpinner: React.FC<{ tip?: string }>; + + export const FullModalField: any; + + export const DefaultFullModalInputEditorRender: any; + + export const DefaultFullModalTextAreaEditorRender: any; + + export const openModal: ( + content: React.ReactNode, + + props?: { + /** + * 是否显示右上角的关闭按钮 + * @default false + */ + closable?: boolean; + + /** + * 遮罩层是否可关闭 + */ + maskClosable?: boolean; + + /** + * 关闭modal的回调 + */ + onCloseModal?: () => void; + } + ) => number; + + export const closeModal: any; + + export const ModalWrapper: any; + + export const useModalContext: any; + + export const openConfirmModal: any; + + export const openReconfirmModal: any; + + export const Loadable: any; + + export const Loading: React.FC<{ + spinning: boolean; + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + }>; + + export const LoadingOnFirst: React.FC<{ + spinning: boolean; + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + }>; + + export const SidebarView: any; + + export const GroupPanelSelector: any; + + export const Emoji: any; + + export const PortalAdd: any; + + export const PortalRemove: any; + + export const ErrorBoundary: any; + + export const UserAvatar: any; + + export const UserName: React.FC<{ + userId: string; + className?: string; + }>; + + export const Markdown: any; +} diff --git a/server/plugins/com.msgbyte.iam/.ministarrc.js b/server/plugins/com.msgbyte.iam/.ministarrc.js new file mode 100644 index 00000000000..3c4db17957d --- /dev/null +++ b/server/plugins/com.msgbyte.iam/.ministarrc.js @@ -0,0 +1,14 @@ +const path = require('path'); + +module.exports = { + externalDeps: [ + 'react', + 'react-router', + 'axios', + 'styled-components', + 'zustand', + 'zustand/middleware/immer', + ], + pluginRoot: path.resolve(__dirname, './web'), + outDir: path.resolve(__dirname, '../../public'), +}; diff --git a/server/plugins/com.msgbyte.iam/models/iam.ts b/server/plugins/com.msgbyte.iam/models/iam.ts new file mode 100644 index 00000000000..a83e54a5911 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/models/iam.ts @@ -0,0 +1,37 @@ +import { db } from 'tailchat-server-sdk'; +const { getModelForClass, prop, modelOptions, TimeStamps } = db; + +@modelOptions({ + options: { + customName: 'p_iam', + }, +}) +export class IAM extends TimeStamps implements db.Base { + _id: db.Types.ObjectId; + id: string; + + /** + * 账号供应商 + * 如 Github + */ + @prop() + provider: string; + + /** + * 在账号供应商那边的唯一标识 + * 根据不同的供应商有不同的格式 + */ + @prop() + providerId: string; + + @prop() + userId: string; +} + +export type IAMDocument = db.DocumentType; + +const model = getModelForClass(IAM); + +export type IAMModel = typeof model; + +export default model; diff --git a/server/plugins/com.msgbyte.iam/package.json b/server/plugins/com.msgbyte.iam/package.json new file mode 100644 index 00000000000..0fa19dc92af --- /dev/null +++ b/server/plugins/com.msgbyte.iam/package.json @@ -0,0 +1,21 @@ +{ + "name": "tailchat-plugin-iam", + "version": "1.0.0", + "main": "index.js", + "author": "moonrailgun", + "description": "Unified identity authentication", + "license": "MIT", + "private": true, + "scripts": { + "build:web": "ministar buildPlugin all", + "build:web:watch": "ministar watchPlugin all" + }, + "devDependencies": { + "@types/react": "18.0.20", + "mini-star": "*" + }, + "dependencies": { + "got": "^11.8.3", + "tailchat-server-sdk": "*" + } +} diff --git a/server/plugins/com.msgbyte.iam/services/iam.service.ts b/server/plugins/com.msgbyte.iam/services/iam.service.ts new file mode 100644 index 00000000000..d05b94531b9 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/services/iam.service.ts @@ -0,0 +1,157 @@ +import { + TcService, + TcDbService, + TcPureContext, + db, + UserStructWithToken, +} from 'tailchat-server-sdk'; +import { isValidStaticAssetsUrl } from '../../../lib/utils'; +import type { IAMDocument, IAMModel } from '../models/iam'; +import { strategies } from '../strategies'; +import type { StrategyType } from '../strategies/types'; + +/** + * Federated Identity Management + * + * Unified identity authentication + */ +interface IAMService extends TcService, TcDbService {} +class IAMService extends TcService { + get serviceName() { + return 'plugin:com.msgbyte.iam'; + } + + onInit() { + this.registerLocalDb(require('../models/iam').default); + + const availableStrategies = strategies.filter((strategy) => + strategy.checkAvailable() + ); + + this.registerAction('availableStrategies', () => { + return availableStrategies.map((s) => ({ + name: s.name, + type: s.type, + icon: s.icon, + })); + }); + + availableStrategies.forEach((strategy) => { + const action = this.buildStrategyAction(strategy); + const strategyName = strategy.name; + this.registerAction(`${strategyName}.loginUrl`, action.loginUrl); + this.registerAction(`${strategyName}.redirect`, action.redirect); + + this.registerAuthWhitelist([ + `/${strategyName}/loginUrl`, + `/${strategyName}/redirect`, + ]); + }); + + this.registerAuthWhitelist(['/availableStrategies']); + } + + buildStrategyAction(strategy: StrategyType) { + const strategyName = strategy.name; + + return { + loginUrl: async (ctx: TcPureContext) => { + return strategy.getUrl(); + }, + redirect: async (ctx: TcPureContext<{ code: string }>) => { + const code = ctx.params.code; + + if (!code) { + throw new Error(JSON.stringify(ctx.params)); + } + + const providerUserInfo = await strategy.getUserInfo(code); + + const iamRecord = await this.adapter.model.findOne({ + provider: strategyName, + providerId: providerUserInfo.id, + }); + + if (!!iamRecord) { + // 存在记录,直接签发 token + const token = await ctx.call('user.signUserToken', { + userId: iamRecord.userId, + }); + + return generatePostMessageHtml({ + type: 'token', + token: token, + }); + } + + const username = providerUserInfo.username; + const email = + providerUserInfo.email || + `${username}.${strategyName}@iam.msgbyte.com`; + + // 不存在记录,查找是否已经注册过,如果已经注册过需要绑定,如果没有注册过则创建账号并绑定用户关系 + const userInfo = await ctx.call('user.findUserByEmail', { + email, + }); + if (!!userInfo) { + // 用户已存在,需要登录后才能确定绑定关系 + return generatePostMessageHtml({ type: 'existed' }); + } + + let avatar = providerUserInfo.avatar; + if (avatar && isValidStaticAssetsUrl(avatar)) { + try { + const { url } = (await ctx.call( + 'file.saveFileWithUrl', + { + fileUrl: avatar, + }, + { + timeout: 3000, + } + )) as { url: string }; + avatar = url; + } catch (err) { + this.logger.error('Cannot storage avatar', avatar, err); + } + } + + const newUserInfo: UserStructWithToken = await ctx.call( + 'user.register', + { + email, + nickname: providerUserInfo.nickname, + password: String(new db.Types.ObjectId()), // random password + avatar, + } + ); + + await this.adapter.model.create({ + provider: strategyName, + providerId: providerUserInfo.id, + userId: String(newUserInfo._id), + }); + + return generatePostMessageHtml({ + type: 'token', + isNew: true, + token: newUserInfo.token, + }); + }, + }; + } +} + +function generatePostMessageHtml(obj: Record) { + const IAM_FE_URL = process.env.IAM_FE_URL || '*'; + + return { + __raw: true, + html: `
Waiting for main window close
`, + }; +} + +export default IAMService; diff --git a/server/plugins/com.msgbyte.iam/strategies/github.ts b/server/plugins/com.msgbyte.iam/strategies/github.ts new file mode 100644 index 00000000000..b203e1cc68a --- /dev/null +++ b/server/plugins/com.msgbyte.iam/strategies/github.ts @@ -0,0 +1,72 @@ +import { config } from 'tailchat-server-sdk'; +import type { StrategyType } from './types'; +import got from 'got'; + +const clientInfo = { + id: process.env.IAM_GITHUB_ID, + secret: process.env.IAM_GITHUB_SECRET, +}; + +const authorize_uri = + process.env.IAM_GITHUB_URI_AUTHORIZE || + 'https://github.com/login/oauth/authorize'; +const access_token_uri = + process.env.IAM_GITHUB_URI_ACCESS_TOKEN || + 'https://github.com/login/oauth/access_token'; +const userinfo_uri = + process.env.IAM_GITHUB_URI_USERINFO || 'https://api.github.com/user'; +const redirect_uri = `${config.apiUrl}/api/plugin:com.msgbyte.iam/github/redirect`; + +export const GithubStrategy: StrategyType = { + name: 'github', + type: 'oauth', + icon: '/images/avatar/github-dark.svg', + checkAvailable: () => !!clientInfo.id && !!clientInfo.secret, + getUrl: () => { + return `${authorize_uri}?client_id=${clientInfo.id}&redirect_uri=${redirect_uri}`; + }, + getUserInfo: async (code) => { + console.log('[github oauth] authorization code:', code); + + const tokenResponse = await got + .post(access_token_uri, { + searchParams: { + client_id: clientInfo.id, + client_secret: clientInfo.secret, + code: code, + }, + headers: { + accept: 'application/json', + }, + }) + .json<{ access_token: string }>(); + + const accessToken = tokenResponse.access_token; + console.log(`[github oauth] access token: ${accessToken}`); + + const result = await got + .get(userinfo_uri, { + headers: { + accept: 'application/json', + Authorization: `token ${accessToken}`, + }, + }) + .json<{ + id: number; + login: string; + name: string; + email: string; + avatar_url: string; + }>(); + + console.log(`[github oauth] user info:`, result); + + return { + id: String(result.id), + nickname: result.name ?? result.login, + username: result.login, + email: result.email, + avatar: result.avatar_url, + }; + }, +}; diff --git a/server/plugins/com.msgbyte.iam/strategies/index.ts b/server/plugins/com.msgbyte.iam/strategies/index.ts new file mode 100644 index 00000000000..fd07cadecf8 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/strategies/index.ts @@ -0,0 +1,3 @@ +import { GithubStrategy } from './github'; + +export const strategies = [GithubStrategy]; diff --git a/server/plugins/com.msgbyte.iam/strategies/types.ts b/server/plugins/com.msgbyte.iam/strategies/types.ts new file mode 100644 index 00000000000..66d09b0f818 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/strategies/types.ts @@ -0,0 +1,14 @@ +export interface StrategyType { + name: string; + type: 'oauth'; + icon: string; + checkAvailable: () => boolean; + getUrl: () => string; + getUserInfo: (code: string) => Promise<{ + id: string; + nickname: string; + username: string; + email: string; + avatar: string; + }>; +} diff --git a/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/manifest.json b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/manifest.json new file mode 100644 index 00000000000..d21a3ca29a0 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/manifest.json @@ -0,0 +1,12 @@ +{ + "label": "Identity and Access Management", + "label.zh-CN": "IAM 插件", + "name": "com.msgbyte.iam", + "url": "{BACKEND}/plugins/com.msgbyte.iam/index.js", + "documentUrl": "https://tailchat.msgbyte.com/docs/advanced-usage/plugins/com.msgbyte.iam", + "version": "0.0.0", + "author": "moonrailgun", + "description": "Provide Tailchat with the function of conveniently accessing external account systems", + "description.zh-CN": "为Tailchat提供方便的接入外部账户系统的功能", + "requireRestart": true +} diff --git a/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/package.json b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/package.json new file mode 100644 index 00000000000..186b7928300 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/package.json @@ -0,0 +1,16 @@ +{ + "name": "@plugins/com.msgbyte.iam", + "main": "src/index.tsx", + "version": "0.0.0", + "description": "Identity and Access Management", + "private": true, + "scripts": { + "sync:declaration": "tailchat declaration github" + }, + "dependencies": {}, + "devDependencies": { + "@types/styled-components": "^5.1.26", + "react": "18.2.0", + "styled-components": "^5.3.6" + } +} diff --git a/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/IAMAction.tsx b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/IAMAction.tsx new file mode 100644 index 00000000000..361d4b4e334 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/IAMAction.tsx @@ -0,0 +1,105 @@ +import React, { useEffect, useRef } from 'react'; +import { + useAsync, + showToasts, + useNavigate, + loginWithToken, + setUserJWT, + useIsMobile, +} from '@capital/common'; +import { Divider, Image, Tooltip } from '@capital/component'; +import { request } from './request'; +import { Translate } from './translate'; + +export const IAMAction: React.FC = React.memo(() => { + const { loading, value: strategies } = useAsync(async () => { + const { data: strategies } = await request.get('availableStrategies'); + + return strategies; + }, []); + const newWin = useRef(); + const navigate = useNavigate(); + const isMobile = useIsMobile(); + + useEffect(() => { + const fn = (event: MessageEvent) => { + if (newWin.current && event.source === newWin.current) { + newWin.current.close(); + + const payload = event.data; + + if (payload.type === 'existed') { + showToasts(Translate.accountExistedTip, 'warning'); + } else if (payload.type === 'infoDeviant') { + showToasts(Translate.infoDeviantTip, 'error'); + } else if (payload.type === 'token') { + const token = payload.token; + setUserJWT(token) + .then(loginWithToken(token)) + .then(() => { + navigate('/main'); + }) + .catch((err) => { + console.error(err); + showToasts(Translate.loginFailed, 'error'); + }); + } else { + console.warn('Unknown payload type', payload.type); + } + } + }; + window.addEventListener('message', fn); + + return () => { + window.removeEventListener('message', fn); + }; + }, []); + + if (loading) { + return null; + } + + if (Array.isArray(strategies) && strategies.length > 0) { + return ( +
+ {Translate.iamLogin} + {isMobile ? ( +
+ {Translate.notSupportMobile} +
+ ) : ( +
+ {strategies.map((s) => ( + + { + if (s.type === 'oauth') { + const { data: url } = await request.get( + `${s.name}.loginUrl` + ); + + const win = window.open(url, 'square', 'frame=true'); + newWin.current = win; + } + }} + /> + + ))} +
+ )} +
+ ); + } + + return null; +}); +IAMAction.displayName = 'IAMAction'; diff --git a/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/index.tsx b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/index.tsx new file mode 100644 index 00000000000..cb93ab78945 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/index.tsx @@ -0,0 +1,9 @@ +import { regLoginAction } from '@capital/common'; +import { IAMAction } from './IAMAction'; + +console.log('Plugin Identity and Access Management is loaded'); + +regLoginAction({ + name: 'plugin:com.msgbyte.iam/loginAction', + component: IAMAction, +}); diff --git a/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/request.ts b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/request.ts new file mode 100644 index 00000000000..0da13e3c104 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/request.ts @@ -0,0 +1,3 @@ +import { createPluginRequest } from '@capital/common'; + +export const request = createPluginRequest('com.msgbyte.iam'); diff --git a/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/translate.ts b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/translate.ts new file mode 100644 index 00000000000..56617b3b099 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/src/translate.ts @@ -0,0 +1,28 @@ +import { localTrans } from '@capital/common'; + +export const Translate = { + iamLogin: localTrans({ + 'zh-CN': '第三方登录', + 'en-US': 'Third party login', + }), + loginFailed: localTrans({ + 'zh-CN': '登录失败', + 'en-US': 'Login Failed', + }), + accountExistedTip: localTrans({ + // 'zh-CN': '账号已存在,你应该在登录后绑定账号', + // 'en-US': 'Account Existed, You should bind provider account after login', + 'zh-CN': '账号已存在,请使用账号密码登录', + 'en-US': 'Account Existed, please log in with account password', + }), + infoDeviantTip: localTrans({ + // 'zh-CN': '账号已存在,你应该在登录后绑定账号', + // 'en-US': 'Account Existed, You should bind provider account after login', + 'zh-CN': '账号信息异常,请使用账号密码登录', + 'en-US': 'Account Info Deviant, please log in with account password', + }), + notSupportMobile: localTrans({ + 'zh-CN': '第三方登录功能暂不支持移动端使用', + 'en-US': 'The third-party login function does not support mobile use', + }), +}; diff --git a/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/tsconfig.json b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/tsconfig.json new file mode 100644 index 00000000000..d9b47ed0d71 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react", + "importsNotUsedAsValues": "error" + } +} diff --git a/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/types/tailchat.d.ts b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/types/tailchat.d.ts new file mode 100644 index 00000000000..49f524aedb1 --- /dev/null +++ b/server/plugins/com.msgbyte.iam/web/plugins/com.msgbyte.iam/types/tailchat.d.ts @@ -0,0 +1,2 @@ +declare module '@capital/common'; +declare module '@capital/component'; diff --git a/server/plugins/com.msgbyte.linkmeta/.ministarrc.js b/server/plugins/com.msgbyte.linkmeta/.ministarrc.js new file mode 100644 index 00000000000..ab39d260d6c --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/.ministarrc.js @@ -0,0 +1,7 @@ +const path = require('path'); + +module.exports = { + externalDeps: ['react'], + pluginRoot: path.resolve(__dirname, './web'), + outDir: path.resolve(__dirname, '../../public'), +}; diff --git a/server/plugins/com.msgbyte.linkmeta/models/linkmeta.ts b/server/plugins/com.msgbyte.linkmeta/models/linkmeta.ts new file mode 100644 index 00000000000..b98ea2bb3e8 --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/models/linkmeta.ts @@ -0,0 +1,36 @@ +import { + getModelForClass, + DocumentType, + modelOptions, + prop, + Severity, + index, +} from '@typegoose/typegoose'; +import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; +import type { Types } from 'mongoose'; + +@modelOptions({ + options: { + customName: 'p_linkmeta', + allowMixed: Severity.ALLOW, + }, +}) +@index({ url: 1 }) +export class Linkmeta extends TimeStamps implements Base { + _id: Types.ObjectId; + id: string; + + @prop() + url: string; + + @prop() + data: any; +} + +export type LinkmetaDocument = DocumentType; + +const model = getModelForClass(Linkmeta); + +export type LinkmetaModel = typeof model; + +export default model; diff --git a/server/plugins/com.msgbyte.linkmeta/package.json b/server/plugins/com.msgbyte.linkmeta/package.json new file mode 100644 index 00000000000..bce337e379f --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/package.json @@ -0,0 +1,21 @@ +{ + "name": "tailchat-plugin-linkmeta", + "version": "1.0.0", + "main": "index.js", + "author": "moonrailgun", + "license": "MIT", + "private": true, + "scripts": { + "build:web": "ministar buildPlugin all", + "build:web:watch": "ministar watchPlugin all" + }, + "devDependencies": { + "less": "^4.1.2", + "mini-star": "^1.2.8" + }, + "dependencies": { + "got": "11.8.3", + "link-preview-js": "^2.1.10", + "lodash": "^4.17.21" + } +} diff --git a/server/plugins/com.msgbyte.linkmeta/services/linkmeta.service.ts b/server/plugins/com.msgbyte.linkmeta/services/linkmeta.service.ts new file mode 100644 index 00000000000..d53e5d413b3 --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/services/linkmeta.service.ts @@ -0,0 +1,82 @@ +import { TcService, TcContext, TcDbService } from 'tailchat-server-sdk'; +import type { LinkmetaDocument, LinkmetaModel } from '../models/linkmeta'; +import { fetchLinkPreview } from '../utils/fetchLinkPreview'; +import { fetchSpecialWebsiteMeta } from '../utils/specialWebsiteMeta'; + +/** + * 链接信息服务 + */ +interface LinkmetaService + extends TcService, + TcDbService {} +class LinkmetaService extends TcService { + get serviceName() { + return 'plugin:com.msgbyte.linkmeta'; + } + + onInit() { + this.registerLocalDb(require('../models/linkmeta').default); + + this.registerAction('fetch', this.fetch, { + params: { + url: 'string', + }, + }); + } + + /** + * 获取连接预览信息 + */ + private async fetch(ctx: TcContext<{ url: string }>) { + const url = ctx.params.url; + + const meta = await this.adapter.model.findOne( + { + url, + }, + undefined, + { + sort: { + _id: -1, + }, + } + ); + + if ( + !meta || + new Date(meta.createdAt).valueOf() < + new Date().valueOf() - 1000 * 60 * 60 * 24 + ) { + // 没有找到或已过期(过期时间24小时) + const data = await fetchLinkPreview(url); + + // 转存图片 + if (Array.isArray(data.images) && data.images.length > 0) { + try { + const { url } = (await ctx.call('file.saveFileWithUrl', { + fileUrl: data.images[0], + })) as { url: string }; + data.images[0] = url; + } catch (e) {} + } + + // 尝试对特定网站获取更多信息 + const overwrite = await fetchSpecialWebsiteMeta(url); + Object.assign(data, overwrite); + + await this.adapter.model.create({ + url, + data, + }); + + return { ...data, isCache: false }; + } + + return { + ...meta.data, + isCache: true, + }; + } +} + +export default LinkmetaService; diff --git a/server/plugins/com.msgbyte.linkmeta/test/__snapshots__/linkmeta.spec.ts.snap b/server/plugins/com.msgbyte.linkmeta/test/__snapshots__/linkmeta.spec.ts.snap new file mode 100644 index 00000000000..3375fdca72e --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/test/__snapshots__/linkmeta.spec.ts.snap @@ -0,0 +1,66 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Test "plugin:com.msgbyte.linkinfo" service Test "plugin:com.msgbyte.linkmeta.fetch" normal 1`] = ` +Object { + "contentType": "text/html", + "description": undefined, + "favicons": Array [ + "https://www.baidu.com/favicon.ico", + ], + "images": Array [], + "isCache": false, + "mediaType": "website", + "siteName": undefined, + "title": "", + "url": "https://www.baidu.com/?fortest", + "videos": Array [], +} +`; + +exports[`Test "plugin:com.msgbyte.linkinfo" service Test "plugin:com.msgbyte.linkmeta.fetch" pure image 1`] = ` +Object { + "contentType": "image/jpeg", + "favicons": Array [ + "https://www.w3schools.com/favicon.ico", + ], + "isCache": true, + "mediaType": "image", + "url": "https://www.w3schools.com/html/pic_trulli.jpg", +} +`; + +exports[`Test "plugin:com.msgbyte.linkinfo" service Test "plugin:com.msgbyte.linkmeta.fetch" pure mp3 1`] = ` +Object { + "contentType": "audio/mpeg", + "favicons": Array [ + "https://www.w3schools.com/favicon.ico", + ], + "isCache": true, + "mediaType": "audio", + "url": "https://www.w3schools.com/html/horse.mp3", +} +`; + +exports[`Test "plugin:com.msgbyte.linkinfo" service Test "plugin:com.msgbyte.linkmeta.fetch" pure ogg 1`] = ` +Object { + "contentType": "video/ogg", + "favicons": Array [ + "https://www.w3schools.com/favicon.ico", + ], + "isCache": true, + "mediaType": "video", + "url": "https://www.w3schools.com/html/horse.ogg", +} +`; + +exports[`Test "plugin:com.msgbyte.linkinfo" service Test "plugin:com.msgbyte.linkmeta.fetch" pure video 1`] = ` +Object { + "contentType": "video/mp4", + "favicons": Array [ + "https://www.w3schools.com/favicon.ico", + ], + "isCache": true, + "mediaType": "video", + "url": "https://www.w3schools.com/html/mov_bbb.mp4", +} +`; diff --git a/server/plugins/com.msgbyte.linkmeta/test/linkmeta.spec.ts b/server/plugins/com.msgbyte.linkmeta/test/linkmeta.spec.ts new file mode 100644 index 00000000000..fedb5b1d1be --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/test/linkmeta.spec.ts @@ -0,0 +1,80 @@ +import { createTestServiceBroker } from '../../../test/utils'; +import LinkmetaService from '../services/linkmeta.service'; +import { Types } from 'mongoose'; +import _ from 'lodash'; + +describe('Test "plugin:com.msgbyte.linkinfo" service', () => { + const { broker, service, insertTestData } = + createTestServiceBroker(LinkmetaService); + + describe('Test "plugin:com.msgbyte.linkmeta.fetch"', () => { + test('normal', async () => { + const url = 'https://www.baidu.com/?fortest'; + const meta: any = await broker.call('plugin:com.msgbyte.linkmeta.fetch', { + url, + }); + + try { + expect(meta).toHaveProperty('url', url); + expect(meta).toHaveProperty('isCache', false); + expect(meta).toHaveProperty('title'); + expect(meta).toHaveProperty('siteName'); + expect(meta).toHaveProperty('description'); + expect(meta).toHaveProperty('mediaType', 'website'); + expect(meta).toHaveProperty('contentType', 'text/html'); + expect(meta).toHaveProperty('images'); + expect(meta).toHaveProperty('videos'); + expect(meta).toHaveProperty('favicons'); + expect(meta).toMatchSnapshot(); + + const metaWithCache: any = await broker.call( + 'plugin:com.msgbyte.linkmeta.fetch', + { + url, + } + ); + expect(metaWithCache).toHaveProperty('isCache', true); + } finally { + await service.adapter.model.deleteOne({ + url, + }); + } + }); + + test('pure video', async () => { + const url = 'https://www.w3schools.com/html/mov_bbb.mp4'; + const meta: any = await broker.call('plugin:com.msgbyte.linkmeta.fetch', { + url, + }); + + expect(meta).toMatchSnapshot(); + }); + + test('pure image', async () => { + const url = 'https://www.w3schools.com/html/pic_trulli.jpg'; + const meta: any = await broker.call('plugin:com.msgbyte.linkmeta.fetch', { + url, + }); + + expect(meta).toMatchSnapshot(); + }); + + test('pure ogg', async () => { + const url = 'https://www.w3schools.com/html/horse.ogg'; + const meta: any = await broker.call('plugin:com.msgbyte.linkmeta.fetch', { + url, + }); + + expect(meta).toMatchSnapshot(); + }); + + test('pure mp3', async () => { + const url = 'https://www.w3schools.com/html/horse.mp3'; + const meta: any = await broker.call('plugin:com.msgbyte.linkmeta.fetch', { + url, + }); + + expect(meta).toMatchSnapshot(); + }); + }); +}); diff --git a/server/plugins/com.msgbyte.linkmeta/utils/__tests__/fetchLinkPreview.spec.ts b/server/plugins/com.msgbyte.linkmeta/utils/__tests__/fetchLinkPreview.spec.ts new file mode 100644 index 00000000000..8197e1121ed --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/utils/__tests__/fetchLinkPreview.spec.ts @@ -0,0 +1,52 @@ +import { fetchLinkPreview } from '../fetchLinkPreview'; + +const mockGetLinkPreviewFn = jest.fn(); +jest.mock('link-preview-js', () => ({ + getLinkPreview: async () => { + mockGetLinkPreviewFn(); + }, +})); + +describe('Test "fetchLinkPreview"', () => { + test( + 'fetchLinkPreview should merge same request', + async () => { + await Promise.all([ + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + ]); + + expect(mockGetLinkPreviewFn.mock.calls.length).toBe(1); + + await sleep(5 * 1000); // 度过窗口期 + + await Promise.all([ + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + fetchLinkPreview('foo'), + ]); + + expect(mockGetLinkPreviewFn.mock.calls.length).toBe(2); + }, + 10 * 1000 + ); +}); + +function sleep(ms: number): Promise { + return new Promise((resolve) => + setTimeout(() => { + resolve(); + }, ms) + ); +} diff --git a/server/plugins/com.msgbyte.linkmeta/utils/fetchLinkPreview.ts b/server/plugins/com.msgbyte.linkmeta/utils/fetchLinkPreview.ts new file mode 100644 index 00000000000..551c58637af --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/utils/fetchLinkPreview.ts @@ -0,0 +1,29 @@ +import { getLinkPreview } from 'link-preview-js'; + +/** + * 请求管理 + */ +const cacheRequestList: Record> = {}; + +/** + * 获取网页元数据信息 + * @param url 网址 + * @returns + */ +export async function fetchLinkPreview(url: string): Promise { + if (cacheRequestList[url]) { + // 如果有正在请求的信息 + return Promise.resolve(cacheRequestList[url]); + } + + const promise = getLinkPreview(url); + cacheRequestList[url] = promise; + + return Promise.resolve(promise).finally(() => { + setTimeout(() => { + delete cacheRequestList[url]; + }, 2 * 1000); // 窗口期, 请求完毕后2s内依旧会复用原来的接口 + }); + + // return promise; +} diff --git a/server/plugins/com.msgbyte.linkmeta/utils/specialWebsiteMeta.ts b/server/plugins/com.msgbyte.linkmeta/utils/specialWebsiteMeta.ts new file mode 100644 index 00000000000..e720a88b921 --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/utils/specialWebsiteMeta.ts @@ -0,0 +1,49 @@ +import got from 'got'; +import _ from 'lodash'; + +/** + * 获取特定页面的信息 + */ + +// + +const specialWebsiteMetaFetchers = [ + { + // bilibili + match: (url: string) => url.startsWith('https://www.bilibili.com/video/BV'), + overwrite: async (url: string) => { + // from https://github.com/simon300000/bili-api/blob/master/src/api/api.bilibili.com.js + const bvid = _.last(url.split('?')[0].split('/').filter(Boolean)); + + const { data } = await got( + `https://api.bilibili.com/x/web-interface/view?bvid=${bvid}` + ).json(); + + const aid = _.get(data, 'aid'); + const cid = _.get(data, 'cid'); + if (aid && bvid && cid) { + return { + videos: [ + `https://player.bilibili.com/player.html?aid=${aid}&bvid=${bvid}&cid=${cid}&page=1&autoplay=0`, + ], + }; + } + }, + }, +]; + +/** + * 获取更多的信息 + * @param url 请求数据的地址 + */ +export async function fetchSpecialWebsiteMeta(url: string) { + const matched = specialWebsiteMetaFetchers.find((f) => f.match(url)); + + if (matched) { + const overwrite = await matched.overwrite(url); + + return overwrite ?? {}; + } + + return {}; +} diff --git a/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/manifest.json b/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/manifest.json new file mode 100644 index 00000000000..42fb9796a52 --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/manifest.json @@ -0,0 +1,11 @@ +{ + "label": "Url metadata display", + "label.zh-CN": "Url元数据展示", + "name": "com.msgbyte.linkmeta", + "url": "{BACKEND}/plugins/com.msgbyte.linkmeta/index.js", + "version": "0.0.0", + "author": "msgbyte", + "description": "Parse and get the overview of url information in the chat information, such as title/overview/thumbnail, support media path, directly display media player (specially support bilibili, automatically load the iframe player of bilibili)", + "description.zh-CN": "解析并获取在聊天信息中的url信息概述,如标题/概述/缩略图, 支持媒体路径,直接显示媒体播放器(特殊支持bilibili,自动加载b站iframe播放器)", + "requireRestart": false +} diff --git a/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/package.json b/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/package.json new file mode 100644 index 00000000000..9f857d47411 --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/package.json @@ -0,0 +1,10 @@ +{ + "name": "@plugins/com.msgbyte.linkmeta", + "main": "src/index.tsx", + "version": "0.0.0", + "private": true, + "dependencies": { + "lodash-es": "^4.17.21", + "url-regex": "^5.0.0" + } +} diff --git a/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/src/UrlMetaPreviewer/Audio.tsx b/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/src/UrlMetaPreviewer/Audio.tsx new file mode 100644 index 00000000000..177707e7173 --- /dev/null +++ b/server/plugins/com.msgbyte.linkmeta/web/plugins/com.msgbyte.linkmeta/src/UrlMetaPreviewer/Audio.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import _get from 'lodash/get'; +import type { LinkMeta } from './types'; + +export const UrlMetaAudio: React.FC<{ + meta: LinkMeta; +}> = React.memo(({ meta }) => { + return