From 2b18076691113048bf9a4b5c3ac965e5368f20fa Mon Sep 17 00:00:00 2001 From: Arnab Paryali Date: Sat, 3 Sep 2022 18:54:39 +0530 Subject: [PATCH] refactor: migrate to deno (#22) * refactor: migrate to deno * ci: attempt fix * remove more code * ci: pass deno fmt * refactor: dotenv, envalid & graphql_request * make it 100% working with deno --- .eslintrc | 19 - LICENSE => .github/LICENSE | 0 README.md => .github/README.md | 19 +- .github/renovate.json | 4 - .github/workflows/CI.yml | 72 +- .gitignore | 2 - .prettierrc | 6 - .vscode/settings.json | 9 + Procfile | 1 - ava.config.ts | 9 - deno.json | 7 + env.ts | 8 + import_map.json | 11 + package.json | 47 - pnpm-lock.yaml | 2935 ----------------- server.ts | 9 + serverless.ts | 5 + .../__snapshots__/getMedia.test.ts.snap | 93 + .../__snapshots__/inlineResults.test.ts.snap | 262 ++ src/anilist/__snapshots__/search.test.ts.snap | 89 + src/anilist/getMedia.test.ts | 77 +- src/anilist/getMedia.ts | 15 +- src/anilist/gqlClient.ts | 6 +- src/anilist/index.ts | 13 - src/anilist/inlineResults.test.ts | 209 +- src/anilist/inlineResults.ts | 10 +- src/anilist/mod.ts | 7 + src/anilist/search.test.ts | 88 +- src/anilist/search.ts | 13 +- src/bot.ts | 20 +- src/commands/anime.ts | 35 +- src/commands/help.ts | 10 +- src/commands/id.ts | 12 +- src/commands/index.ts | 13 - src/commands/manga.ts | 37 +- src/commands/mod.ts | 13 + src/commands/start.ts | 18 +- src/express.ts | 19 - src/handlers/callbackQuery.ts | 44 +- src/handlers/index.ts | 8 - src/handlers/inlineQuery.ts | 58 +- src/handlers/mod.ts | 8 + .../index.ts => middleware/mod.ts} | 4 +- src/{middlewares => middleware}/ping.ts | 10 +- src/server.ts | 9 - src/utils.ts | 36 +- tsconfig.base.json | 12 - tsconfig.json | 6 - 48 files changed, 729 insertions(+), 3688 deletions(-) delete mode 100644 .eslintrc rename LICENSE => .github/LICENSE (100%) rename README.md => .github/README.md (61%) delete mode 100644 .github/renovate.json delete mode 100644 .prettierrc create mode 100644 .vscode/settings.json delete mode 100644 Procfile delete mode 100644 ava.config.ts create mode 100644 deno.json create mode 100644 env.ts create mode 100644 import_map.json delete mode 100644 package.json delete mode 100644 pnpm-lock.yaml create mode 100644 server.ts create mode 100644 serverless.ts create mode 100644 src/anilist/__snapshots__/getMedia.test.ts.snap create mode 100644 src/anilist/__snapshots__/inlineResults.test.ts.snap create mode 100644 src/anilist/__snapshots__/search.test.ts.snap delete mode 100644 src/anilist/index.ts create mode 100644 src/anilist/mod.ts delete mode 100644 src/commands/index.ts create mode 100644 src/commands/mod.ts delete mode 100644 src/express.ts delete mode 100644 src/handlers/index.ts create mode 100644 src/handlers/mod.ts rename src/{middlewares/index.ts => middleware/mod.ts} (55%) rename src/{middlewares => middleware}/ping.ts (53%) delete mode 100644 src/server.ts delete mode 100644 tsconfig.base.json delete mode 100644 tsconfig.json diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 98863fb..0000000 --- a/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "ignorePatterns": ["build/**", "*.config.js"], - "rules": { - "curly": [1, "all"], - "@typescript-eslint/no-unused-vars": [ - 1, - { "vars": "all", "args": "after-used", "argsIgnorePattern": "^_" } - ] - } -} \ No newline at end of file diff --git a/LICENSE b/.github/LICENSE similarity index 100% rename from LICENSE rename to .github/LICENSE diff --git a/README.md b/.github/README.md similarity index 61% rename from README.md rename to .github/README.md index 40c6b0a..00f7974 100644 --- a/README.md +++ b/.github/README.md @@ -1,28 +1,27 @@ -# AnimeDB-tgbot +# AnimeDB-tgbot -A [Telegram Bot](https://telegram.dog/animedb_bot) to Search Anime & Manga Details using [AniList](https://anilist.co) API +A [Telegram Bot](https://telegram.dog/animedb_bot) to Search Anime & Manga +Details using [AniList](https://anilist.co) API [![CI](https://github.com/ArnabXD/AnimeDB-tgbot/actions/workflows/CI.yml/badge.svg)](https://github.com/ArnabXD/AnimeDB-tgbot/actions/workflows/CI.yml) + ### Run Locally ```shell git clone https://github.com/ArnabXD/AnimeDB-tgbot.git cd AnimeDB-tgbot -pnpm install -pnpm run build -vim .env -pnpm run start +deno task start ``` + #### .env File ``` BOT_TOKEN=YOUR BOT TOKEN FROM @BOTFATHER - -# OPTIONAL FOR WEBHOOK -PORT=yourWebhookPort ``` ### License & Copyright : -- This Project is [GNU General Public License v3.0](https://github.com/ArnabXD/AnimeDB-tgbot/blob/main/LICENSE) Licensed +- This Project is + [GNU General Public License v3.0](https://github.com/ArnabXD/AnimeDB-tgbot/blob/main/LICENSE) + Licensed - Copyright 2021 by [ArnabXD](https://telegram.dog/Arnab431) diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index a065441..0000000 --- a/.github/renovate.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": ["config:base"], - "labels": ["dependencies"] -} diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fba471b..d96716c 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -12,78 +12,40 @@ jobs: if: "!contains(github.event.head_commit.message, '#skip-lint')" steps: - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2.2.2 + - uses: denoland/setup-deno@v1 with: - version: 7.0.0 - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: "16" - cache: pnpm - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile + deno-version: vx.x.x + - name: Linter Check + run: deno lint - - name: Run Linter - run: pnpm run lint - - test: + fmt: runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '#skip-test')" + if: "!contains(github.event.head_commit.message, '#skip-fmt')" steps: - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2.2.2 - with: - version: 7.0.0 - - name: Setup Node - uses: actions/setup-node@v3 + - uses: denoland/setup-deno@v1 with: - node-version: "16" - cache: pnpm - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - - - name: Run Ava Tests - run: pnpm run test + deno-version: vx.x.x + - name: Formatter Check + run: deno fmt --check - build: + test: runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '#skip-build')" + if: "!contains(github.event.head_commit.message, '#skip-test')" steps: - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2.2.2 + - uses: denoland/setup-deno@v1 with: - version: 7.0.0 - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: "16" - cache: pnpm - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - - - name: Build - run: pnpm run build + deno-version: vx.x.x + - name: Run Tests + run: deno test --allow-all release: runs-on: ubuntu-latest - needs: [ lint, build, test ] + needs: [ lint, fmt, test ] if: startsWith(github.ref, 'refs/tags/') steps: - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2.2.2 - with: - version: 7.0.0 - - uses: actions/setup-node@v3 - with: - node-version: '16' - cache: pnpm - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - - uses: softprops/action-gh-release@v1 with: generate_release_notes: true diff --git a/.gitignore b/.gitignore index 6ed9f88..2eea525 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -build/ -node_modules/ .env \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 6e02931..0000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "bracketSpacing": true, - "singleQuote": true, - "trailingComma": "none", - "arrowParens": "always" -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9f5f00e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "deno.enable": true, + "deno.lint": true, + "[typescript]": { + "editor.defaultFormatter": "denoland.vscode-deno" + }, + "prettier.enable": false, + "editor.formatOnSave": true +} diff --git a/Procfile b/Procfile deleted file mode 100644 index bef5264..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: npm run start \ No newline at end of file diff --git a/ava.config.ts b/ava.config.ts deleted file mode 100644 index 40de406..0000000 --- a/ava.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -export default { - typescript: { - rewritePaths: { - 'src/': 'build/' - }, - extensions: ['ts'], - compile: false - } -}; diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..86319f5 --- /dev/null +++ b/deno.json @@ -0,0 +1,7 @@ +{ + "importMap": "./import_map.json", + "tasks": { + "server": "deno run --allow-net --allow-read --allow-env server.ts", + "serverless": "deno run --allow-net --allow-read --allow-env serverless.ts" + } +} diff --git a/env.ts b/env.ts new file mode 100644 index 0000000..730aabc --- /dev/null +++ b/env.ts @@ -0,0 +1,8 @@ +import { config } from "dotenv"; +import { cleanEnv, str } from "envalid"; + +await config({ export: true }); + +export default cleanEnv(Deno.env.toObject(), { + BOT_TOKEN: str(), +}); diff --git a/import_map.json b/import_map.json new file mode 100644 index 0000000..1813f80 --- /dev/null +++ b/import_map.json @@ -0,0 +1,11 @@ +{ + "imports": { + "grammy": "https://deno.land/x/grammy@v1.11.0/mod.ts", + "grammy/": "https://deno.land/x/grammy@v1.11.0/", + "gql": "https://raw.githubusercontent.com/ArnabXD/graphql-request/temp/mod.ts", + "dotenv": "https://deno.land/std@0.154.0/dotenv/mod.ts", + "envalid": "https://deno.land/x/envalid@0.1.2/mod.ts", + "server": "https://deno.land/std@0.154.0/http/server.ts", + "testing/": "https://deno.land/std@0.154.0/testing/" + } +} diff --git a/package.json b/package.json deleted file mode 100644 index 5119eda..0000000 --- a/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "animedb-tgbot", - "version": "3.0.0", - "description": "Fetch Anime and Manga Details from Anilist.Co within telegram", - "main": "src/server.ts", - "scripts": { - "build": "rimraf build && tsc --project tsconfig.json", - "start": "node ./build/server", - "test": "rimraf build && tsc --project tsconfig.base.json && ava", - "prettify": "prettier --write \"./src/**/*.ts\"", - "lint": "eslint ./src/**/*.ts --max-warnings=0", - "dev": "nodemon src/server.ts" - }, - "keywords": [ - "Telegram", - "bot", - "grammy" - ], - "private": true, - "author": "@ArnabXD ", - "license": "MIT", - "dependencies": { - "dotenv": "^16.0.1", - "grammy": "^1.8.3", - "graphql": "^16.5.0", - "graphql-request": "^4.3.0" - }, - "devDependencies": { - "@ava/typescript": "^3.0.1", - "@grammyjs/types": "github:grammyjs/types", - "@types/express": "^4.17.13", - "@types/node": "17.0.40", - "@typescript-eslint/eslint-plugin": "^5.27.1", - "@typescript-eslint/parser": "^5.27.1", - "ava": "^4.3.0", - "eslint": "^8.17.0", - "eslint-config-prettier": "^8.5.0", - "nodemon": "2.0.16", - "prettier": "^2.6.2", - "rimraf": "^3.0.2", - "ts-node": "10.8.1", - "typescript": "4.7.4" - }, - "optionalDependencies": { - "express": "^4.18.1" - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 1ceb6cd..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,2935 +0,0 @@ -lockfileVersion: 5.4 - -specifiers: - '@ava/typescript': ^3.0.1 - '@grammyjs/types': github:grammyjs/types - '@types/express': ^4.17.13 - '@types/node': 17.0.40 - '@typescript-eslint/eslint-plugin': ^5.27.1 - '@typescript-eslint/parser': ^5.27.1 - ava: ^4.3.0 - dotenv: ^16.0.1 - eslint: ^8.17.0 - eslint-config-prettier: ^8.5.0 - express: ^4.18.1 - grammy: ^1.8.3 - graphql: ^16.5.0 - graphql-request: ^4.3.0 - nodemon: 2.0.16 - prettier: ^2.6.2 - rimraf: ^3.0.2 - ts-node: 10.8.1 - typescript: 4.7.4 - -dependencies: - dotenv: 16.0.1 - grammy: 1.8.3 - graphql: 16.5.0 - graphql-request: 4.3.0_graphql@16.5.0 - -optionalDependencies: - express: 4.18.1 - -devDependencies: - '@ava/typescript': 3.0.1 - '@grammyjs/types': github.com/grammyjs/types/6ba8e8bddcb4efebb3eec700578ae4fbdcb293f1 - '@types/express': 4.17.13 - '@types/node': 17.0.40 - '@typescript-eslint/eslint-plugin': 5.27.1_gav5dxubrvrjafh4n6juxjnvcu - '@typescript-eslint/parser': 5.27.1_n4lrrl552kqf5nk4rgej5xdcha - ava: 4.3.0_@ava+typescript@3.0.1 - eslint: 8.17.0 - eslint-config-prettier: 8.5.0_eslint@8.17.0 - nodemon: 2.0.16 - prettier: 2.6.2 - rimraf: 3.0.2 - ts-node: 10.8.1_7oqjshy4scgohh2k2lzivplbau - typescript: 4.7.4 - -packages: - - /@ava/typescript/3.0.1: - resolution: {integrity: sha512-/JXIUuKsvkaneaiA9ckk3ksFTqvu0mDNlChASrTe2BnDsvMbhQdPWyqQjJ9WRJWVhhs5TWn1/0Pp1G6Rv8Syrw==} - engines: {node: '>=12.22 <13 || >=14.17 <15 || >=16.4 <17 || >=17'} - dependencies: - escape-string-regexp: 5.0.0 - execa: 5.1.1 - 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 - dev: true - - /@eslint/eslintrc/1.3.0: - resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.3.2 - globals: 13.15.0 - ignore: 5.2.0 - 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 - - /@grammyjs/types/2.7.2: - resolution: {integrity: sha512-zaZH34j/tXhz9fmCv+7dUkvHgp4q/uIuQ2SEWn7hJ7TEuUUa764bNguVHillqTwTgOL1XkbaTSMczbbCnjeB4Q==} - dev: false - - /@humanwhocodes/config-array/0.9.5: - resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/object-schema/1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - - /@jridgewell/resolve-uri/3.0.7: - resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec/1.4.13: - resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} - dev: true - - /@jridgewell/trace-mapping/0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.0.7 - '@jridgewell/sourcemap-codec': 1.4.13 - dev: true - - /@nodelib/fs.scandir/2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat/2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk/1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 - dev: true - - /@sindresorhus/is/0.14.0: - resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} - engines: {node: '>=6'} - dev: true - - /@szmarczak/http-timer/1.1.2: - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} - dependencies: - defer-to-connect: 1.1.3 - dev: true - - /@tsconfig/node10/1.0.8: - resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} - dev: true - - /@tsconfig/node12/1.0.9: - resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} - dev: true - - /@tsconfig/node14/1.0.1: - resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} - dev: true - - /@tsconfig/node16/1.0.2: - resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} - dev: true - - /@types/body-parser/1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} - dependencies: - '@types/connect': 3.4.35 - '@types/node': 17.0.40 - dev: true - - /@types/connect/3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} - dependencies: - '@types/node': 17.0.40 - dev: true - - /@types/express-serve-static-core/4.17.28: - resolution: {integrity: sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==} - dependencies: - '@types/node': 17.0.40 - '@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==} - dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.28 - '@types/qs': 6.9.7 - '@types/serve-static': 1.13.10 - dev: true - - /@types/json-schema/7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - dev: true - - /@types/keyv/3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 17.0.40 - dev: true - - /@types/mime/1.3.2: - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} - dev: true - - /@types/node/17.0.40: - resolution: {integrity: sha512-UXdBxNGqTMtm7hCwh9HtncFVLrXoqA3oJW30j6XWp5BH/wu3mVeaxo7cq5benFdBw34HB3XDT2TRPI7rXZ+mDg==} - dev: true - - /@types/qs/6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - dev: true - - /@types/range-parser/1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - dev: true - - /@types/responselike/1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - dependencies: - '@types/node': 17.0.40 - dev: true - - /@types/serve-static/1.13.10: - resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} - dependencies: - '@types/mime': 1.3.2 - '@types/node': 17.0.40 - dev: true - - /@typescript-eslint/eslint-plugin/5.27.1_gav5dxubrvrjafh4n6juxjnvcu: - resolution: {integrity: sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.27.1_n4lrrl552kqf5nk4rgej5xdcha - '@typescript-eslint/scope-manager': 5.27.1 - '@typescript-eslint/type-utils': 5.27.1_n4lrrl552kqf5nk4rgej5xdcha - '@typescript-eslint/utils': 5.27.1_n4lrrl552kqf5nk4rgej5xdcha - debug: 4.3.4 - eslint: 8.17.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.0 - regexpp: 3.2.0 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.7.4 - typescript: 4.7.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser/5.27.1_n4lrrl552kqf5nk4rgej5xdcha: - resolution: {integrity: sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.27.1 - '@typescript-eslint/types': 5.27.1 - '@typescript-eslint/typescript-estree': 5.27.1_typescript@4.7.4 - debug: 4.3.4 - eslint: 8.17.0 - typescript: 4.7.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager/5.27.1: - resolution: {integrity: sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.27.1 - '@typescript-eslint/visitor-keys': 5.27.1 - dev: true - - /@typescript-eslint/type-utils/5.27.1_n4lrrl552kqf5nk4rgej5xdcha: - resolution: {integrity: sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/utils': 5.27.1_n4lrrl552kqf5nk4rgej5xdcha - debug: 4.3.4 - eslint: 8.17.0 - tsutils: 3.21.0_typescript@4.7.4 - typescript: 4.7.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types/5.27.1: - resolution: {integrity: sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree/5.27.1_typescript@4.7.4: - resolution: {integrity: sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - 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@4.7.4 - typescript: 4.7.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils/5.27.1_n4lrrl552kqf5nk4rgej5xdcha: - resolution: {integrity: sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.27.1 - '@typescript-eslint/types': 5.27.1 - '@typescript-eslint/typescript-estree': 5.27.1_typescript@4.7.4 - eslint: 8.17.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.17.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys/5.27.1: - resolution: {integrity: sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.27.1 - eslint-visitor-keys: 3.3.0 - dev: true - - /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 - - /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: false - optional: true - - /acorn-jsx/5.3.2_acorn@8.7.1: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.7.1 - dev: true - - /acorn-walk/8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn/8.7.1: - resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /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 - dev: true - - /aggregate-error/4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} - dependencies: - clean-stack: 4.2.0 - indent-string: 5.0.0 - dev: true - - /ajv/6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-align/3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - dev: true - - /ansi-regex/5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-regex/6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles/6.1.0: - resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==} - engines: {node: '>=12'} - dev: true - - /anymatch/3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arg/4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /argparse/1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse/2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-find-index/1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - dev: true - - /array-flatten/1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: false - optional: true - - /array-union/2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /arrgv/1.0.2: - resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} - engines: {node: '>=8.0.0'} - dev: true - - /arrify/3.0.0: - resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} - engines: {node: '>=12'} - dev: true - - /asynckit/0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /ava/4.3.0_@ava+typescript@3.0.1: - resolution: {integrity: sha512-Ap0u8rp8wOBN6CxshgxrPSe191e8g52RWGoXeDB57ubo4fyZyStfI6OxQi/bl0yxIDEOYHhCiGwihbzlMNJw3Q==} - engines: {node: '>=12.22 <13 || >=14.17 <15 || >=16.4 <17 || >=18'} - hasBin: true - peerDependencies: - '@ava/typescript': '*' - peerDependenciesMeta: - '@ava/typescript': - optional: true - dependencies: - '@ava/typescript': 3.0.1 - acorn: 8.7.1 - acorn-walk: 8.2.0 - ansi-styles: 6.1.0 - arrgv: 1.0.2 - arrify: 3.0.0 - callsites: 4.0.0 - cbor: 8.1.0 - chalk: 5.0.1 - chokidar: 3.5.3 - chunkd: 2.0.1 - ci-info: 3.3.1 - ci-parallel-vars: 1.0.1 - clean-yaml-object: 0.1.0 - cli-truncate: 3.1.0 - code-excerpt: 4.0.0 - common-path-prefix: 3.0.0 - concordance: 5.0.4 - currently-unhandled: 0.4.1 - debug: 4.3.4 - del: 6.1.1 - emittery: 0.11.0 - figures: 4.0.1 - globby: 13.1.1 - ignore-by-default: 2.1.0 - indent-string: 5.0.0 - is-error: 2.2.2 - is-plain-object: 5.0.0 - is-promise: 4.0.0 - matcher: 5.0.0 - mem: 9.0.2 - ms: 2.1.3 - p-event: 5.0.1 - p-map: 5.4.0 - picomatch: 2.3.1 - pkg-conf: 4.0.0 - plur: 5.1.0 - pretty-ms: 7.0.1 - resolve-cwd: 3.0.0 - slash: 3.0.0 - stack-utils: 2.0.5 - strip-ansi: 7.0.1 - supertap: 3.0.1 - temp-dir: 2.0.0 - write-file-atomic: 4.0.1 - yargs: 17.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /binary-extensions/2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /blueimp-md5/2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - dev: true - - /body-parser/1.20.0: - resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - 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 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /boxen/5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - dev: true - - /brace-expansion/1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces/3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /bytes/3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: false - optional: true - - /cacheable-request/6.1.0: - resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.2 - get-stream: 5.2.0 - http-cache-semantics: 4.1.0 - keyv: 3.1.0 - lowercase-keys: 2.0.0 - normalize-url: 4.5.1 - responselike: 1.0.2 - dev: true - - /call-bind/1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.1.1 - dev: false - optional: true - - /callsites/3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /callsites/4.0.0: - resolution: {integrity: sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==} - engines: {node: '>=12.20'} - dev: true - - /camelcase/6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /cbor/8.1.0: - resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} - engines: {node: '>=12.19'} - dependencies: - nofilter: 3.1.0 - dev: true - - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk/5.0.1: - resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chokidar/3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chunkd/2.0.1: - resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} - dev: true - - /ci-info/2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: true - - /ci-info/3.3.1: - resolution: {integrity: sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==} - dev: true - - /ci-parallel-vars/1.0.1: - resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} - dev: true - - /clean-stack/2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /clean-stack/4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} - dependencies: - escape-string-regexp: 5.0.0 - dev: true - - /clean-yaml-object/0.1.0: - resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} - engines: {node: '>=0.10.0'} - dev: true - - /cli-boxes/2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - dev: true - - /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 - - /cliui/7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-response/1.0.2: - resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} - dependencies: - mimic-response: 1.0.1 - dev: true - - /code-excerpt/4.0.0: - resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - convert-to-spaces: 2.0.1 - dev: true - - /color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /combined-stream/1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /common-path-prefix/3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true - - /concat-map/0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /concordance/5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - dependencies: - date-time: 3.1.0 - esutils: 2.0.3 - fast-diff: 1.2.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - md5-hex: 3.0.1 - semver: 7.3.7 - well-known-symbols: 2.0.0 - 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 - dev: true - - /content-disposition/0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: false - optional: true - - /content-type/1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /convert-to-spaces/2.0.1: - resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /cookie-signature/1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: false - optional: true - - /cookie/0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /create-require/1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /cross-fetch/3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} - dependencies: - node-fetch: 2.6.7 - transitivePeerDependencies: - - encoding - dev: false - - /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-random-string/2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - dev: true - - /currently-unhandled/0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} - dependencies: - array-find-index: 1.0.2 - dev: true - - /date-time/3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} - dependencies: - time-zone: 1.0.0 - dev: true - - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: false - optional: true - - /debug/3.2.7_supports-color@5.5.0: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 5.5.0 - dev: true - - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decompress-response/3.3.0: - resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} - engines: {node: '>=4'} - dependencies: - mimic-response: 1.0.1 - dev: true - - /deep-extend/0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /deep-is/0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /defer-to-connect/1.1.3: - resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} - dev: true - - /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: true - - /delayed-stream/1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /depd/2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: false - optional: true - - /destroy/1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: false - optional: true - - /diff/4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /dir-glob/3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /doctrine/3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dot-prop/5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true - - /dotenv/16.0.1: - resolution: {integrity: sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==} - engines: {node: '>=12'} - dev: false - - /duplexer3/0.1.4: - resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==} - dev: true - - /eastasianwidth/0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /ee-first/1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} - dev: false - optional: true - - /emittery/0.11.0: - resolution: {integrity: sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g==} - engines: {node: '>=12'} - dev: true - - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emoji-regex/9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /encodeurl/1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: false - optional: true - - /end-of-stream/1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-goat/2.1.1: - resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} - engines: {node: '>=8'} - dev: true - - /escape-html/1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false - optional: true - - /escape-string-regexp/2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - - /escape-string-regexp/4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /escape-string-regexp/5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: true - - /eslint-config-prettier/8.5.0_eslint@8.17.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.17.0 - dev: true - - /eslint-scope/5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope/7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-utils/3.0.0_eslint@8.17.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.17.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys/2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /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} - dev: true - - /eslint/8.17.0: - resolution: {integrity: sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.3.0 - '@humanwhocodes/config-array': 0.9.5 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.17.0 - eslint-visitor-keys: 3.3.0 - espree: 9.3.2 - esquery: 1.4.0 - 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: 6.0.2 - globals: 13.15.0 - ignore: 5.2.0 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - 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.1 - text-table: 0.2.0 - v8-compile-cache: 2.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree/9.3.2: - resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.7.1 - acorn-jsx: 5.3.2_acorn@8.7.1 - eslint-visitor-keys: 3.3.0 - dev: true - - /esprima/4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /esquery/1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse/4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse/4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse/5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils/2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /etag/1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /event-target-shim/5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false - - /execa/5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /express/4.18.1: - resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} - engines: {node: '>= 0.10.0'} - requiresBuild: true - 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 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /extract-files/9.0.0: - resolution: {integrity: sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==} - engines: {node: ^10.17.0 || ^12.0.0 || >= 13.7.0} - dev: false - - /fast-deep-equal/3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-diff/1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true - - /fast-glob/3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify/2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein/2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq/1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} - dependencies: - reusify: 1.0.4 - dev: true - - /figures/4.0.1: - resolution: {integrity: sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==} - engines: {node: '>=12'} - dependencies: - escape-string-regexp: 5.0.0 - is-unicode-supported: 1.2.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 - - /fill-range/7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /finalhandler/1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - 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 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /find-up/6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - locate-path: 7.1.1 - path-exists: 5.0.0 - dev: true - - /flat-cache/3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.5 - rimraf: 3.0.2 - dev: true - - /flatted/3.2.5: - resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} - dev: true - - /form-data/3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /forwarded/0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /fresh/0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /fs.realpath/1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: false - optional: true - - /functional-red-black-tree/1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - - /get-caller-file/2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic/1.1.1: - resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: false - optional: true - - /get-stream/4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream/5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream/6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /glob-parent/5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent/6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob/7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /global-dirs/3.0.0: - resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==} - engines: {node: '>=10'} - dependencies: - ini: 2.0.0 - dev: true - - /globals/13.15.0: - resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /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 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby/13.1.1: - resolution: {integrity: sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.2.11 - ignore: 5.2.0 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /got/9.6.0: - resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} - engines: {node: '>=8.6'} - dependencies: - '@sindresorhus/is': 0.14.0 - '@szmarczak/http-timer': 1.1.2 - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.0 - cacheable-request: 6.1.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.1.0 - to-readable-stream: 1.0.0 - url-parse-lax: 3.0.0 - dev: true - - /graceful-fs/4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: true - - /grammy/1.8.3: - resolution: {integrity: sha512-3esAETA0HXR9wb8x65uYeAt1AbCQsJC5l6iuxSRXZR2cSxEf+61vIbJ5qUvw7TfMkgPuH71Gi7AHSFGZ+F1eqQ==} - engines: {node: ^12.20.0 || >=14.13.1} - dependencies: - '@grammyjs/types': 2.7.2 - abort-controller: 3.0.0 - debug: 4.3.4 - node-fetch: 2.6.7 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /graphql-request/4.3.0_graphql@16.5.0: - resolution: {integrity: sha512-2v6hQViJvSsifK606AliqiNiijb1uwWp6Re7o0RTyH+uRTv/u7Uqm2g4Fjq/LgZIzARB38RZEvVBFOQOVdlBow==} - peerDependencies: - graphql: 14 - 16 - dependencies: - cross-fetch: 3.1.5 - extract-files: 9.0.0 - form-data: 3.0.1 - graphql: 16.5.0 - transitivePeerDependencies: - - encoding - dev: false - - /graphql/16.5.0: - resolution: {integrity: sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: false - - /has-flag/3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-symbols/1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false - optional: true - - /has-yarn/2.1.0: - resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} - engines: {node: '>=8'} - dev: true - - /has/1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: false - optional: true - - /http-cache-semantics/4.1.0: - resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} - dev: true - - /http-errors/2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: false - optional: true - - /human-signals/2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /iconv-lite/0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - optional: true - - /ignore-by-default/1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: true - - /ignore-by-default/2.1.0: - resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} - engines: {node: '>=10 <11 || >=12 <13 || >=14'} - dev: true - - /ignore/5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} - dev: true - - /import-fresh/3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-lazy/2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} - dev: true - - /imurmurhash/0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string/4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - - /indent-string/5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - dev: true - - /inflight/1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits/2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini/1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /ini/2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: true - - /ipaddr.js/1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: false - optional: true - - /irregular-plurals/3.3.0: - resolution: {integrity: sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==} - engines: {node: '>=8'} - dev: true - - /is-binary-path/2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-ci/2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true - dependencies: - ci-info: 2.0.0 - dev: true - - /is-error/2.2.2: - resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} - dev: true - - /is-extglob/2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-fullwidth-code-point/4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true - - /is-glob/4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-installed-globally/0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - dependencies: - global-dirs: 3.0.0 - is-path-inside: 3.0.3 - dev: true - - /is-npm/5.0.0: - resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} - engines: {node: '>=10'} - dev: true - - /is-number/7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-obj/2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true - - /is-path-cwd/2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - dev: true - - /is-path-inside/3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-plain-object/5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true - - /is-promise/4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - dev: true - - /is-stream/2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-typedarray/1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - - /is-unicode-supported/1.2.0: - resolution: {integrity: sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==} - engines: {node: '>=12'} - dev: true - - /is-yarn-global/0.3.0: - resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} - dev: true - - /isexe/2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /js-string-escape/1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - dev: true - - /js-yaml/3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /js-yaml/4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /json-buffer/3.0.0: - resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} - dev: true - - /json-schema-traverse/0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify/1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /keyv/3.1.0: - resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} - dependencies: - json-buffer: 3.0.0 - dev: true - - /latest-version/5.1.0: - resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} - engines: {node: '>=8'} - dependencies: - package-json: 6.5.0 - dev: true - - /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 - dev: true - - /load-json-file/7.0.1: - resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /locate-path/7.1.1: - resolution: {integrity: sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-locate: 6.0.0 - dev: true - - /lodash.merge/4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash/4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /lowercase-keys/1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - dev: true - - /lowercase-keys/2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true - - /lru-cache/6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /make-dir/3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /make-error/1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /map-age-cleaner/0.1.3: - resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} - engines: {node: '>=6'} - dependencies: - p-defer: 1.0.0 - dev: true - - /matcher/5.0.0: - resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - escape-string-regexp: 5.0.0 - dev: true - - /md5-hex/3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 - dev: true - - /media-typer/0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /mem/9.0.2: - resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} - engines: {node: '>=12.20'} - dependencies: - map-age-cleaner: 0.1.3 - mimic-fn: 4.0.0 - dev: true - - /merge-descriptors/1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: false - optional: true - - /merge-stream/2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2/1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /methods/1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /micromatch/4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db/1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - 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 - dev: false - - /mime/1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: false - optional: true - - /mimic-fn/2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /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'} - dev: true - - /minimatch/3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist/1.2.6: - resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - dev: true - - /ms/2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false - optional: true - - /ms/2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms/2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - /natural-compare/1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /negotiator/0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /node-fetch/2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /nodemon/2.0.16: - resolution: {integrity: sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==} - engines: {node: '>=8.10.0'} - hasBin: true - requiresBuild: 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 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - update-notifier: 5.1.0 - dev: true - - /nofilter/3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} - dev: true - - /nopt/1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url/4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} - engines: {node: '>=8'} - dev: true - - /npm-run-path/4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /object-inspect/1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - dev: false - optional: true - - /on-finished/2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: false - optional: true - - /once/1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime/5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /optionator/0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - dev: true - - /p-cancelable/1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} - engines: {node: '>=6'} - dev: true - - /p-defer/1.0.0: - resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} - engines: {node: '>=4'} - dev: true - - /p-event/5.0.1: - resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-timeout: 5.1.0 - dev: true - - /p-limit/4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /p-locate/6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-limit: 4.0.0 - dev: true - - /p-map/4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-map/5.4.0: - resolution: {integrity: sha512-obHraaWkwl4y1NHR4vW5D5k+33+S5QrkFqsNrrvK0R7lilXdzo/DZgnloDvYUaRT+Sk6vVK47JUQMQY6cjPMXg==} - engines: {node: '>=12'} - dependencies: - aggregate-error: 4.0.1 - dev: true - - /p-timeout/5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} - dev: true - - /package-json/6.5.0: - resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} - engines: {node: '>=8'} - dependencies: - got: 9.6.0 - registry-auth-token: 4.2.1 - registry-url: 5.1.0 - semver: 6.3.0 - dev: true - - /parent-module/1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-ms/2.1.0: - resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} - engines: {node: '>=6'} - dev: true - - /parseurl/1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: false - optional: true - - /path-exists/5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /path-is-absolute/1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key/3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-to-regexp/0.1.7: - resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} - dev: false - optional: true - - /path-type/4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pkg-conf/4.0.0: - resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - find-up: 6.3.0 - load-json-file: 7.0.1 - dev: true - - /plur/5.1.0: - resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - irregular-plurals: 3.3.0 - dev: true - - /prelude-ls/1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prepend-http/2.0.0: - resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} - engines: {node: '>=4'} - dev: true - - /prettier/2.6.2: - resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /pretty-ms/7.0.1: - resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} - engines: {node: '>=10'} - dependencies: - parse-ms: 2.1.0 - 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 - dev: false - optional: true - - /pstree.remy/1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: true - - /pump/3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /punycode/2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} - engines: {node: '>=6'} - dev: true - - /pupa/2.1.1: - resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} - engines: {node: '>=8'} - dependencies: - escape-goat: 2.1.1 - dev: true - - /qs/6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: false - optional: true - - /queue-microtask/1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /range-parser/1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: false - optional: true - - /raw-body/2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: false - optional: true - - /rc/1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.6 - strip-json-comments: 2.0.1 - dev: true - - /readdirp/3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /regexpp/3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - - /registry-auth-token/4.2.1: - resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==} - engines: {node: '>=6.0.0'} - dependencies: - rc: 1.2.8 - dev: true - - /registry-url/5.1.0: - resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} - engines: {node: '>=8'} - dependencies: - rc: 1.2.8 - dev: true - - /require-directory/2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} - engines: {node: '>=0.10.0'} - dev: true - - /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/4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from/5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /responselike/1.0.2: - resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=} - dependencies: - lowercase-keys: 1.0.1 - dev: true - - /reusify/1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf/3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /run-parallel/1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-buffer/5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - optional: true - - /safer-buffer/2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false - optional: true - - /semver-diff/3.1.1: - resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /semver/7.3.7: - resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /send/0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - 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 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /serialize-error/7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} - dependencies: - type-fest: 0.13.1 - dev: true - - /serve-static/1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /setprototypeof/1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false - optional: true - - /shebang-command/2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex/3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /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.2 - dev: false - optional: true - - /signal-exit/3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /slash/3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slash/4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /slice-ansi/5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.1.0 - is-fullwidth-code-point: 4.0.0 - dev: true - - /sprintf-js/1.0.3: - resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} - dev: true - - /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: true - - /statuses/2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: false - optional: true - - /string-width/4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string-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 - dev: true - - /strip-ansi/6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-ansi/7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-final-newline/2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-json-comments/2.0.1: - resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} - engines: {node: '>=0.10.0'} - dev: true - - /strip-json-comments/3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /supertap/3.0.1: - resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - indent-string: 5.0.0 - js-yaml: 3.14.1 - serialize-error: 7.0.1 - strip-ansi: 7.0.1 - dev: true - - /supports-color/5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /temp-dir/2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - dev: true - - /text-table/0.2.0: - resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} - dev: true - - /time-zone/1.0.0: - resolution: {integrity: sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=} - engines: {node: '>=4'} - dev: true - - /to-readable-stream/1.0.0: - resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} - engines: {node: '>=6'} - dev: true - - /to-regex-range/5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /toidentifier/1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: false - optional: true - - /touch/3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - dependencies: - nopt: 1.0.10 - dev: true - - /tr46/0.0.3: - resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} - dev: false - - /ts-node/10.8.1_7oqjshy4scgohh2k2lzivplbau: - resolution: {integrity: sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.8 - '@tsconfig/node12': 1.0.9 - '@tsconfig/node14': 1.0.1 - '@tsconfig/node16': 1.0.2 - '@types/node': 17.0.40 - acorn: 8.7.1 - 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.7.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tslib/1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tsutils/3.21.0_typescript@4.7.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' - dependencies: - tslib: 1.14.1 - typescript: 4.7.4 - dev: true - - /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-fest/0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: true - - /type-fest/0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-is/1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: false - optional: true - - /typedarray-to-buffer/3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - - /typescript/4.7.4: - resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /undefsafe/2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: true - - /unique-string/2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - dependencies: - crypto-random-string: 2.0.0 - dev: true - - /unpipe/1.0.0: - resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} - engines: {node: '>= 0.8'} - dev: false - optional: 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.3.7 - semver-diff: 3.1.1 - xdg-basedir: 4.0.0 - dev: true - - /uri-js/4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.1.1 - dev: true - - /url-parse-lax/3.0.0: - resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=} - engines: {node: '>=4'} - dependencies: - prepend-http: 2.0.0 - dev: true - - /utils-merge/1.0.1: - resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} - engines: {node: '>= 0.4.0'} - dev: false - optional: true - - /v8-compile-cache-lib/3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - - /v8-compile-cache/2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true - - /vary/1.1.2: - resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} - engines: {node: '>= 0.8'} - dev: false - optional: true - - /webidl-conversions/3.0.1: - resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} - dev: false - - /well-known-symbols/2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} - dev: true - - /whatwg-url/5.0.0: - resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - - /which/2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /widest-line/3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - dependencies: - string-width: 4.2.3 - dev: true - - /word-wrap/1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - dev: true - - /wrap-ansi/7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - dev: true - - /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.7 - typedarray-to-buffer: 3.1.5 - dev: true - - /write-file-atomic/4.0.1: - resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /xdg-basedir/4.0.0: - resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} - engines: {node: '>=8'} - dev: true - - /y18n/5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist/4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser/21.0.1: - resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} - engines: {node: '>=12'} - dev: true - - /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.0.1 - dev: true - - /yn/3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - - /yocto-queue/1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - - github.com/grammyjs/types/6ba8e8bddcb4efebb3eec700578ae4fbdcb293f1: - resolution: {tarball: https://codeload.github.com/grammyjs/types/tar.gz/6ba8e8bddcb4efebb3eec700578ae4fbdcb293f1} - name: '@grammyjs/types' - version: 2.7.2 - dev: true diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..95af828 --- /dev/null +++ b/server.ts @@ -0,0 +1,9 @@ +import bot from "./src/bot.ts"; + +bot.start({ + drop_pending_updates: true, + allowed_updates: ["callback_query", "inline_query", "message"], +}); + +Deno.addSignalListener("SIGINT", () => bot.stop()); +Deno.addSignalListener("SIGTERM", () => bot.stop()); diff --git a/serverless.ts b/serverless.ts new file mode 100644 index 0000000..da98145 --- /dev/null +++ b/serverless.ts @@ -0,0 +1,5 @@ +import { serve } from "server"; +import { webhookCallback } from "grammy"; +import bot from "./src/bot.ts"; + +serve(webhookCallback(bot, "std/http")); diff --git a/src/anilist/__snapshots__/getMedia.test.ts.snap b/src/anilist/__snapshots__/getMedia.test.ts.snap new file mode 100644 index 0000000..921d0cf --- /dev/null +++ b/src/anilist/__snapshots__/getMedia.test.ts.snap @@ -0,0 +1,93 @@ +export const snapshot = {}; + +snapshot[`fetch anime information 1`] = ` +{ + Media: { + averageScore: 79, + description: "Naruto Uzumaki, a hyperactive and knuckle-headed ninja, lives in Konohagakure, the Hidden Leaf village. Moments prior to his birth, a huge demon known as the Kyuubi, the Nine-tailed Fox, attacked Konohagakure and wreaked havoc. In order to put an end to the Kyuubi's rampage, the leader of the village, the 4th Hokage, sacrificed his life and sealed the monstrous beast inside the newborn Naruto.

+Shunned because of the presence of the Kyuubi inside him, Naruto struggles to find his place in the village. He strives to become the Hokage of Konohagakure, and he meets many friends and foes along the way.

+(Source: MAL Rewrite)", + format: "TV", + genres: [ + "Action", + "Adventure", + "Comedy", + "Drama", + "Fantasy", + "Supernatural", + ], + id: 20, + idMal: 20, + status: "FINISHED", + studios: { + nodes: [ + { + name: "Studio Pierrot", + }, + { + name: "TV Tokyo", + }, + { + name: "Aniplex", + }, + { + name: "Viz Media", + }, + { + name: "Shueisha", + }, + { + name: "KSS", + }, + { + name: "SME Visual Works", + }, + { + name: "Rakuonsha", + }, + ], + }, + title: { + english: "Naruto", + native: "NARUTO -ナルト-", + romaji: "NARUTO", + }, + trailer: null, + }, +} +`; + +snapshot[`fetch manga information 1`] = ` +{ + Media: { + averageScore: 81, + description: "Hanagaki Takemichi was once a low-life punk, but after biting off more than he could chew with a gang in middle school, he ran away from his old life. Now that he’s an adult, the gang that once terrorized him has grown into the largest gang in Tokyo, and they’ve started killing people–including his old girlfriend! After learning this news, a mysterious force on a train platform shoves Takemichi right in front of an approaching train. As his life flashes before his eyes, he blinks to find himself transported back to middle school, before he fled from the gang! Now he has the chance to right what went wrong all those years ago. Can he save his girlfriend’s life in the future–and what else might he change if he’s rewriting the past? +

+(Source: Seven Seas Entertainment) +

+Notes:
+- Winner of the Shounen Manga category of the 44th annual Kodansha Manga Awards.
+- Includes 1 extra chapter.
", + format: "MANGA", + genres: [ + "Action", + "Drama", + "Romance", + "Supernatural", + ], + id: 102988, + idMal: 104565, + status: "RELEASING", + studios: { + nodes: [ + ], + }, + title: { + english: "Tokyo Revengers", + native: "東京卍リベンジャーズ", + romaji: "Tokyo卍Revengers", + }, + trailer: null, + }, +} +`; diff --git a/src/anilist/__snapshots__/inlineResults.test.ts.snap b/src/anilist/__snapshots__/inlineResults.test.ts.snap new file mode 100644 index 0000000..ba8ff17 --- /dev/null +++ b/src/anilist/__snapshots__/inlineResults.test.ts.snap @@ -0,0 +1,262 @@ +export const snapshot = {}; + +snapshot[`inline result (anime) 1`] = ` +{ + Page: { + media: [ + { + averageScore: 34, + coverImage: { + medium: "https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/1639.jpg", + }, + description: "During summer vacation, Tamotsu is on break from work happens to visit a particular café. It is at this café that Tamotsu meets Pico, who works there for his grandfather. Tamotsu instantly falls for Pico, believing that Pico is a girl because of his feminine appearance. However, to his disbelief, Pico claims he actually is a guy. Undeterred, Tamotsu pursues a sexual relationship with Pico, to an extent where he even persuades Pico into wearing girl clothes. When Pico asks what is he to Tamotsu, he finds himself unable to answer...

\\r +[Written by MAL Rewrite]", + format: "OVA", + genres: [ + "Hentai", + ], + id: 1639, + idMal: 1639, + isAdult: true, + status: "FINISHED", + studios: { + nodes: [ + { + name: "Natural High", + }, + ], + }, + title: { + english: null, + romaji: "Boku no Pico", + }, + trailer: null, + }, + { + averageScore: 36, + coverImage: { + medium: "https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/5391.jpg", + }, + description: "The crisp rays of summer sun find the effeminate Pico embroiled in yet another heated and lustful fling. While out biking, Pico meets and befriends Chico—a lively boy not much younger than him, but leagues behind in the affairs of the flesh. After the innocent Chico shows his sister in the midst of self-pleasure to Pico, Pico takes it upon himself to educate this confused youth.
+
+(Source: MAL Rewrite)", + format: "OVA", + genres: [ + "Hentai", + ], + id: 5391, + idMal: 5391, + isAdult: true, + status: "FINISHED", + studios: { + nodes: [ + { + name: "Natural High", + }, + ], + }, + title: { + english: null, + romaji: "Pico to Chico", + }, + trailer: null, + }, + { + averageScore: 36, + coverImage: { + medium: "https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/4866.jpg", + }, + description: "The third installment of the Boku no Pico series, which takes sometime after the second OVA, Pico to Chico.

+Pico and Chico meet a mysterious young boy named CoCo, whom Pico at first believes is a girl. The three of them become friends, but soon CoCo believes he is becoming a strain on Pico and Chico's relationship and decides to distance himself from them. The three of them rekindle their friendship by the end of the OVA.", + format: "OVA", + genres: [ + "Hentai", + ], + id: 4866, + idMal: 4866, + isAdult: true, + status: "FINISHED", + studios: { + nodes: [ + { + name: "Natural High", + }, + ], + }, + title: { + english: null, + romaji: "Pico x CoCo x Chico", + }, + trailer: null, + }, + { + averageScore: 40, + coverImage: { + medium: "https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/6546.jpg", + }, + description: "An edited version of the first OVA titled pico~ Boku no Chiisana Natsu Monogatari (pico: My Little Summer Story) was released on November 11, 2007. It is a re-edited version of the animation seen in the Boku no Pico OVA set to a new script, featuring content that is more appropriate for viewers under the age of 18.
+
+(Source: nekoshota.com)", + format: "OVA", + genres: [ + ], + id: 6546, + idMal: 6546, + isAdult: false, + status: "FINISHED", + studios: { + nodes: [ + { + name: "Natural High", + }, + ], + }, + title: { + english: null, + romaji: "pico: Boku no Chiisana Natsu Monogatari", + }, + trailer: null, + }, + ], + pageInfo: { + currentPage: 1, + hasNextPage: false, + lastPage: 1, + perPage: 25, + total: 4, + }, + }, +} +`; + +snapshot[`inline result (manga) 1`] = ` +{ + Page: { + media: [ + { + averageScore: 81, + coverImage: { + medium: "https://s4.anilist.co/file/anilistcdn/media/manga/cover/small/bx102988-OoVJxQCH6fbR.jpg", + }, + description: "Hanagaki Takemichi was once a low-life punk, but after biting off more than he could chew with a gang in middle school, he ran away from his old life. Now that he’s an adult, the gang that once terrorized him has grown into the largest gang in Tokyo, and they’ve started killing people–including his old girlfriend! After learning this news, a mysterious force on a train platform shoves Takemichi right in front of an approaching train. As his life flashes before his eyes, he blinks to find himself transported back to middle school, before he fled from the gang! Now he has the chance to right what went wrong all those years ago. Can he save his girlfriend’s life in the future–and what else might he change if he’s rewriting the past? +

+(Source: Seven Seas Entertainment) +

+Notes:
+- Winner of the Shounen Manga category of the 44th annual Kodansha Manga Awards.
+- Includes 1 extra chapter.
", + format: "MANGA", + genres: [ + "Action", + "Drama", + "Romance", + "Supernatural", + ], + id: 102988, + idMal: 104565, + isAdult: false, + status: "RELEASING", + studios: { + nodes: [ + ], + }, + title: { + english: "Tokyo Revengers", + romaji: "Tokyo卍Revengers", + }, + trailer: null, + }, + { + averageScore: 54, + coverImage: { + medium: "https://s4.anilist.co/file/anilistcdn/media/manga/cover/small/bx114523-AmEswBWBw0dc.png", + }, + description: null, + format: "MANGA", + genres: [ + "Action", + ], + id: 114523, + idMal: null, + isAdult: false, + status: "FINISHED", + studios: { + nodes: [ + ], + }, + title: { + english: null, + romaji: "Baki Gaiden: Revenge Tokyo", + }, + trailer: null, + }, + { + averageScore: null, + coverImage: { + medium: "https://s4.anilist.co/file/anilistcdn/media/manga/cover/small/bx152895-1Pd9JGkJYRQ3.jpg", + }, + description: \`A compilation focused on the youth of the Touman Members +

+Volume 1: SO YOUNG
+"Zero"
+"In Those Days"
+"One for all"
+"Man-crush"
+"Twin to Dragon"
+"You're not my Type"\`, + format: "MANGA", + genres: [ + "Action", + "Comedy", + "Drama", + ], + id: 152895, + idMal: null, + isAdult: false, + status: "RELEASING", + studios: { + nodes: [ + ], + }, + title: { + english: null, + romaji: "Tokyo卍Revengers Full Color Tanpenshuu", + }, + trailer: null, + }, + { + averageScore: 68, + coverImage: { + medium: "https://s4.anilist.co/file/anilistcdn/media/manga/cover/small/bx151997-4RNeculzkQPO.jpg", + }, + description: null, + format: "MANGA", + genres: [ + "Action", + "Drama", + ], + id: 151997, + idMal: 149751, + isAdult: false, + status: "RELEASING", + studios: { + nodes: [ + ], + }, + title: { + english: null, + romaji: "Tokyo卍Revengers: Baji Keisuke Kara no Tegami ", + }, + trailer: null, + }, + ], + pageInfo: { + currentPage: 1, + hasNextPage: false, + lastPage: 1, + perPage: 25, + total: 4, + }, + }, +} +`; diff --git a/src/anilist/__snapshots__/search.test.ts.snap b/src/anilist/__snapshots__/search.test.ts.snap new file mode 100644 index 0000000..da29555 --- /dev/null +++ b/src/anilist/__snapshots__/search.test.ts.snap @@ -0,0 +1,89 @@ +export const snapshot = {}; + +snapshot[`search anime 1`] = ` +{ + Page: { + media: [ + { + id: 1639, + title: { + english: null, + romaji: "Boku no Pico", + }, + }, + { + id: 5391, + title: { + english: null, + romaji: "Pico to Chico", + }, + }, + { + id: 4866, + title: { + english: null, + romaji: "Pico x CoCo x Chico", + }, + }, + { + id: 6546, + title: { + english: null, + romaji: "pico: Boku no Chiisana Natsu Monogatari", + }, + }, + ], + pageInfo: { + currentPage: 1, + hasNextPage: false, + lastPage: 1, + perPage: 10, + total: 4, + }, + }, +} +`; + +snapshot[`search manga 1`] = ` +{ + Page: { + media: [ + { + id: 102988, + title: { + english: "Tokyo Revengers", + romaji: "Tokyo卍Revengers", + }, + }, + { + id: 114523, + title: { + english: null, + romaji: "Baki Gaiden: Revenge Tokyo", + }, + }, + { + id: 152895, + title: { + english: null, + romaji: "Tokyo卍Revengers Full Color Tanpenshuu", + }, + }, + { + id: 151997, + title: { + english: null, + romaji: "Tokyo卍Revengers: Baji Keisuke Kara no Tegami ", + }, + }, + ], + pageInfo: { + currentPage: 1, + hasNextPage: false, + lastPage: 1, + perPage: 10, + total: 4, + }, + }, +} +`; diff --git a/src/anilist/getMedia.test.ts b/src/anilist/getMedia.test.ts index 921d3b9..dde0c13 100644 --- a/src/anilist/getMedia.test.ts +++ b/src/anilist/getMedia.test.ts @@ -1,75 +1,10 @@ -import ava from 'ava'; -import getMedia from './getMedia'; +import { assertSnapshot } from "testing/snapshot.ts"; +import getMedia from "./getMedia.ts"; -ava('fetch anime information', async (test) => { - test.deepEqual(await getMedia(20), { - Media: { - id: 20, - idMal: 20, - title: { - romaji: 'NARUTO', - english: 'Naruto', - native: 'NARUTO -ナルト-' - }, - genres: ['Action', 'Comedy'], - studios: { - nodes: [ - { - name: 'Studio Pierrot' - }, - { - name: 'TV Tokyo' - }, - { - name: 'Aniplex' - }, - { - name: 'Viz Media' - }, - { - name: 'Shueisha' - }, - { - name: 'KSS' - }, - { - name: 'SME Visual Works' - }, - { - name: 'Rakuonsha' - } - ] - }, - description: - "Naruto Uzumaki, a hyperactive and knuckle-headed ninja, lives in Konohagakure, the Hidden Leaf village. Moments prior to his birth, a huge demon known as the Kyuubi, the Nine-tailed Fox, attacked Konohagakure and wreaked havoc. In order to put an end to the Kyuubi's rampage, the leader of the village, the 4th Hokage, sacrificed his life and sealed the monstrous beast inside the newborn Naruto.

\nShunned because of the presence of the Kyuubi inside him, Naruto struggles to find his place in the village. He strives to become the Hokage of Konohagakure, and he meets many friends and foes along the way.

\n(Source: MAL Rewrite)", - averageScore: 79, - status: 'FINISHED', - format: 'TV', - trailer: null - } - }); +Deno.test("fetch anime information", async (t) => { + assertSnapshot(t, await getMedia(20)); }); -ava('fetch manga information', async (test) => { - test.deepEqual(await getMedia(102988, 'MANGA'), { - Media: { - id: 102988, - idMal: 104565, - title: { - romaji: 'Tokyo卍Revengers', - english: 'Tokyo Revengers', - native: '東京卍リベンジャーズ' - }, - genres: ['Action', 'Drama', 'Romance', 'Supernatural'], - studios: { - nodes: [] - }, - description: - 'Hanagaki Takemichi was once a low-life punk, but after biting off more than he could chew with a gang in middle school, he ran away from his old life. Now that he’s an adult, the gang that once terrorized him has grown into the largest gang in Tokyo, and they’ve started killing people–including his old girlfriend! After learning this news, a mysterious force on a train platform shoves Takemichi right in front of an approaching train. As his life flashes before his eyes, he blinks to find himself transported back to middle school, before he fled from the gang! Now he has the chance to right what went wrong all those years ago. Can he save his girlfriend’s life in the future–and what else might he change if he’s rewriting the past?\n

\n(Source: Seven Seas Entertainment)\n

\nNotes:
\n- Winner of the Shounen Manga category of the 44th annual Kodansha Manga Awards.
\n- Includes 1 extra chapter.
', - averageScore: 82, - status: 'RELEASING', - format: 'MANGA', - trailer: null - } - }); +Deno.test("fetch manga information", async (t) => { + assertSnapshot(t, await getMedia(102988, "MANGA")); }); diff --git a/src/anilist/getMedia.ts b/src/anilist/getMedia.ts index 1222074..149ffde 100644 --- a/src/anilist/getMedia.ts +++ b/src/anilist/getMedia.ts @@ -1,19 +1,20 @@ -import { client, gql } from './gqlClient'; +import { client, gql } from "./gqlClient.ts"; export interface Media { id: number; - idMal: number; + idMal: number | null; title: { romaji: string; - english: string | null; - native: string | null; - }; + english?: string | null; + native?: string | null; + } & Record; genres: string[]; studios: { nodes: { name: string; }[]; }; - description: string; + isAdult?: boolean; + description: string | null; averageScore: number; status: string; format: string; @@ -29,7 +30,7 @@ export interface MediaResponse { export default async function getMedia( id: number, - type: 'ANIME' | 'MANGA' = 'ANIME' + type: "ANIME" | "MANGA" = "ANIME", ) { const query = gql` query ($id: Int) { diff --git a/src/anilist/gqlClient.ts b/src/anilist/gqlClient.ts index b82a067..e8232f9 100644 --- a/src/anilist/gqlClient.ts +++ b/src/anilist/gqlClient.ts @@ -1,4 +1,4 @@ -import { GraphQLClient } from 'graphql-request'; +import { gql, GraphQLClient } from "gql"; -export { gql } from 'graphql-request'; -export const client = new GraphQLClient('https://graphql.anilist.co'); +export { gql }; +export const client = new GraphQLClient("https://graphql.anilist.co"); diff --git a/src/anilist/index.ts b/src/anilist/index.ts deleted file mode 100644 index 32b7a07..0000000 --- a/src/anilist/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import search, { SearchResponse } from './search'; -import getMedia, { Media as MediaI, MediaResponse } from './getMedia'; -import getInlineResults, { InlineResultsType } from './inlineResults'; - -export { - search, - SearchResponse, - getMedia, - MediaI, - MediaResponse, - getInlineResults, - InlineResultsType -}; diff --git a/src/anilist/inlineResults.test.ts b/src/anilist/inlineResults.test.ts index 5ef5c88..7280bd9 100644 --- a/src/anilist/inlineResults.test.ts +++ b/src/anilist/inlineResults.test.ts @@ -1,205 +1,12 @@ -import ava from 'ava'; -import getInlineResults from './inlineResults'; +import { assertSnapshot } from "testing/snapshot.ts"; +import getInlineResults from "./inlineResults.ts"; -ava('inline result (anime)', async (test) => { - const result = await getInlineResults('boku no pico'); - test.deepEqual(result, { - Page: { - pageInfo: { - total: 5, - currentPage: 1, - lastPage: 1, - hasNextPage: false, - perPage: 25 - }, - media: [ - { - id: 1639, - idMal: 1639, - title: { - romaji: 'Boku no Pico', - english: null - }, - isAdult: true, - studios: { - nodes: [ - { - name: 'Natural High' - } - ] - }, - coverImage: { - medium: - 'https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/1639.jpg' - }, - genres: ['Hentai'], - description: - 'During summer vacation, Tamotsu is on break from work happens to visit a particular café. It is at this café that Tamotsu meets Pico, who works there for his grandfather. Tamotsu instantly falls for Pico, believing that Pico is a girl because of his feminine appearance. However, to his disbelief, Pico claims he actually is a guy. Undeterred, Tamotsu pursues a sexual relationship with Pico, to an extent where he even persuades Pico into wearing girl clothes. When Pico asks what is he to Tamotsu, he finds himself unable to answer...

\r\n[Written by MAL Rewrite]', - averageScore: 34, - status: 'FINISHED', - format: 'OVA', - trailer: null - }, - { - id: 5391, - idMal: 5391, - title: { - romaji: 'Pico to Chico', - english: null - }, - isAdult: true, - studios: { - nodes: [ - { - name: 'Natural High' - } - ] - }, - coverImage: { - medium: - 'https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/5391.jpg' - }, - genres: ['Hentai'], - description: - 'The crisp rays of summer sun find the effeminate Pico embroiled in yet another heated and lustful fling. While out biking, Pico meets and befriends Chico—a lively boy not much younger than him, but leagues behind in the affairs of the flesh. After the innocent Chico shows his sister in the midst of self-pleasure to Pico, Pico takes it upon himself to educate this confused youth.
\n
\n(Source: MAL Rewrite)', - averageScore: 36, - status: 'FINISHED', - format: 'OVA', - trailer: null - }, - { - id: 4866, - idMal: 4866, - title: { - romaji: 'Pico x CoCo x Chico', - english: null - }, - isAdult: true, - studios: { - nodes: [ - { - name: 'Natural High' - } - ] - }, - coverImage: { - medium: - 'https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/4866.jpg' - }, - genres: ['Hentai'], - description: - "The third installment of the Boku no Pico series, which takes sometime after the second OVA, Pico to Chico.

\nPico and Chico meet a mysterious young boy named CoCo, whom Pico at first believes is a girl. The three of them become friends, but soon CoCo believes he is becoming a strain on Pico and Chico's relationship and decides to distance himself from them. The three of them rekindle their friendship by the end of the OVA.", - averageScore: 36, - status: 'FINISHED', - format: 'OVA', - trailer: null - }, - { - id: 6546, - idMal: 6546, - title: { - romaji: 'Pico: Boku no Chiisana Natsu Monogatari', - english: null - }, - isAdult: false, - studios: { - nodes: [ - { - name: 'Natural High' - } - ] - }, - coverImage: { - medium: - 'https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/6546.jpg' - }, - genres: [], - description: - 'An edited version of the first OVA titled pico~ Boku no Chiisana Natsu Monogatari (pico: My Little Summer Story) was released on November 11, 2007. It is a re-edited version of the animation seen in the Boku no Pico OVA set to a new script, featuring content that is more appropriate for viewers under the age of 18.
\n
\n(Source: nekoshota.com)', - averageScore: 40, - status: 'FINISHED', - format: 'OVA', - trailer: null - }, - { - id: 109004, - idMal: 32240, - title: { - romaji: - 'Code Geass: Boukoku no Akito 4 - Nikushimi no Kioku Kara Picture Drama', - english: null - }, - isAdult: false, - studios: { - nodes: [ - { - name: 'Sunrise' - } - ] - }, - coverImage: { - medium: - 'https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/b109004-NGx9qAjTVboI.jpg' - }, - genres: ['Mecha'], - description: null, - averageScore: 56, - status: 'FINISHED', - format: 'SPECIAL', - trailer: null - } - ] - } - }); +Deno.test("inline result (anime)", async (snap) => { + const result = await getInlineResults("boku no pico"); + assertSnapshot(snap, result); }); -ava('inline result (manga)', async (test) => { - test.deepEqual(await getInlineResults('Tokyo Revengers', 'MANGA'), { - Page: { - pageInfo: { - total: 2, - currentPage: 1, - lastPage: 1, - hasNextPage: false, - perPage: 25 - }, - media: [ - { - id: 102988, - idMal: 104565, - title: { romaji: 'Tokyo卍Revengers', english: 'Tokyo Revengers' }, - isAdult: false, - studios: { nodes: [] }, - coverImage: { - medium: - 'https://s4.anilist.co/file/anilistcdn/media/manga/cover/small/bx102988-OoVJxQCH6fbR.jpg' - }, - genres: ['Action', 'Drama', 'Romance', 'Supernatural'], - description: - 'Hanagaki Takemichi was once a low-life punk, but after biting off more than he could chew with a gang in middle school, he ran away from his old life. Now that he’s an adult, the gang that once terrorized him has grown into the largest gang in Tokyo, and they’ve started killing people–including his old girlfriend! After learning this news, a mysterious force on a train platform shoves Takemichi right in front of an approaching train. As his life flashes before his eyes, he blinks to find himself transported back to middle school, before he fled from the gang! Now he has the chance to right what went wrong all those years ago. Can he save his girlfriend’s life in the future–and what else might he change if he’s rewriting the past?\n

\n(Source: Seven Seas Entertainment)\n

\nNotes:
\n- Winner of the Shounen Manga category of the 44th annual Kodansha Manga Awards.
\n- Includes 1 extra chapter.
', - averageScore: 82, - status: 'RELEASING', - format: 'MANGA', - trailer: null - }, - { - id: 114523, - idMal: null, - title: { romaji: 'Baki Gaiden: Revenge Tokyo', english: null }, - isAdult: false, - studios: { nodes: [] }, - coverImage: { - medium: - 'https://s4.anilist.co/file/anilistcdn/media/manga/cover/small/bx114523-AmEswBWBw0dc.png' - }, - genres: ['Action'], - description: null, - averageScore: 54, - status: 'FINISHED', - format: 'MANGA', - trailer: null - } - ] - } - }); +Deno.test("inline result (manga)", async (snap) => { + const result = await getInlineResults("Tokyo Revengers", "MANGA"); + assertSnapshot(snap, result); }); diff --git a/src/anilist/inlineResults.ts b/src/anilist/inlineResults.ts index 3ade0af..633f24b 100644 --- a/src/anilist/inlineResults.ts +++ b/src/anilist/inlineResults.ts @@ -1,5 +1,5 @@ -import { client, gql } from './gqlClient'; -import { Media as IMedia } from './getMedia'; +import { client, gql } from "./gqlClient.ts"; +import { Media as IMedia } from "./getMedia.ts"; interface Media extends IMedia { coverImage: { @@ -22,8 +22,8 @@ export interface InlineResultsType { export default async function getInlineResults( key: string, - type: 'ANIME' | 'MANGA' = 'ANIME', - number = 25 + type: "ANIME" | "MANGA" = "ANIME", + number = 25, ) { const query = gql` query ($id: Int, $page: Int, $perPage: Int, $search: String) { @@ -66,7 +66,7 @@ export default async function getInlineResults( try { const data = await client.request(query, { search: key, - perPage: number + perPage: number, }); return data.Page.pageInfo.total === 0 ? null : data; } catch (err) { diff --git a/src/anilist/mod.ts b/src/anilist/mod.ts new file mode 100644 index 0000000..e4e5037 --- /dev/null +++ b/src/anilist/mod.ts @@ -0,0 +1,7 @@ +import search, { SearchResponse } from "./search.ts"; +import getMedia, { Media as MediaI, MediaResponse } from "./getMedia.ts"; +import getInlineResults, { InlineResultsType } from "./inlineResults.ts"; + +export { getInlineResults, getMedia, search }; + +export type { InlineResultsType, MediaI, MediaResponse, SearchResponse }; diff --git a/src/anilist/search.test.ts b/src/anilist/search.test.ts index 1730616..e6a410d 100644 --- a/src/anilist/search.test.ts +++ b/src/anilist/search.test.ts @@ -1,84 +1,12 @@ -import ava from 'ava'; -import search from './search'; +import { assertSnapshot } from "testing/snapshot.ts"; +import search from "./search.ts"; -ava('search anime', async (test) => { - test.deepEqual(await search('Boku no Pico', 'ANIME'), { - Page: { - pageInfo: { - total: 5, - currentPage: 1, - lastPage: 1, - hasNextPage: false, - perPage: 10 - }, - media: [ - { - id: 1639, - title: { - romaji: 'Boku no Pico', - english: null - } - }, - { - id: 5391, - title: { - romaji: 'Pico to Chico', - english: null - } - }, - { - id: 4866, - title: { - romaji: 'Pico x CoCo x Chico', - english: null - } - }, - { - id: 6546, - title: { - romaji: 'Pico: Boku no Chiisana Natsu Monogatari', - english: null - } - }, - { - id: 109004, - title: { - romaji: - 'Code Geass: Boukoku no Akito 4 - Nikushimi no Kioku Kara Picture Drama', - english: null - } - } - ] - } - }); +Deno.test("search anime", async (snap) => { + const result = await search("Boku no Pico", "ANIME"); + assertSnapshot(snap, result); }); -ava('search manga', async (test) => { - test.deepEqual(await search('Tokyo Revengers', 'MANGA'), { - Page: { - pageInfo: { - total: 2, - currentPage: 1, - lastPage: 1, - hasNextPage: false, - perPage: 10 - }, - media: [ - { - id: 102988, - title: { - romaji: 'Tokyo卍Revengers', - english: 'Tokyo Revengers' - } - }, - { - id: 114523, - title: { - romaji: 'Baki Gaiden: Revenge Tokyo', - english: null - } - } - ] - } - }); +Deno.test("search manga", async (snap) => { + const result = await search("Tokyo Revengers", "MANGA"); + assertSnapshot(snap, result); }); diff --git a/src/anilist/search.ts b/src/anilist/search.ts index d7c2543..2fe7da2 100644 --- a/src/anilist/search.ts +++ b/src/anilist/search.ts @@ -1,4 +1,4 @@ -import { gql, client } from './gqlClient'; +import { client, gql } from "./gqlClient.ts"; export interface SearchResponse { Page: { @@ -13,6 +13,7 @@ export interface SearchResponse { id: number; title: { romaji: string; + english: string | null; }; }[]; }; @@ -20,8 +21,8 @@ export interface SearchResponse { export default async function search( key: string, - type: 'ANIME' | 'MANGA' = 'ANIME', - page = 1 + type: "ANIME" | "MANGA" = "ANIME", + page = 1, ) { const query = gql` query ($id: Int, $page: Int, $perPage: Int, $search: String) { @@ -33,7 +34,7 @@ export default async function search( hasNextPage perPage } - media (id: $id, search: $search,type:${type}) { + media (id: $id, search: $search, type:${type}) { id title { romaji @@ -47,7 +48,7 @@ export default async function search( const data = await client.request(query, { search: key, page: page, - perPage: 10 + perPage: 10, }); return data.Page.pageInfo.total === 0 ? null : data; } catch (err) { @@ -55,3 +56,5 @@ export default async function search( return null; } } + +await search("naruto", "ANIME"); diff --git a/src/bot.ts b/src/bot.ts index 76357e4..bd15574 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,17 +1,11 @@ -import { Bot } from 'grammy'; -import Middlewares from './middlewares'; -import Commands from './commands'; -import Handlers from './handlers'; -import dotenv from 'dotenv'; +import { Bot } from "grammy"; +import Middleware from "./middleware/mod.ts"; +import Commands from "./commands/mod.ts"; +import Handlers from "./handlers/mod.ts"; +import env from "../env.ts"; -dotenv.config(); -const token = process.env.BOT_TOKEN; -if (!token) { - throw new Error('BOT_TOKEN is not defined'); -} +const bot = new Bot(env.BOT_TOKEN); -const bot = new Bot(token); - -bot.use(Middlewares, Commands, Handlers); +bot.use(Middleware, Commands, Handlers); export default bot; diff --git a/src/commands/anime.ts b/src/commands/anime.ts index 891860e..1e02d9b 100644 --- a/src/commands/anime.ts +++ b/src/commands/anime.ts @@ -1,41 +1,40 @@ -import { Composer, InlineKeyboard } from 'grammy'; -import { search } from '../anilist'; +import { Composer, InlineKeyboard } from "grammy"; +import { search } from "../anilist/mod.ts"; const composer = new Composer(); -composer.command('anime', async (ctx) => { +composer.command("anime", async (ctx) => { if (!ctx.match) { return ctx.reply( - 'Provide Search Keyword alongside command.\ne.g : `/anime Naruto`', - { parse_mode: 'MarkdownV2' } + "Provide Search Keyword alongside command.\ne.g : `/anime Naruto`", + { parse_mode: "MarkdownV2" }, ); } const resp = await search(ctx.match); if (!resp) { - return ctx.reply('No Results Found'); + return ctx.reply("No Results Found"); } const results = resp.Page.media .map(({ title }, index) => `${index + 1} : ${title.romaji}`) - .join('\n'); + .join("\n"); const { pageInfo } = resp.Page; const keyboard = new InlineKeyboard(); for (let i = 0; i < resp.Page.media.length; i++) { const media = resp.Page.media[i]; - const resId = - pageInfo.currentPage > 1 - ? pageInfo.perPage * (pageInfo.currentPage - 1) - : i + 1; + const resId = pageInfo.currentPage > 1 + ? pageInfo.perPage * (pageInfo.currentPage - 1) + : i + 1; keyboard.text( resId.toString(), JSON.stringify({ user: ctx.from?.id, - type: 'ANIME', + type: "ANIME", id: media.id, - action: 'media' - }) + action: "media", + }), ); if (!((i + 1) % 5)) { keyboard.row(); @@ -43,15 +42,15 @@ composer.command('anime', async (ctx) => { } keyboard .row() - .text('❌', JSON.stringify({ user: ctx.from?.id, action: 'delete' })); + .text("❌", JSON.stringify({ user: ctx.from?.id, action: "delete" })); return await ctx.replyWithPhoto( - 'https://telegra.ph/file/489303b893fd3e70f1b1a.png', + "https://telegra.ph/file/489303b893fd3e70f1b1a.png", { reply_markup: keyboard, caption: `Search Results for ${ctx.match}\n\n${results}`, - parse_mode: 'HTML' - } + parse_mode: "HTML", + }, ); }); diff --git a/src/commands/help.ts b/src/commands/help.ts index 146d599..6ea98fa 100644 --- a/src/commands/help.ts +++ b/src/commands/help.ts @@ -1,16 +1,16 @@ -import { Composer } from 'grammy'; +import { Composer } from "grammy"; const composer = new Composer(); -composer.command('help', async (ctx) => { +composer.command("help", async (ctx) => { const helpMsg = [ `Available Commands : `, `/start : Start the Bot`, `/help : Show Help Menu.`, `/anime : Search Anime`, - `/manga : Search Manga.` - ].join('\n'); - return await ctx.reply(helpMsg, { parse_mode: 'HTML' }); + `/manga : Search Manga.`, + ].join("\n"); + return await ctx.reply(helpMsg, { parse_mode: "HTML" }); }); export default composer; diff --git a/src/commands/id.ts b/src/commands/id.ts index bb4db2a..01bf600 100644 --- a/src/commands/id.ts +++ b/src/commands/id.ts @@ -1,20 +1,20 @@ -import { Composer } from 'grammy'; +import { Composer } from "grammy"; const composer = new Composer(); -composer.command('id', async (ctx) => { +composer.command("id", async (ctx) => { if (ctx.message?.reply_to_message?.from?.id) { const { id, first_name } = ctx.message.reply_to_message.from; return ctx.reply(`${first_name}'s ID : ${id}`, { - parse_mode: 'HTML' + parse_mode: "HTML", }); } return await ctx.reply( `User ID : ${ctx.from?.id}\n` + - (ctx.message?.chat.type !== 'private' + (ctx.message?.chat.type !== "private" ? `Chat ID : ${ctx.message?.chat.id}` - : ''), - { parse_mode: 'HTML' } + : ""), + { parse_mode: "HTML" }, ); }); diff --git a/src/commands/index.ts b/src/commands/index.ts deleted file mode 100644 index 467a2d1..0000000 --- a/src/commands/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Composer } from 'grammy'; - -import start from './start'; -import help from './help'; -import anime from './anime'; -import manga from './manga'; -import id from './id'; - -const composer = new Composer(); - -composer.use(start, help, anime, manga, id); - -export default composer; diff --git a/src/commands/manga.ts b/src/commands/manga.ts index c863925..0f9864b 100644 --- a/src/commands/manga.ts +++ b/src/commands/manga.ts @@ -1,41 +1,40 @@ -import { Composer, InlineKeyboard } from 'grammy'; -import { search } from '../anilist'; +import { Composer, InlineKeyboard } from "grammy"; +import { search } from "../anilist/mod.ts"; const composer = new Composer(); -composer.command('manga', async (ctx) => { +composer.command("manga", async (ctx) => { if (!ctx.match) { return ctx.reply( - 'Provide Search Keyword alongside command.\ne.g : `/anime Naruto`', - { parse_mode: 'MarkdownV2' } + "Provide Search Keyword alongside command.\ne.g : `/anime Naruto`", + { parse_mode: "MarkdownV2" }, ); } - const resp = await search(ctx.match, 'MANGA'); + const resp = await search(ctx.match, "MANGA"); if (!resp) { - return ctx.reply('No Results Found'); + return ctx.reply("No Results Found"); } const results = resp.Page.media .map(({ title }, index) => `${index + 1} : ${title.romaji}`) - .join('\n'); + .join("\n"); const { pageInfo } = resp.Page; const keyboard = new InlineKeyboard(); for (let i = 0; i < resp.Page.media.length; i++) { const media = resp.Page.media[i]; - const resId = - pageInfo.currentPage > 1 - ? pageInfo.perPage * (pageInfo.currentPage - 1) - : i + 1; + const resId = pageInfo.currentPage > 1 + ? pageInfo.perPage * (pageInfo.currentPage - 1) + : i + 1; keyboard.text( resId.toString(), JSON.stringify({ user: ctx.from?.id, - type: 'MANGA', + type: "MANGA", id: media.id, - action: 'media' - }) + action: "media", + }), ); if (!((i + 1) % 5)) { keyboard.row(); @@ -43,15 +42,15 @@ composer.command('manga', async (ctx) => { } keyboard .row() - .text('❌', JSON.stringify({ user: ctx.from?.id, action: 'delete' })); + .text("❌", JSON.stringify({ user: ctx.from?.id, action: "delete" })); return await ctx.replyWithPhoto( - 'https://telegra.ph/file/489303b893fd3e70f1b1a.png', + "https://telegra.ph/file/489303b893fd3e70f1b1a.png", { reply_markup: keyboard, caption: `Search Results for ${ctx.match}\n\n${results}`, - parse_mode: 'HTML' - } + parse_mode: "HTML", + }, ); }); diff --git a/src/commands/mod.ts b/src/commands/mod.ts new file mode 100644 index 0000000..ca25490 --- /dev/null +++ b/src/commands/mod.ts @@ -0,0 +1,13 @@ +import { Composer } from "grammy"; + +import start from "./start.ts"; +import help from "./help.ts"; +import anime from "./anime.ts"; +import manga from "./manga.ts"; +import id from "./id.ts"; + +const composer = new Composer(); + +composer.use(start, help, anime, manga, id); + +export default composer; diff --git a/src/commands/start.ts b/src/commands/start.ts index e435fb1..8a480eb 100644 --- a/src/commands/start.ts +++ b/src/commands/start.ts @@ -1,22 +1,22 @@ -import { Composer, InlineKeyboard } from 'grammy'; +import { Composer, InlineKeyboard } from "grammy"; const composer = new Composer(); -composer.command('start', (ctx) => { +composer.command("start", (ctx) => { const keyboard = new InlineKeyboard(); ctx.reply( "Hi There . Have a Great Day\nReport Bug/Errors/Suggesions : Λгɳαɓ", { - parse_mode: 'HTML', + parse_mode: "HTML", reply_markup: keyboard - .url('Bot Updates & News', 'https://t.me/xdbots') + .url("Bot Updates & News", "https://t.me/xdbots") .row() - .url('Help & More', 'https://telegra.ph/AnimeDB-Bot--HELP-08-03') - .url('Rate Me', 'https://t.me/tlgrmcbot?start=animedb_bot-review') + .url("Help & More", "https://telegra.ph/AnimeDB-Bot--HELP-08-03") + .url("Rate Me", "https://t.me/tlgrmcbot?start=animedb_bot-review") .row() - .switchInlineCurrent('Search Anime', '') - .switchInlineCurrent('Search Manga', ' ') - } + .switchInlineCurrent("Search Anime", "") + .switchInlineCurrent("Search Manga", " "), + }, ); }); diff --git a/src/express.ts b/src/express.ts deleted file mode 100644 index 46fc361..0000000 --- a/src/express.ts +++ /dev/null @@ -1,19 +0,0 @@ -import express from 'express'; -import { webhookCallback } from 'grammy'; -import bot from './bot'; - -const app = express(); - -const token = process.env.BOT_TOKEN; -if (!token) { - throw new Error('BOT_TOKEN is not defined'); -} - -app.get(`/${token}`, async (req, res) => { - const fullUrl = `https://${req.get('host')}${req.originalUrl}`; - await bot.api.setWebhook(fullUrl); - return res.json({ success: true }); -}); -app.post(`/${token}`, express.json(), webhookCallback(bot, 'express')); - -app.listen(process.env.PORT || 3000); diff --git a/src/handlers/callbackQuery.ts b/src/handlers/callbackQuery.ts index 4fb65a8..3b0998b 100644 --- a/src/handlers/callbackQuery.ts +++ b/src/handlers/callbackQuery.ts @@ -1,17 +1,17 @@ -import { Composer, InlineKeyboard } from 'grammy'; -import { getMedia } from '../anilist'; -import { parseMedia } from '../utils'; +import { Composer, InlineKeyboard } from "grammy"; +import { getMedia } from "../anilist/mod.ts"; +import { parseMedia } from "../utils.ts"; const composer = new Composer(); interface CallbackData { user: number; - type: 'ANIME' | 'MANGA'; + type: "ANIME" | "MANGA"; id: number; action: string; } -composer.on('callback_query', async (ctx) => { +composer.on("callback_query", async (ctx) => { if (!ctx.callbackQuery?.data) { return; } @@ -20,57 +20,57 @@ composer.on('callback_query', async (ctx) => { if (ctx.from?.id !== user) { return ctx.answerCallbackQuery({ - text: 'Stay away please or send your own query', - show_alert: true + text: "Stay away please or send your own query", + show_alert: true, }); } if (action) { switch (action) { - case 'delete': + case "delete": return ctx.deleteMessage(); - case 'media': { + case "media": { const result = await getMedia(Number(id), type); if (!result) { await ctx.deleteMessage(); - return ctx.reply('Sometihng Went Wrong'); + return ctx.reply("Sometihng Went Wrong"); } const { Media } = result; const { trailer } = Media; const message = parseMedia(Media, type); const keyboard = new InlineKeyboard() - .url('AniList', `https://anilist.co/${type?.toLowerCase()}/${id}`) + .url("AniList", `https://anilist.co/${type?.toLowerCase()}/${id}`) .url( - 'MyAnimeList', - `https://myanimelist.net/${type?.toLowerCase()}/${Media.idMal}` + "MyAnimeList", + `https://myanimelist.net/${type?.toLowerCase()}/${Media.idMal}`, ) .row(); - if (trailer?.site === 'youtube') { - keyboard.url('Watch Trailer', `https://youtu.be/${trailer.id}`); + if (trailer?.site === "youtube") { + keyboard.url("Watch Trailer", `https://youtu.be/${trailer.id}`); } try { return await ctx.editMessageMedia( { - type: 'photo', + type: "photo", media: `https://img.anili.st/media/${id}`, caption: message, - parse_mode: 'HTML' + parse_mode: "HTML", }, { - reply_markup: keyboard - } + reply_markup: keyboard, + }, ); } catch (err) { console.log(err); return ctx.answerCallbackQuery({ - text: 'Something Went Wrong , Please Report this to @Arnab431', - show_alert: true + text: "Something Went Wrong , Please Report this to @Arnab431", + show_alert: true, }); } } default: - return ctx.answerCallbackQuery({ text: 'Unhandled Action' }); + return ctx.answerCallbackQuery({ text: "Unhandled Action" }); } } }); diff --git a/src/handlers/index.ts b/src/handlers/index.ts deleted file mode 100644 index 8f11f33..0000000 --- a/src/handlers/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Composer } from 'grammy'; -import callback from './callbackQuery'; -import inline from './inlineQuery'; - -const composer = new Composer(); -composer.use(callback, inline); - -export default composer; diff --git a/src/handlers/inlineQuery.ts b/src/handlers/inlineQuery.ts index 1d9c465..254a739 100644 --- a/src/handlers/inlineQuery.ts +++ b/src/handlers/inlineQuery.ts @@ -1,19 +1,19 @@ -import { Composer, InlineKeyboard } from 'grammy'; -import { InlineQueryResultArticle } from '@grammyjs/types'; -import { getInlineResults } from '../anilist'; -import { parseMedia } from '../utils'; +import { Composer, InlineKeyboard } from "grammy"; +import { InlineQueryResultArticle } from "grammy/types.ts"; +import { getInlineResults } from "../anilist/mod.ts"; +import { parseMedia } from "../utils.ts"; const composer = new Composer(); -composer.on('inline_query', async (ctx) => { +composer.on("inline_query", async (ctx) => { const { query } = ctx.inlineQuery; - if (query.startsWith(' ')) { + if (query.startsWith(" ")) { const args = query.substring(4); if (args.length < 3) { return; } - const result = await getInlineResults(args, 'MANGA'); + const result = await getInlineResults(args, "MANGA"); if (!result) { return; } @@ -21,39 +21,39 @@ composer.on('inline_query', async (ctx) => { const mangas: InlineQueryResultArticle[] = media.map((item) => { const keyboard = new InlineKeyboard().url( - 'AniList', - `https://anilist.co/manga/${item.id}` + "AniList", + `https://anilist.co/manga/${item.id}`, ); if (item.idMal) { keyboard.url( - 'MyAnimeList', - `https://myanimelist.net/manga/${item.idMal}` + "MyAnimeList", + `https://myanimelist.net/manga/${item.idMal}`, ); } - if (item.trailer?.site === 'youtube') { + if (item.trailer?.site === "youtube") { keyboard .row() - .url('Watch Trailer', `https://youtu.be/${item.trailer.id}`); + .url("Watch Trailer", `https://youtu.be/${item.trailer.id}`); } return { - type: 'article', + type: "article", id: item.id.toString(), title: item.title.romaji, - description: '✪ ' + item.averageScore / 10, + description: "✪ " + item.averageScore / 10, thumb_url: item.coverImage.medium, input_message_content: { message_text: parseMedia(item), - parse_mode: 'HTML' + parse_mode: "HTML", }, - reply_markup: keyboard + reply_markup: keyboard, }; }); return await ctx.answerInlineQuery(mangas); } else { - const args = query.startsWith(' ') ? query.substring(4) : query; - const result = await getInlineResults(args, 'ANIME'); + const args = query.startsWith(" ") ? query.substring(4) : query; + const result = await getInlineResults(args, "ANIME"); if (!result) { return; } @@ -61,33 +61,33 @@ composer.on('inline_query', async (ctx) => { const animes: InlineQueryResultArticle[] = media.map((item) => { const keyboard = new InlineKeyboard().url( - 'AniList', - `https://anilist.co/anime/${item.id}` + "AniList", + `https://anilist.co/anime/${item.id}`, ); if (item.idMal) { keyboard.url( - 'MyAnimeList', - `https://myanimelist.net/anime/${item.idMal}` + "MyAnimeList", + `https://myanimelist.net/anime/${item.idMal}`, ); } - if (item.trailer?.site === 'youtube') { + if (item.trailer?.site === "youtube") { keyboard .row() - .url('Watch Trailer', `https://youtu.be/${item.trailer.id}`); + .url("Watch Trailer", `https://youtu.be/${item.trailer.id}`); } return { - type: 'article', + type: "article", id: item.id.toString(), title: item.title.romaji, - description: '✪ ' + item.averageScore / 10, + description: "✪ " + item.averageScore / 10, thumb_url: item.coverImage.medium, input_message_content: { message_text: parseMedia(item), - parse_mode: 'HTML' + parse_mode: "HTML", }, - reply_markup: keyboard + reply_markup: keyboard, }; }); return await ctx.answerInlineQuery(animes); diff --git a/src/handlers/mod.ts b/src/handlers/mod.ts new file mode 100644 index 0000000..6ded784 --- /dev/null +++ b/src/handlers/mod.ts @@ -0,0 +1,8 @@ +import { Composer } from "grammy"; +import callback from "./callbackQuery.ts"; +import inline from "./inlineQuery.ts"; + +const composer = new Composer(); +composer.use(callback, inline); + +export default composer; diff --git a/src/middlewares/index.ts b/src/middleware/mod.ts similarity index 55% rename from src/middlewares/index.ts rename to src/middleware/mod.ts index a932c2b..96a9aa1 100644 --- a/src/middlewares/index.ts +++ b/src/middleware/mod.ts @@ -1,5 +1,5 @@ -import { Composer } from 'grammy'; -import ping from './ping'; +import { Composer } from "grammy"; +import ping from "./ping.ts"; const composer = new Composer(); composer.use(ping); diff --git a/src/middlewares/ping.ts b/src/middleware/ping.ts similarity index 53% rename from src/middlewares/ping.ts rename to src/middleware/ping.ts index 03ef3dd..da532aa 100644 --- a/src/middlewares/ping.ts +++ b/src/middleware/ping.ts @@ -1,4 +1,4 @@ -import { Context, MiddlewareFn } from 'grammy'; +import { Context, MiddlewareFn } from "grammy"; const ping: MiddlewareFn = async (ctx, next) => { const start = new Date().getTime(); @@ -9,11 +9,9 @@ const ping: MiddlewareFn = async (ctx, next) => { } const ms = new Date().getTime() - start; console.log( - `${new Date().toTimeString()} >> Update ID: ${ - ctx.update.update_id - } || Response time: ${ms} ms || User: ${ctx.from?.first_name} (${ - ctx.from?.id - })` + `${ + new Date().toTimeString() + } >> Update ID: ${ctx.update.update_id} || Response time: ${ms} ms || User: ${ctx.from?.first_name} (${ctx.from?.id})`, ); }; diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index 86cd8f9..0000000 --- a/src/server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import bot from './bot'; - -bot.start({ - drop_pending_updates: true, - allowed_updates: ['callback_query', 'inline_query', 'message'] -}); - -process.once('SIGINT', () => bot.stop()); -process.once('SIGTERM', () => bot.stop()); diff --git a/src/utils.ts b/src/utils.ts index c304a9e..e265ed2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,37 +1,35 @@ -import { Media } from './anilist/getMedia'; +import { Media } from "./anilist/getMedia.ts"; export const parseMedia = ( media: Media, - type: 'ANIME' | 'MANGA' = 'ANIME' + type: "ANIME" | "MANGA" = "ANIME", ): string => { - let synopsis = - media.description && media.description.replace(/( |<([^>]+)>)/gi, ''); + let synopsis = media.description && + media.description.replace(/( |<([^>]+)>)/gi, ""); - let message = - `${media.title.romaji} (${media.format})\n\n` + + let message = `${media.title.romaji} (${media.format})\n\n` + `${ media.title.english && media.title.english !== media.title.romaji - ? '• English Title : ' + media.title.english + '\n' - : '' + ? "• English Title : " + media.title.english + "\n" + : "" }` + `• Average Rating : ${media.averageScore} \n` + `• Status : ${media.status}\n` + - `• Genres : ${media.genres.join(', ')}\n` + + `• Genres : ${media.genres.join(", ")}\n` + (media.studios.nodes.length - ? `• Studios : ${media.studios.nodes + ? `• Studios : ${ + media.studios.nodes .map((data) => data.name) - .join(', ')}\n` - : '') + + .join(", ") + }\n` + : "") + `\n`; if (synopsis) { - synopsis = - synopsis.length > 900 - message.length - ? synopsis.substring(0, 900 - message.length) + - `... Read More` - : synopsis; + synopsis = synopsis.length > 900 - message.length + ? synopsis.substring(0, 900 - message.length) + + `... Read More` + : synopsis; message += `• Synopsis : ${synopsis}`; } diff --git a/tsconfig.base.json b/tsconfig.base.json deleted file mode 100644 index 156a02d..0000000 --- a/tsconfig.base.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "CommonJS", - "strict": true, - "target": "ES2019", - "esModuleInterop": true, - "outDir": "build/", - "skipLibCheck": true - }, - "include": ["src/"], - "exclude": ["node_modules"] -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index a12d786..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "exclude": [ - "src/**/*.test.ts" - ] -} \ No newline at end of file