diff --git a/.env.example b/.env.example index 8a9b1f05..3c6ed263 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,8 @@ -HOST="localhost" -PORT="3000" -DATABASE_URL="mysql://root:12345@localhost:3306/baileys_api" -RECONNECT_INTERVAL="5000" -MAX_RECONNECT_RETRIES="5" -SSE_MAX_QR_GENERATION="10" -LOG_LEVEL="warn" \ No newline at end of file +NODE_ENV=development +LOG_LEVEL=debug +DATABASE_URL=postgres://user:password@localhost:5432/baileys_api +PORT=3000 +MAX_RECONNECT_ATTEMPTS=5 +RECONNECT_INTERVAL=5000 +MAX_QR_ATTEMPTS=5 +PAIR_CODE_TIMEOUT=600000 \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index b9470778..00000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -dist/ diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 6c7e090d..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - root: true, - env: { - node: true, - }, - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], - rules: { - '@typescript-eslint/consistent-type-imports': 'error', - '@typescript-eslint/no-unused-vars': 'error', - '@typescript-eslint/no-non-null-assertion': 'off', - }, -}; diff --git a/.gitignore b/.gitignore index 64a35588..a14702c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,34 @@ -node_modules/ -dist/ -debug/ -prisma/migrations/ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files .env -*.tgz \ No newline at end of file +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index ecc79b0a..00000000 --- a/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -dist/ -debug/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..e1b90940 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,19 @@ +{ + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[jsonc]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.biome": "always", + "source.organizeImports.biome": "always" + } +} diff --git a/README.md b/README.md index 0a723fc3..8d98c5d9 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ -> 🚨 **NOTICE**: `@adiwajshing/baileys` which is this project relied on, has been discontinued. Thus, this project will be archived and stopped receiving updates anymore. Thanks everyone who's been part of this❤️ +> 🚨 **NOTICE**: This project status is still WIP --- # Baileys API -An implementation of [@adiwajshing/Baileys](https://github.com/adiwajshing/Baileys) as a simple REST API with multiple device support +An implementation of [baileys](https://github.com/WhiskeySockets/baileys) as REST API that supports managing multiple connections at once ## Requirements -- **NodeJS** version **14.5.0** or higher -- **Prisma** [supported databases](https://www.prisma.io/docs/reference/database-reference/supported-databases). Tested on MySQL and PostgreSQL +- Latest version of **NodeJS v20** or any higher major versions +- **PostgreSQL** database. It's possible to use other databases, but you might've to update the **drizzle** schema and adjust some part of the codes ## Installation @@ -31,66 +31,61 @@ You can skip this part if you're using the prebuilt one from the release page ## Setup -1. Copy the `.env.example` file and rename it into `.env`, then update your [connection url](https://www.prisma.io/docs/reference/database-reference/connection-urls) in the `DATABASE_URL` field -1. Update your [provider](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#fields) in the `prisma/schema.prisma` file if you're using database other than MySQL -1. Run your [migration](https://www.prisma.io/docs/reference/api-reference/command-reference#prisma-migrate) +1. Copy the `.env.example` file and rename it into `.env`, then update your connection url in the `DATABASE_URL` field +1. Run the migration ```sh -npx prisma migrate (dev|deploy) +npm run db:migrate ``` or push the schema ```sh -npx prisma db push +npm run db:push ``` -Don't forget to always re-run those whenever there's a change on the `prisma/schema.prisma` file +Don't forget to always re-run those whenever there's a change on the `migrations/` directory ## `.env` Configurations ```env -# Listening Host -HOST="localhost" - -# Listening Port -PORT="3000" - -# Database Connection URL -DATABASE_URL="mysql://root:12345@localhost:3306/baileys_api" - -# Reconnect Interval (in Milliseconds) -RECONNECT_INTERVAL="5000" - -# Maximum Reconnect Attempts -MAX_RECONNECT_RETRIES="5" - -# Maximum SSE QR Generation Attempts -SSE_MAX_QR_GENERATION="10" - -# Pino Logger Level -LOG_LEVEL="warn" +# Environment +NODE_ENV=development +# Pino log level +LOG_LEVEL=debug +# Database connection url +DATABASE_URL=postgres://user:password@localhost:5432/baileys_api +# App port +PORT=3000 +# Max reconnect attempts before a connection is destroyed +MAX_RECONNECT_ATTEMPTS=5 +# Interval for each reconnect, this uses exponential backoff +RECONNECT_INTERVAL=5000 +# Max qr generation attempts before a connection is destroyed +MAX_QR_ATTEMPTS=5 +# Timeout for authenticating using pair code before a connection is destroyed +PAIR_CODE_TIMEOUT=600000 ``` ## Usage 1. Make sure you have completed the **Installation** and **Setup** step -1. You can then start the app using the `start` script +2. You can then start the app using the `start` script ```sh npm run start ``` -1. Now the endpoint should be available according to your environment variables configuration. Default is at `http://localhost:3000` +3. Now the endpoint should be available according to your environment variables configuration. Default is at `http://localhost:3000` ## API Docs -The API documentation is available online [here](https://documenter.getpostman.com/view/18988925/2s8Z73zWbg). You can also import the **Postman Collection File** `(postman_collection.json)` into your Postman App alternatively +The API follow OpenAPI v3.0 spec that's accessible at `/doc`. Additionally, a SwaggerUI is also available at `/ui` ## Notes -- There's no authentication, you may want to implement your own. I don't want to force anyone into using a specific authentication method, choose whatever you love +- There's no default authentication, you may want to implement your own. There's no opinionated way for authentication, use whatever suits your need ## Notice -This project is intended for learning purpose only, don't use it for spamming or any activities that's prohibited by **WhatsApp** +This project is not affiliated in any way, and is not intended for spamming or any activities that's prohibited by **WhatsApp** \ No newline at end of file diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..0d9ee963 --- /dev/null +++ b/biome.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedImports": "warn" + }, + "style": { + "noNonNullAssertion": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 00000000..c1976927 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "drizzle-kit"; +import { env } from "./src/lib/env"; + +export default defineConfig({ + dialect: "postgresql", + dbCredentials: { url: env.DATABASE_URL }, + out: "./migrations/", + schema: "./src/lib/db/schema.ts", + casing: "snake_case", +}); diff --git a/examples/sse.html b/examples/sse.html index 80172ab1..1bc020fe 100644 --- a/examples/sse.html +++ b/examples/sse.html @@ -1,24 +1,157 @@ - - - - - - SSE Example - - - qr -
Connection state:
-
- + + + + + +
+
+
+
+

Create Connection

+
+ + +
+
+ + +
+
+ + +
+ +
+
+

QR Code

+
+

No token available

+
+
+
+
+

Events

+
    +
  • No events yet
  • +
+
+
+
+ + - - + + + \ No newline at end of file diff --git a/package.json b/package.json index 9c73ea19..62d0ffb2 100644 --- a/package.json +++ b/package.json @@ -1,59 +1,65 @@ { - "name": "baileys-api", - "description": "Simple RESTful WhatsApp API", - "version": "1.0.0-beta.0", - "private": true, - "main": "dist/index.js", - "repository": "github:ookamiiixd/baileys-api", - "author": "Royhan (https://github.com/ookamiiixd)", - "bugs": { - "url": "https://github.com/ookamiiixd/baileys-api/issues" - }, - "homepage": "https://github.com/ookamiiixd/baileys-api#readme", - "license": "MIT", - "scripts": { - "start": "node .", - "build": "tsc", - "lint": "eslint .", - "format": "prettier . --write" - }, - "dependencies": { - "@adiwajshing/baileys": "^5.0.0", - "@hapi/boom": "^10.0.0", - "@ookamiiixd/baileys-store": "^1.0.0-beta.0", - "@prisma/client": "^4.7.1", - "cors": "^2.8.5", - "dotenv": "^16.0.3", - "express": "^4.18.2", - "express-validator": "^6.14.2", - "link-preview-js": "^3.0.0", - "pino": "^8.7.0", - "qrcode": "^1.5.1", - "qrcode-terminal": "^0.12.0", - "sharp": "^0.30.5" - }, - "devDependencies": { - "@types/cors": "^2.8.13", - "@types/express": "^4.17.14", - "@types/node": "^18.11.10", - "@types/qrcode": "^1.5.0", - "@types/ws": "^8.5.3", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", - "eslint": "^8.29.0", - "eslint-config-prettier": "^8.5.0", - "prettier": "^2.8.0", - "prettier-plugin-organize-imports": "^3.2.1", - "prisma": "^4.7.1", - "ts-node": "^10.9.1", - "typescript": "^4.9.3" - }, - "engines": { - "node": ">=14.5.0" - }, - "files": [ - "dist/", - "prisma/schema.prisma", - ".env.example" - ] + "name": "baileys-api", + "description": "An implementation of baileys as REST API", + "version": "2.0.0", + "repository": "https://github.com/ookamiiixd/baileys-api", + "author": "Royhan (https://github.com/ookamiiixd)", + "bugs": { + "url": "https://github.com/ookamiiixd/baileys-api/issues" + }, + "homepage": "https://github.com/ookamiiixd/baileys-api", + "license": "MIT", + "module": "dist/index.js", + "type": "module", + "private": true, + "scripts": { + "start": "node --env-file=.env dist/index.js", + "dev": "tsx --env-file=.env src/index.ts", + "build": "tsup src/index.ts --format esm", + "db:push": "drizzle-kit push", + "db:generate": "drizzle-kit generate", + "db:drop": "drizzle-kit drop", + "db:migrate": "drizzle-kit migrate", + "db:studio": "drizzle-kit studio --port 3001", + "lint": "biome lint .", + "lint:fix": "biome lint . --write", + "format": "biome format . --write", + "typecheck": "tsc" + }, + "files": [ + "dist/", + "migrations/", + ".env.example", + "drizzle.config.ts" + ], + "devDependencies": { + "@biomejs/biome": "2.1.2", + "@types/node": "^20.19.9", + "@types/pg": "^8.15.4", + "@types/qrcode": "^1.5.5", + "drizzle-kit": "^0.31.4", + "tsup": "^8.5.0", + "tsx": "^4.20.3" + }, + "peerDependencies": { + "typescript": "^5" + }, + "dependencies": { + "@hapi/boom": "^10.0.1", + "@hono/node-server": "^1.17.1", + "@hono/swagger-ui": "^0.5.2", + "@hono/zod-openapi": "^1.0.2", + "@hono/zod-validator": "^0.7.2", + "baileys": "^6.7.18", + "drizzle-orm": "^0.44.3", + "drizzle-zod": "^0.8.2", + "hono": "^4.8.5", + "link-preview-js": "^3.1.0", + "long": "^5.3.2", + "pg": "^8.16.3", + "pino": "^9.7.0", + "qrcode": "^1.5.4", + "sharp": "^0.34.3", + "zod": "^4.0.5" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..fef1c923 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4111 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@hapi/boom': + specifier: ^10.0.1 + version: 10.0.1 + '@hono/node-server': + specifier: ^1.17.1 + version: 1.17.1(hono@4.8.5) + '@hono/swagger-ui': + specifier: ^0.5.2 + version: 0.5.2(hono@4.8.5) + '@hono/zod-openapi': + specifier: ^1.0.2 + version: 1.0.2(hono@4.8.5)(zod@4.0.5) + '@hono/zod-validator': + specifier: ^0.7.2 + version: 0.7.2(hono@4.8.5)(zod@4.0.5) + baileys: + specifier: ^6.7.18 + version: 6.7.18(eslint@9.31.0)(link-preview-js@3.1.0)(sharp@0.34.3)(typescript@5.8.3) + drizzle-orm: + specifier: ^0.44.3 + version: 0.44.3(@types/pg@8.15.4)(bun-types@1.2.19(@types/react@19.1.8))(pg@8.16.3) + drizzle-zod: + specifier: ^0.8.2 + version: 0.8.2(drizzle-orm@0.44.3(@types/pg@8.15.4)(bun-types@1.2.19(@types/react@19.1.8))(pg@8.16.3))(zod@4.0.5) + hono: + specifier: ^4.8.5 + version: 4.8.5 + link-preview-js: + specifier: ^3.1.0 + version: 3.1.0 + long: + specifier: ^5.3.2 + version: 5.3.2 + pg: + specifier: ^8.16.3 + version: 8.16.3 + pino: + specifier: ^9.7.0 + version: 9.7.0 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + sharp: + specifier: ^0.34.3 + version: 0.34.3 + typescript: + specifier: ^5 + version: 5.8.3 + zod: + specifier: ^4.0.5 + version: 4.0.5 + devDependencies: + '@biomejs/biome': + specifier: 2.1.2 + version: 2.1.2 + '@types/node': + specifier: ^20.19.9 + version: 20.19.9 + '@types/pg': + specifier: ^8.15.4 + version: 8.15.4 + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 + drizzle-kit: + specifier: ^0.31.4 + version: 0.31.4 + tsup: + specifier: ^8.5.0 + version: 8.5.0(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + tsx: + specifier: ^4.20.3 + version: 4.20.3 + +packages: + + '@asteasolutions/zod-to-openapi@8.0.0': + resolution: {integrity: sha512-C56hBPiraeSWUNLz8mB5Z0/0LdfaFD5d6WB/+hdUg0MiC7egTgvWRGh3M3jZ3CRl03l/NJWnmv5D3OUAz+JGeg==} + peerDependencies: + zod: ^4.0.0 + + '@biomejs/biome@2.1.2': + resolution: {integrity: sha512-yq8ZZuKuBVDgAS76LWCfFKHSYIAgqkxVB3mGVVpOe2vSkUTs7xG46zXZeNPRNVjiJuw0SZ3+J2rXiYx0RUpfGg==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.1.2': + resolution: {integrity: sha512-leFAks64PEIjc7MY/cLjE8u5OcfBKkcDB0szxsWUB4aDfemBep1WVKt0qrEyqZBOW8LPHzrFMyDl3FhuuA0E7g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.1.2': + resolution: {integrity: sha512-Nmmv7wRX5Nj7lGmz0FjnWdflJg4zii8Ivruas6PBKzw5SJX/q+Zh2RfnO+bBnuKLXpj8kiI2x2X12otpH6a32A==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.1.2': + resolution: {integrity: sha512-qgHvafhjH7Oca114FdOScmIKf1DlXT1LqbOrrbR30kQDLFPEOpBG0uzx6MhmsrmhGiCFCr2obDamu+czk+X0HQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.1.2': + resolution: {integrity: sha512-NWNy2Diocav61HZiv2enTQykbPP/KrA/baS7JsLSojC7Xxh2nl9IczuvE5UID7+ksRy2e7yH7klm/WkA72G1dw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.1.2': + resolution: {integrity: sha512-xlB3mU14ZUa3wzLtXfmk2IMOGL+S0aHFhSix/nssWS/2XlD27q+S6f0dlQ8WOCbYoXcuz8BCM7rCn2lxdTrlQA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.1.2': + resolution: {integrity: sha512-Km/UYeVowygTjpX6sGBzlizjakLoMQkxWbruVZSNE6osuSI63i4uCeIL+6q2AJlD3dxoiBJX70dn1enjQnQqwA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.1.2': + resolution: {integrity: sha512-G8KWZli5ASOXA3yUQgx+M4pZRv3ND16h77UsdunUL17uYpcL/UC7RkWTdkfvMQvogVsAuz5JUcBDjgZHXxlKoA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.1.2': + resolution: {integrity: sha512-9zajnk59PMpjBkty3bK2IrjUsUHvqe9HWwyAWQBjGLE7MIBjbX2vwv1XPEhmO2RRuGoTkVx3WCanHrjAytICLA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@cacheable/node-cache@1.6.0': + resolution: {integrity: sha512-kjWfU05jGXDDakIMakvBcS1++pNrU0PQgJ7cbmgZZbgKe8PzS+z6mVbEAzsmzM+AuYsbauChNEgtRdbDUKRUSQ==} + + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.31.0': + resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.4': + resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@hapi/boom@10.0.1': + resolution: {integrity: sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==} + + '@hapi/boom@9.1.4': + resolution: {integrity: sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==} + + '@hapi/hoek@11.0.7': + resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hono/node-server@1.17.1': + resolution: {integrity: sha512-SY79W/C+2b1MyAzmIcV32Q47vO1b5XwLRwj8S9N6Jr5n1QCkIfAIH6umOSgqWZ4/v67hg6qq8Ha5vZonVidGsg==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@hono/swagger-ui@0.5.2': + resolution: {integrity: sha512-7wxLKdb8h7JTdZ+K8DJNE3KXQMIpJejkBTQjrYlUWF28Z1PGOKw6kUykARe5NTfueIN37jbyG/sBYsbzXzG53A==} + peerDependencies: + hono: '*' + + '@hono/zod-openapi@1.0.2': + resolution: {integrity: sha512-zbxUZEnA+NaeotXRI2YPL5GEbz38DiO7Zp1nx/7yXOA2ITkcASYsYe/My/I38c44GCu+oUVM899zn4TBVn7JRg==} + engines: {node: '>=16.0.0'} + peerDependencies: + hono: '>=4.3.6' + zod: ^4.0.0 + + '@hono/zod-validator@0.7.2': + resolution: {integrity: sha512-ub5eL/NeZ4eLZawu78JpW/J+dugDAYhwqUIdp9KYScI6PZECij4Hx4UsrthlEUutqDDhPwRI0MscUfNkvn/mqQ==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.25.0 || ^4.0.0 + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@keyv/serialize@1.1.0': + resolution: {integrity: sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + cpu: [x64] + os: [win32] + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + '@types/node@10.17.60': + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + + '@types/node@20.19.9': + resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} + + '@types/pg@8.15.4': + resolution: {integrity: sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==} + + '@types/qrcode@1.5.5': + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + + '@typescript-eslint/eslint-plugin@8.38.0': + resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.38.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.38.0': + resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.38.0': + resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.38.0': + resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.38.0': + resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.38.0': + resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.38.0': + resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.38.0': + resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.38.0': + resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.38.0': + resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@whiskeysockets/eslint-config@https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/299e8389baf62f9aa3034de18ff0d62cc0a5e838': + resolution: {tarball: https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/299e8389baf62f9aa3034de18ff0d62cc0a5e838} + version: 1.0.0 + peerDependencies: + eslint: ^9.31.0 + typescript: '>=4' + + '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/4d08331a833727c338c1a90041d17b870210dfae': + resolution: {tarball: https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/4d08331a833727c338c1a90041d17b870210dfae} + version: 2.0.1 + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + + baileys@6.7.18: + resolution: {integrity: sha512-o90lVPkzAKCw10Ui1mhFxAUJn/Yn/RkB4jgHlFFtIXwB3L3oxOK58jbJdLvVIf3jxpDmGOQqtqu/JEnZc3mrTg==} + engines: {node: '>=20.0.0'} + peerDependencies: + audio-decode: ^2.1.3 + jimp: ^0.16.1 + link-preview-js: ^3.0.0 + sharp: ^0.32.6 + peerDependenciesMeta: + audio-decode: + optional: true + jimp: + optional: true + link-preview-js: + optional: true + sharp: + optional: true + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bun-types@1.2.19: + resolution: {integrity: sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ==} + peerDependencies: + '@types/react': ^19 + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable@1.10.2: + resolution: {integrity: sha512-hMkETCRV4hwBAvjQY1/xGw15tlPj+7cM4d5HOlYJJFftLQVRCboVX+mT6AJ6eL0fsqUhSUwDiF+pgfTR2r2Hxg==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.11: + resolution: {integrity: sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==} + engines: {node: '>= 6'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + curve25519-js@0.0.4: + resolution: {integrity: sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + drizzle-kit@0.31.4: + resolution: {integrity: sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA==} + hasBin: true + + drizzle-orm@0.44.3: + resolution: {integrity: sha512-8nIiYQxOpgUicEL04YFojJmvC4DNO4KoyXsEIqN44+g6gNBr6hmVpWk3uyAt4CaTiRGDwoU+alfqNNeonLAFOQ==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1.13' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@upstash/redis': '>=1.34.7' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@upstash/redis': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + drizzle-zod@0.8.2: + resolution: {integrity: sha512-9Do/16OjFFNrQDZgvMtxtDDwKWbFOxUAIwNPKX98SfxrP8H18vhN1BvNXbhelLcdgCE7GEaXDJqBjMExSkhpkA==} + peerDependencies: + drizzle-orm: '>=0.36.0' + zod: ^3.25.1 + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-simple-import-sort@12.1.1: + resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} + peerDependencies: + eslint: '>=5.0.0' + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.31.0: + resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-type@16.5.4: + resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} + engines: {node: '>=10'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hono@4.8.5: + resolution: {integrity: sha512-Up2cQbtNz1s111qpnnECdTGqSIUIhZJMLikdKkshebQSEBcoUKq6XJayLGqSZWidiH0zfHRCJqFu062Mz5UuRA==} + engines: {node: '>=16.9.0'} + + hookified@1.10.0: + resolution: {integrity: sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + keyv@5.4.0: + resolution: {integrity: sha512-TMckyVjEoacG5IteUpUrOBsFORtheqziVyyY2dLUwg1jwTb8u48LX4TgmtogkNl9Y9unaEJ1luj10fGyjMGFOQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + link-preview-js@3.1.0: + resolution: {integrity: sha512-hSvdHCy7tZJ8ohdgN5WcTBKaubpX7saYBzrSmNDDHnC7P6q+F4we+dwXuEr9LuplnkiGxkD4SaO4rrschfCZ2A==} + engines: {node: '>=18'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + music-metadata@7.14.0: + resolution: {integrity: sha512-xrm3w7SV0Wk+OythZcSbaI8mcr/KHd0knJieu8bVpaPfMv/Agz5EooCAPz3OR5hbYMiUG6dgAPKZKnMzV+3amA==} + engines: {node: '>=10'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + openapi3-ts@4.5.0: + resolution: {integrity: sha512-jaL+HgTq2Gj5jRcfdutgRGLosCy/hT8sQf6VOy+P+g36cZOjI1iukdPnijC+4CmeRzg/jEllJUboEic2FhxhtQ==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + peek-readable@4.1.0: + resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} + engines: {node: '>=8'} + + pg-cloudflare@1.2.7: + resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} + + pg-connection-string@2.9.1: + resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-pool@3.10.1: + resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg@8.16.3: + resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} + engines: {node: '>= 16.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} + hasBin: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + protobufjs@6.8.8: + resolution: {integrity: sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==} + hasBin: true + + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + engines: {node: '>=12.0.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@1.3.2: + resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + querystring@0.2.0: + resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readable-web-to-node-stream@3.0.4: + resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} + engines: {node: '>=8'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strtok3@6.3.0: + resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} + engines: {node: '>=10'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + token-types@4.2.1: + resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} + engines: {node: '>=10'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url@0.11.0: + resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@4.0.5: + resolution: {integrity: sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==} + +snapshots: + + '@asteasolutions/zod-to-openapi@8.0.0(zod@4.0.5)': + dependencies: + openapi3-ts: 4.5.0 + zod: 4.0.5 + + '@biomejs/biome@2.1.2': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.1.2 + '@biomejs/cli-darwin-x64': 2.1.2 + '@biomejs/cli-linux-arm64': 2.1.2 + '@biomejs/cli-linux-arm64-musl': 2.1.2 + '@biomejs/cli-linux-x64': 2.1.2 + '@biomejs/cli-linux-x64-musl': 2.1.2 + '@biomejs/cli-win32-arm64': 2.1.2 + '@biomejs/cli-win32-x64': 2.1.2 + + '@biomejs/cli-darwin-arm64@2.1.2': + optional: true + + '@biomejs/cli-darwin-x64@2.1.2': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.1.2': + optional: true + + '@biomejs/cli-linux-arm64@2.1.2': + optional: true + + '@biomejs/cli-linux-x64-musl@2.1.2': + optional: true + + '@biomejs/cli-linux-x64@2.1.2': + optional: true + + '@biomejs/cli-win32-arm64@2.1.2': + optional: true + + '@biomejs/cli-win32-x64@2.1.2': + optional: true + + '@cacheable/node-cache@1.6.0': + dependencies: + cacheable: 1.10.2 + hookified: 1.10.0 + keyv: 5.4.0 + + '@drizzle-team/brocli@0.10.2': {} + + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.10.1 + + '@esbuild/aix-ppc64@0.25.8': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.25.8': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.25.8': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.25.8': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.25.8': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.25.8': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.25.8': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.25.8': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.25.8': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.25.8': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.25.8': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.25.8': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.25.8': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.25.8': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.25.8': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.25.8': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.25.8': + optional: true + + '@esbuild/netbsd-arm64@0.25.8': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.25.8': + optional: true + + '@esbuild/openbsd-arm64@0.25.8': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.25.8': + optional: true + + '@esbuild/openharmony-arm64@0.25.8': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.25.8': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.25.8': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.25.8': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.25.8': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': + dependencies: + eslint: 9.31.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.15.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.31.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.4': + dependencies: + '@eslint/core': 0.15.1 + levn: 0.4.1 + + '@hapi/boom@10.0.1': + dependencies: + '@hapi/hoek': 11.0.7 + + '@hapi/boom@9.1.4': + dependencies: + '@hapi/hoek': 9.3.0 + + '@hapi/hoek@11.0.7': {} + + '@hapi/hoek@9.3.0': {} + + '@hono/node-server@1.17.1(hono@4.8.5)': + dependencies: + hono: 4.8.5 + + '@hono/swagger-ui@0.5.2(hono@4.8.5)': + dependencies: + hono: 4.8.5 + + '@hono/zod-openapi@1.0.2(hono@4.8.5)(zod@4.0.5)': + dependencies: + '@asteasolutions/zod-to-openapi': 8.0.0(zod@4.0.5) + '@hono/zod-validator': 0.7.2(hono@4.8.5)(zod@4.0.5) + hono: 4.8.5 + openapi3-ts: 4.5.0 + zod: 4.0.5 + + '@hono/zod-validator@0.7.2(hono@4.8.5)(zod@4.0.5)': + dependencies: + hono: 4.8.5 + zod: 4.0.5 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/sharp-darwin-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.0 + optional: true + + '@img/sharp-darwin-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + optional: true + + '@img/sharp-linux-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.0 + optional: true + + '@img/sharp-linux-arm@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.0 + optional: true + + '@img/sharp-linux-ppc64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.0 + optional: true + + '@img/sharp-linux-s390x@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.0 + optional: true + + '@img/sharp-linux-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + optional: true + + '@img/sharp-wasm32@0.34.3': + dependencies: + '@emnapi/runtime': 1.4.5 + optional: true + + '@img/sharp-win32-arm64@0.34.3': + optional: true + + '@img/sharp-win32-ia32@0.34.3': + optional: true + + '@img/sharp-win32-x64@0.34.3': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@keyv/serialize@1.1.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@rollup/rollup-android-arm-eabi@4.45.1': + optional: true + + '@rollup/rollup-android-arm64@4.45.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.45.1': + optional: true + + '@rollup/rollup-darwin-x64@4.45.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.45.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.45.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.45.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.45.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.45.1': + optional: true + + '@tokenizer/token@0.3.0': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/long@4.0.2': {} + + '@types/node@10.17.60': {} + + '@types/node@20.19.9': + dependencies: + undici-types: 6.21.0 + + '@types/pg@8.15.4': + dependencies: + '@types/node': 20.19.9 + pg-protocol: 1.10.3 + pg-types: 2.2.0 + + '@types/qrcode@1.5.5': + dependencies: + '@types/node': 20.19.9 + + '@types/react@19.1.8': + dependencies: + csstype: 3.1.3 + optional: true + + '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/type-utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.38.0 + eslint: 9.31.0 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.38.0 + debug: 4.4.1 + eslint: 9.31.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.38.0': + dependencies: + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 + + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.31.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.38.0': {} + + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + eslint: 9.31.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.38.0': + dependencies: + '@typescript-eslint/types': 8.38.0 + eslint-visitor-keys: 4.2.1 + + '@whiskeysockets/eslint-config@https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/299e8389baf62f9aa3034de18ff0d62cc0a5e838(eslint@9.31.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.8.3) + eslint: 9.31.0 + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.31.0) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/4d08331a833727c338c1a90041d17b870210dfae': + dependencies: + curve25519-js: 0.0.4 + protobufjs: 6.8.8 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + 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 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + argparse@2.0.1: {} + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + axios@1.10.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + baileys@6.7.18(eslint@9.31.0)(link-preview-js@3.1.0)(sharp@0.34.3)(typescript@5.8.3): + dependencies: + '@cacheable/node-cache': 1.6.0 + '@hapi/boom': 9.1.4 + '@whiskeysockets/eslint-config': https://codeload.github.com/whiskeysockets/eslint-config/tar.gz/299e8389baf62f9aa3034de18ff0d62cc0a5e838(eslint@9.31.0)(typescript@5.8.3) + async-mutex: 0.5.0 + axios: 1.10.0 + libsignal: '@whiskeysockets/libsignal-node@https://codeload.github.com/WhiskeySockets/libsignal-node/tar.gz/4d08331a833727c338c1a90041d17b870210dfae' + lodash: 4.17.21 + music-metadata: 7.14.0 + pino: 9.7.0 + protobufjs: 7.5.3 + ws: 8.18.3 + optionalDependencies: + link-preview-js: 3.1.0 + sharp: 0.34.3 + transitivePeerDependencies: + - bufferutil + - debug + - eslint + - supports-color + - typescript + - utf-8-validate + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-from@1.1.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bun-types@1.2.19(@types/react@19.1.8): + dependencies: + '@types/node': 20.19.9 + '@types/react': 19.1.8 + optional: true + + bundle-require@5.1.0(esbuild@0.25.8): + dependencies: + esbuild: 0.25.8 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + cacheable@1.10.2: + dependencies: + hookified: 1.10.0 + keyv: 5.4.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.0.0-rc.11: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + htmlparser2: 8.0.2 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + tslib: 2.8.1 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + + content-type@1.0.5: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + csstype@3.1.3: + optional: true + + curve25519-js@0.0.4: {} + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + detect-libc@2.0.4: {} + + dijkstrajs@1.0.3: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + drizzle-kit@0.31.4: + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.8 + esbuild-register: 3.6.0(esbuild@0.25.8) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.44.3(@types/pg@8.15.4)(bun-types@1.2.19(@types/react@19.1.8))(pg@8.16.3): + optionalDependencies: + '@types/pg': 8.15.4 + bun-types: 1.2.19(@types/react@19.1.8) + pg: 8.16.3 + + drizzle-zod@0.8.2(drizzle-orm@0.44.3(@types/pg@8.15.4)(bun-types@1.2.19(@types/react@19.1.8))(pg@8.16.3))(zod@4.0.5): + dependencies: + drizzle-orm: 0.44.3(@types/pg@8.15.4)(bun-types@1.2.19(@types/react@19.1.8))(pg@8.16.3) + zod: 4.0.5 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild-register@3.6.0(esbuild@0.25.8): + dependencies: + debug: 4.4.1 + esbuild: 0.25.8 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.25.8: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 + + escape-string-regexp@4.0.0: {} + + eslint-plugin-simple-import-sort@12.1.1(eslint@9.31.0): + dependencies: + eslint: 9.31.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.31.0: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.15.1 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.31.0 + '@eslint/plugin-kit': 0.3.4 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + 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.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-redact@3.5.0: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-type@16.5.4: + dependencies: + readable-web-to-node-stream: 3.0.4 + strtok3: 6.3.0 + token-types: 4.2.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.45.1 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + follow-redirects@1.15.9: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@14.0.0: {} + + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hono@4.8.5: {} + + hookified@1.10.0: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + is-arrayish@0.3.2: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + joycon@3.1.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + keyv@5.4.0: + dependencies: + '@keyv/serialize': 1.1.0 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + link-preview-js@3.1.0: + dependencies: + cheerio: 1.0.0-rc.11 + url: 0.11.0 + + load-tsconfig@0.2.5: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + long@4.0.0: {} + + long@5.3.2: {} + + lru-cache@10.4.3: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + ms@2.1.3: {} + + music-metadata@7.14.0: + dependencies: + '@tokenizer/token': 0.3.0 + content-type: 1.0.5 + debug: 4.4.1 + file-type: 16.5.4 + media-typer: 1.1.0 + strtok3: 6.3.0 + token-types: 4.2.1 + transitivePeerDependencies: + - supports-color + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + natural-compare@1.4.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + on-exit-leak-free@2.1.2: {} + + openapi3-ts@4.5.0: + dependencies: + yaml: 2.8.0 + + optionator@0.9.4: + 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.5 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pathe@2.0.3: {} + + peek-readable@4.1.0: {} + + pg-cloudflare@1.2.7: + optional: true + + pg-connection-string@2.9.1: {} + + pg-int8@1.0.1: {} + + pg-pool@3.10.1(pg@8.16.3): + dependencies: + pg: 8.16.3 + + pg-protocol@1.10.3: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg@8.16.3: + dependencies: + pg-connection-string: 2.9.1 + pg-pool: 3.10.1(pg@8.16.3) + pg-protocol: 1.10.3 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.2.7 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.0.0: {} + + pino@9.7.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pngjs@5.0.0: {} + + postcss-load-config@6.0.1(tsx@4.20.3)(yaml@2.8.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + tsx: 4.20.3 + yaml: 2.8.0 + + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + prelude-ls@1.2.1: {} + + process-warning@5.0.0: {} + + process@0.11.10: {} + + protobufjs@6.8.8: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.2 + '@types/node': 10.17.60 + long: 4.0.0 + + protobufjs@7.5.3: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.19.9 + long: 5.3.2 + + proxy-from-env@1.1.0: {} + + punycode@1.3.2: {} + + punycode@2.3.1: {} + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + querystring@0.2.0: {} + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readable-web-to-node-stream@3.0.4: + dependencies: + readable-stream: 4.7.0 + + readdirp@4.1.2: {} + + real-require@0.2.0: {} + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + reusify@1.1.0: {} + + rollup@4.45.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.45.1 + '@rollup/rollup-android-arm64': 4.45.1 + '@rollup/rollup-darwin-arm64': 4.45.1 + '@rollup/rollup-darwin-x64': 4.45.1 + '@rollup/rollup-freebsd-arm64': 4.45.1 + '@rollup/rollup-freebsd-x64': 4.45.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1 + '@rollup/rollup-linux-arm64-gnu': 4.45.1 + '@rollup/rollup-linux-arm64-musl': 4.45.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-musl': 4.45.1 + '@rollup/rollup-linux-s390x-gnu': 4.45.1 + '@rollup/rollup-linux-x64-gnu': 4.45.1 + '@rollup/rollup-linux-x64-musl': 4.45.1 + '@rollup/rollup-win32-arm64-msvc': 4.45.1 + '@rollup/rollup-win32-ia32-msvc': 4.45.1 + '@rollup/rollup-win32-x64-msvc': 4.45.1 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + semver@7.7.2: {} + + set-blocking@2.0.0: {} + + sharp@0.34.3: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + split2@4.2.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-json-comments@3.1.1: {} + + strtok3@6.3.0: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 4.1.0 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + token-types@4.2.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + ts-interface-checker@0.1.13: {} + + tslib@2.8.1: {} + + tsup@8.5.0(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.8) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.1 + esbuild: 0.25.8 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(tsx@4.20.3)(yaml@2.8.0) + resolve-from: 5.0.0 + rollup: 4.45.1 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsx@4.20.3: + dependencies: + esbuild: 0.25.8 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript@5.8.3: {} + + ufo@1.6.1: {} + + undici-types@6.21.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url@0.11.0: + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-module@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + ws@8.18.3: {} + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + yaml@2.8.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yocto-queue@0.1.0: {} + + zod@4.0.5: {} diff --git a/postman_collection.json b/postman_collection.json deleted file mode 100644 index c54d90d1..00000000 --- a/postman_collection.json +++ /dev/null @@ -1,3128 +0,0 @@ -{ - "info": { - "_postman_id": "df663a45-5b31-42f6-9960-a8aab090b558", - "name": "Baileys API v1.0.0-beta.0", - "description": "API documentation for [https://github.com/ookamiiixd/baileys-api](https://github.com/ookamiiixd/baileys-api)\n\nNote that all the `POST` routes expect a JSON body, so make sure to include the header", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "18988925" - }, - "item": [ - { - "name": "Sessions", - "item": [ - { - "name": "List Sessions", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/sessions", - "host": ["{{BASE_URL}}"], - "path": ["sessions"] - }, - "description": "Return list of all sessions and its status" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/sessions", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": ["sessions"] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "76" - }, - { - "key": "ETag", - "value": "W/\"4c-BziKD/6SFOaCZ9uZlY3sFIseQ0E\"" - }, - { - "key": "Date", - "value": "Mon, 20 Feb 2023 17:07:42 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "[\n {\n \"id\": \"john\",\n \"status\": \"AUTHENTICATED\"\n },\n {\n \"id\": \"john2\",\n \"status\": \"CONNECTED\"\n }\n]" - } - ] - }, - { - "name": "Find Session", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/sessions/:sessionId", - "host": ["{{BASE_URL}}"], - "path": ["sessions", ":sessionId"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Simply check if the session exists or not. If you want to check if the session has been authenticated, use the `Session Status` route instead" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/sessions/:sessionId", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": ["sessions", ":sessionId"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "27" - }, - { - "key": "ETag", - "value": "W/\"1b-z0/lHZFWOZczBvlOo3juN03ybgA\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 09:35:03 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"message\": \"Session found\"\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/sessions/:sessionId", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": ["sessions", ":sessionId"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Not Found", - "code": 404, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "29" - }, - { - "key": "ETag", - "value": "W/\"1d-SFg1yB5C4mPMRmz91HR7SP18WdM\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 08:13:09 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"Session not found\"\n}" - } - ] - }, - { - "name": "Session Status", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/sessions/:sessionId/status", - "host": ["{{BASE_URL}}"], - "path": ["sessions", ":sessionId", "status"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Determine a session status. The value is based from the websocket connection status, except that if the session has been successfully authenticated, it will return `AUTHENTHICATED`. Possible value is `AUTHENTICATED, CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING`" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/sessions/:sessionId/status", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": ["sessions", ":sessionId", "status"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "26" - }, - { - "key": "ETag", - "value": "W/\"1a-2rL+0idpkPObmbCfxXLGOUTLnRY\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 10:02:02 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"status\": \"AUTHENTICATED\"\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/sessions/:sessionId/status", - "host": ["{{BASE_URL}}"], - "path": ["sessions", ":sessionId", "status"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Not Found", - "code": 404, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "29" - }, - { - "key": "ETag", - "value": "W/\"1d-SFg1yB5C4mPMRmz91HR7SP18WdM\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 08:14:37 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"Session not found\"\n}" - } - ] - }, - { - "name": "Add Session", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"sessionId\": \"john\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/sessions/add", - "host": ["{{BASE_URL}}"], - "path": ["sessions", "add"] - }, - "description": "Create new a session. Expect an object with `sessionId` props. You can also pass additional [baileys socket options](https://github.com/adiwajshing/Baileys#configuring-the-connection) there. Keep in mind that you can only pass JSON-parsable options\n\nExample:\n\n``` json\n{\n \"sessionId\": \"john\",\n // Additional session options\n \"readIncomingMessages\": true // Automatically read all incoming messages\n // Additional Baileys socket options\n \"syncFullHistory\": true // Emulate WA desktop app to receive more messages\n // ...etc\n}\n\n```" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"sessionId\": \"john\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "http://localhost:3000/sessions/add", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": ["sessions", "add"] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "6475" - }, - { - "key": "ETag", - "value": "W/\"194b-wbqlPQCvDljDULDnnrNnHMP0sy4\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 08:18:33 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"qr\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAAEUCAYAAADqcMl5AAAAAklEQVR4AewaftIAABKZSURBVO3BQY4gx7LgQDJR978yp3ffVwEkMqqlp3Ez+4O11rrgYa21LnlYa61LHtZa65KHtda65GGttS55WGutSx7WWuuSh7XWuuRhrbUueVhrrUse1lrrkoe11rrkYa21LnlYa61LHtZa65IfPlL5myreUDmpmFSmikllqjhR+aLiRGWqeEPlpGJSmSomlaliUpkqJpWpYlKZKk5UpoqbVKaKE5WTiknlb6r44mGttS55WGutSx7WWuuSHy6ruEnli4pJ5aTipGJSOak4Ufmi4kTljYqTipOKSWWqOKl4Q+WkYlI5qZhUpoqpYlKZKm6quEnlpoe11rrkYa21LnlYa61LfvhlKm9UvKFyUjFVTCpTxYnKVPGGyhsqJxUnFScqk8obFV+ovFExqfxNKicVk8pvUnmj4jc9rLXWJQ9rrXXJw1prXfLDf0zFpPKFyonKScVU8YXKicpUMalMFScqU8WJyonKScWkclLxRcWk8oXKScWk8l/ysNZalzystdYlD2utdckP/3EVk8obFZPKVHGiMlVMKjdVTCpTxaTyhspJxaQyVZyonKhMFZPKVDFVnFRMKicVJyqTylTxX/Kw1lqXPKy11iUPa611yQ+/rOJ/icoXKicqU8WkMlVMKm9UTConFW+oTCpTxYnKVPGGylQxqUwVk8pJxYnKGxU3VfybPKy11iUPa611ycNaa13yw2Uq/yYqU8WkMlVMKlPFpDJVTCpTxaQyVUwqU8WkMlVMKlPFpHKiMlWcVEwqU8UbKlPFb6qYVKaKk4pJ5URlqjhR+Td7WGutSx7WWuuSh7XWusT+4H+YylQxqUwVJypTxaRyUvE3qZxUnKhMFW+oTBW/SWWqOFH5omJSmSrW/3lYa61LHtZa65KHtda6xP7gA5WpYlK5qeJE5aTi30xlqnhDZaqYVP5JFZPKGxV/k8obFZPKVPGGyk0Vv+lhrbUueVhrrUse1lrrkh8+qnij4kRlqphUpoqbVKaKE5WTijcq3lCZKk4q3lB5o+KmijdU3qg4qZhUpopJZap4Q+WkYlL5N3lYa61LHtZa65KHtda6xP7gIpWpYlKZKk5UpopJZao4UflNFZPKVHGiMlV8ofJGxYnKVHGiclIxqUwVk8pUMamcVEwqb1R8ofJFxaQyVUwqb1R88bDWWpc8rLXWJQ9rrXWJ/cEHKicVb6hMFW+oTBVvqEwVk8pUMalMFScqU8UXKm9UTConFZPKVDGpTBUnKicVJypvVEwqU8WJyhsV/ySVk4ovHtZa65KHtda65GGttS754ZepTBWTyonKVDGpTBVvqEwVN6lMFVPFicpU8UbFb6p4Q+Wk4ouKSeUmld+kMlVMKlPFGxW/6WGttS55WGutSx7WWusS+4NfpHJSMalMFZPKVDGpTBWTyhsVJypTxaRyUnGiclIxqbxRMamcVEwqU8WJylQxqUwVk8oXFZPKScWk8kbFGyonFZPKScWkMlXc9LDWWpc8rLXWJQ9rrXWJ/cEHKicVk8pUcaJyUjGpnFRMKl9UTCpfVJyoTBWTylRxojJVTConFScqU8XfpHJScaIyVdyk8kXFGyonFV88rLXWJQ9rrXXJw1prXWJ/8ItU3qi4SeWNiknljYpJ5aTiDZWTii9UTiomlaniROWNii9UTiq+UJkqJpWp4kTli4oTlZOKLx7WWuuSh7XWuuRhrbUu+eEylZOKN1SmihOVqeJE5Y2KNypOVE4qTiomlaliUpkq3lCZKiaVqWKqmFSmihOVqWJSmSreUJkq3lCZKiaVk4pJZar4omJSuelhrbUueVhrrUse1lrrkh8+UjmpmFSmipOKf1LFFypTxUnFpPJGxaQyVdykMlWcqJyoTBVTxRsqJxVvqNxUMamcqLxRMalMFTc9rLXWJQ9rrXXJw1prXWJ/cJHKVPGFyknFpPJGxYnKFxVvqEwVJypTxYnKVDGpTBW/SWWqOFGZKk5Upoo3VE4qJpWp4kRlqjhRmSomlZOKSWWq+OJhrbUueVhrrUse1lrrEvuDi1SmijdUpopJ5aaKm1TeqJhU3qiYVKaKL1Smir9JZap4Q2WqmFROKiaVqeINlanib1I5qfjiYa21LnlYa61LHtZa6xL7g1+kMlVMKlPFpHJScZPKScWkMlVMKl9U3KTyRsWkMlWcqLxR8YXKScUXKjdVTCpvVEwqU8Xf9LDWWpc8rLXWJQ9rrXXJDx+pnFRMKm9U3KTyhcpvqnhD5aTipGJSOal4o2JSmSr+JpWpYlKZKqaKE5Wp4qaKf7OHtda65GGttS55WGutS374qOI3qfxNFb+pYlKZVE4qTiomlanipOJEZap4o2JSeaPijYpJZVKZKiaVNyomlanijYovVN6o+OJhrbUueVhrrUse1lrrkh8+UpkqTiomlUllqphUTiq+UJkqJpWp4p9U8YbKVDGpTBVvqEwVk8pU8YbKScWkMlVMKpPKVPFFxaRyUjGpTBWTyknF3/Sw1lqXPKy11iUPa611if3BByonFW+onFScqEwVX6hMFZPKVPGbVN6o+EJlqphUpoo3VE4qJpWpYlJ5o+INlS8qJpWp4kRlqjhRmSomlanii4e11rrkYa21LnlYa61L7A8uUpkqTlROKiaVqWJSmSreUDmpmFROKiaVk4pJZaqYVKaKE5WpYlKZKt5QmSomlZOKm1SmihOVqeJE5aTiDZWTihOVk4rf9LDWWpc8rLXWJQ9rrXXJDx+pTBVfVEwqJypTxaQyVUwqU8WJylQxqXyhMlVMKl9UTCpTxaTyRsUXKlPFicoXKlPFGxVvqLxRMam8UTGpnFR88bDWWpc8rLXWJQ9rrXWJ/cEHKlPFGyonFScqb1ScqEwVk8pJxRsqU8WkMlVMKm9UnKicVEwqU8UXKlPFpHJSMam8UfFvpnJS8U96WGutSx7WWuuSh7XWuuSHv0zlDZU3KiaVE5UTlaliUnlD5Y2Kk4pJZao4UXlD5Q2VqWJSmSpOKk5Upoo3VKaKSeWkYlL5J6lMFZPKVPHFw1prXfKw1lqXPKy11iX2Bx+onFScqEwVb6hMFV+ovFExqZxUnKicVEwqU8WkMlVMKlPFGypTxYnKGxWTylQxqbxR8TepnFS8oXJScaIyVXzxsNZalzystdYlD2utdckP/3IqU8UbKl9UnKicVHxRMam8UfGFylRxovJGxaQyqUwVJxWTyhcqN1VMKicqU8VJxaTyNz2stdYlD2utdcnDWmtd8sNlFScqb1S8oTJVTConFZPKScWk8obKGxWTyqQyVXxRcVPFpPKFyknFpDKpnFRMKlPFpHKi8kbFFxUnKjc9rLXWJQ9rrXXJw1prXWJ/8ItU/qaKSWWqOFGZKiaVk4oTlTcqJpWpYlKZKk5UflPFpHJScaIyVbyhMlVMKr+pYlL5myp+08Naa13ysNZalzystdYlP3yk8kbFpDJVfKFyonJSMalMFZPKicpJxaRyUjGpvKFyUnGi8ptUpoqpYlL5QuWk4kTlpGJSOamYVE4qJpWpYlKZKm56WGutSx7WWuuSh7XWusT+4CKVk4oTlZOKSWWqmFSmikllqphUTiomlaliUrmpYlKZKiaV31QxqbxRMalMFScqU8WkclIxqfybVZyoTBWTylTxxcNaa13ysNZalzystdYlP3ykMlVMKicqJxW/qWJSOak4qfibVL6oOFGZKt6oOFF5Q2WqeKPiRGWqmFSmikllqjhRmSpOVE5UpopJ5Tc9rLXWJQ9rrXXJw1prXWJ/cJHKVHGi8kXFGypfVEwqU8VNKicVk8pUcaLyRcUbKlPFicpUMancVDGpTBWTylQxqfxNFZPKGxVfPKy11iUPa611ycNaa11if/CByhsVN6ncVDGpTBVvqLxRcaJyUvGGylTxhspU8ZtUvqiYVKaKN1ROKk5UvqiYVKaKSeWk4ouHtda65GGttS55WGutS364rGJSmVROKiaVk4pJ5QuVqWJSmSomlaliUpkqTlROKiaVNyomlZOKqeJE5aRiUjmpmFSmihOVE5Wp4guVmyomlS8qbnpYa61LHtZa65KHtda6xP7gA5Wp4kRlqnhD5aRiUpkqJpWp4guVNypOVKaKSWWqmFS+qJhUpopJ5aTiRGWqeEPlpopJZaqYVKaKSeWkYlI5qfhCZar44mGttS55WGutSx7WWuuSH/5hKjepnKhMFScqU8WkMlVMKl9UvKHyRcWkMlWcVJyonFR8UXGTyonK+j8Pa611ycNaa13ysNZal9gffKByUnGiclJxojJVnKhMFScqJxVvqJxUnKhMFV+onFScqEwVJypvVEwqU8Wk8kbFGypTxaQyVUwqU8UbKlPFpDJV/E0Pa611ycNaa13ysNZal/xwWcWk8oXKScWJylTxRsWkcqJyk8pUcaIyVUwqU8UbKicqU8VUMalMFb+p4jdVTCpvqJxUnFScqJxUfPGw1lqXPKy11iUPa611yQ8fVUwqJxWTyknFFxVvqJxUnFScqEwVb6hMFW9UnKicVLyhclIxqZxUTConFZPKVHGiclPFpDJVvKEyVbxRcdPDWmtd8rDWWpc8rLXWJT98pPKGyhsqU8Wk8kXFGyo3qfxNKlPFGypTxaRyUjGpTBWTyqQyVdyk8obKScWkcqLyRsWkMlX8TQ9rrXXJw1prXfKw1lqX/PCXVUwqU8WJylRxojJVnFScqHxRMalMFScqk8pU8YbKVDGpTBWTylQxqUwqU8WkclJxojJVvFExqUwVJyonFScqU8WkclLxhspU8cXDWmtd8rDWWpc8rLXWJfYHH6icVEwqX1R8oXJS8YbKGxWTyhsVk8obFW+onFRMKlPFpDJVvKEyVZyoTBWTyknFpHJSMalMFW+ofFExqZxUfPGw1lqXPKy11iUPa611if3BBypTxYnKVPGGyknFGypTxYnKGxVvqNxUcaLyRcWk8kbFpDJVnKicVLyh8kbFpDJVTCpvVEwqU8W/ycNaa13ysNZalzystdYl9gcfqJxUfKEyVZyovFExqXxRcaIyVZyonFRMKlPFFypvVEwqU8WkclIxqUwVk8obFW+onFRMKicVJypTxaRyUjGpnFR88bDWWpc8rLXWJQ9rrXWJ/cEHKlPFpDJVnKhMFW+ofFExqUwVk8pJxaRyUnGi8kXFicpJxYnKVDGpnFR8ofJGxRsqb1S8ofJGxYnKVDGpTBVfPKy11iUPa611ycNaa11if/CLVG6qmFSmikllqjhR+U0Vk8pJxRcqv6niROWk4kRlqnhD5aRiUpkqTlROKiaVLyomlaliUnmj4ouHtda65GGttS55WGutS+wPPlB5o2JSmSpOVKaKSeWkYlKZKiaVNyomlaniROWkYlKZKk5UpopJZap4Q+WmihOVNyomlS8qJpWp4guVqeImlanii4e11rrkYa21LnlYa61L7A8+UPmi4kTlN1VMKm9UTConFScqJxVfqPymihOVLypOVN6omFSmihOVqeJE5d+s4ouHtda65GGttS55WGutS+wP/oepnFScqNxUMalMFZPKVDGp3FQxqUwVb6hMFScqU8UbKlPFpHJS8ZtUpooTlaniDZWp4g2VqeKLh7XWuuRhrbUueVhrrUt++Ejlb6qYKiaVSeWk4guVk4pJ5Y2KN1Smii9UpooTlS9UTiomlaniROWLiknlROULlaniC5Xf9LDWWpc8rLXWJQ9rrXXJD5dV3KRyojJVvKFyk8pJxaQyqXxRcaLyRsVvUpkqJpWTikllqjipmFROVKaKE5UvKn5TxU0Pa611ycNaa13ysNZal/zwy1TeqLhJZaqYKr5QmSpOVKaKE5WTikllqnhD5YuKN1QmlaliUpkqpopJZar4omJSmSqmiknlROU3VUwqU8UXD2utdcnDWmtd8rDWWpf88P8ZlaliUpkqTiomlZOKm1ROVKaKSeWLijdUvqg4UTlRmSqmihOVLyomlaniDZVJ5aTiNz2stdYlD2utdcnDWmtd8sN/XMWJylQxqdyk8kXFFypTxd9UMalMFZPKScVUMalMFW+ovKFyUjFVnKicVEwq/6SHtda65GGttS55WGutS374ZRW/qWJSmSpOKr6omFROKk5UTlTeqJgqJpWp4kTlN6lMFX+TyknFicpUcaLyhcpU8U96WGutSx7WWuuSh7XWuuSHy1T+JpWp4r+kYlI5qXijYlKZKqaKE5WpYlI5qZhUpoovVKaKk4pJ5aTijYpJZao4UZlUpopJ5Tc9rLXWJQ9rrXXJw1prXWJ/sNZaFzystdYlD2utdcnDWmtd8rDWWpc8rLXWJQ9rrXXJw1prXfKw1lqXPKy11iUPa611ycNaa13ysNZalzystdYlD2utdcnDWmtd8v8ACXrxXBZ5duEAAAAASUVORK5CYII=\"\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"sessionId\": \"john\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "http://localhost:3000/sessions/add", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": ["sessions", "add"] - } - }, - "status": "Bad Request", - "code": 400, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "34" - }, - { - "key": "ETag", - "value": "W/\"22-nNvILmiaE5rveSF0RfEVnyXUlF4\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 09:31:38 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"Session already exists\"\n}" - } - ] - }, - { - "name": "Add Session (SSE)", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/sessions/:sessionId/add-sse", - "host": ["{{BASE_URL}}"], - "path": ["sessions", ":sessionId", "add-sse"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Create a session and listen to the connection update in realtime. For the usage example, please see [here](https://github.com/ookamiiixd/baileys-api/blob/dev/examples/sse.html)\n\nNotes:\n\n- Unlike `Add Session` route, you can't add additional options in this route\n- If you exceed the maximum QR generation attempts, the connection will be closed\n- If you try to access this route using a session id that already in use, the route will simply emit an error message and close the connection. This also mean that if you lost a connection after successfully authenticated, you lost the access to subscribe the realtime data" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/sessions/:sessionId/add-sse", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": ["sessions", ":sessionId", "add-sse"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "plain", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "text/event-stream" - }, - { - "key": "Cache-Control", - "value": "no-cache" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:27:27 GMT" - }, - { - "key": "Transfer-Encoding", - "value": "chunked" - } - ], - "cookie": [], - "body": "data: {\"qr\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAAEUCAYAAADqcMl5AAAAAklEQVR4AewaftIAABIqSURBVO3BQY4YybLgQDJR978yR0tfBZDIKKn/GzezP1hrrQse1lrrkoe11rrkYa21LnlYa61LHtZa65KHtda65GGttS55WGutSx7WWuuSh7XWuuRhrbUueVhrrUse1lrrkoe11rrkYa21LvnhI5W/qeJEZao4UZkqTlRuqphUvqh4Q+WLijdU3qg4UZkqJpWp4guVk4oTlZOKSeVvqvjiYa21LnlYa61LHtZa65IfLqu4SeWNikllqpgqTlTeqJhUpopJZap4Q2VS+aJiUpkqTlSmijcqJpWpYqqYVKaKSeWNijdUpoqbKm5SuelhrbUueVhrrUse1lrrkh9+mcobFW+onFRMKm9UnKicVJxUTConFV9UTCpvqEwVU8WkclIxqZyo/KaKSWWqmFSmiknlN6m8UfGbHtZa65KHtda65GGttS754X9MxUnFpPKGyonKFxWTyhcVk8qJylTxhspJxaQyVUwqU8UXFScqJyonKicVk8r/koe11rrkYa21LnlYa61LfvgfozJVnFRMKpPKVDGpTBWTyhsqU8Wk8obKVDGpnKi8UTGpTCpTxaRyojJVTCpTxaRyUjGpvFExqUwqU8X/koe11rrkYa21LnlYa61LfvhlFf9lKlPFicpUcVJxojJVTCpTxRcqJxVvqEwqU8WJylTxhspUMalMFScqU8WJyhsVN1X8lzystdYlD2utdcnDWmtd8sNlKv9SxaQyVbyhMlVMKlPFpDJV3KQyVUwqU8WkcqIyVZxUTCpTxRsqU8VNKlPFpDJV3KQyVZyo/Jc9rLXWJQ9rrXXJw1prXfLDRxX/S1ROVKaKLyq+qJhUbqp4Q+VEZar4omJS+UJlqphUTlSmii8q/i95WGutSx7WWuuSh7XWusT+4AOVqWJSuaniJpU3KiaVqWJSmSomlaniC5Wp4kTlpooTlZOKL1TeqDhR+U0VJyo3Vfymh7XWuuRhrbUueVhrrUvsD36RyhsVb6hMFZPKVPGGylRxovJGxaRyUnGTylQxqUwVN6lMFScqU8WJylQxqZxUnKicVHyhMlVMKicVf9PDWmtd8rDWWpc8rLXWJfYHv0hlqjhReaPiRGWqOFH5omJS+aLiC5WTijdUpooTlZOKSeWmii9UbqqYVE4qvlB5o+KLh7XWuuRhrbUueVhrrUt++EhlqpgqJpWp4qTiX6qYVN6oOFH5mypOVL5QmSomlTcqJpWp4iaVqeJEZaqYVCaVqWJSeUPlpOJE5aaHtda65GGttS55WGutS374x1SmikllqjhROVGZKm5SOamYKk5Uvqg4UTmpOFE5UTlRmSpOKk5UpopJZap4Q+WNihOVqeJEZaqYVCaVqeI3Pay11iUPa611ycNaa11if3CRylQxqUwVN6l8UTGpnFScqEwVk8pUMamcVJyonFRMKl9UvKFyUjGpfFExqUwVJypvVEwqU8WkclIxqZxUTCpTxU0Pa611ycNaa13ysNZal9gf/EUqX1T8l6hMFZPKGxUnKlPFicpNFScqU8WkclLxN6mcVPxNKlPFpHJSMalMFZPKVPHFw1prXfKw1lqXPKy11iX2BxepnFRMKicVk8obFZPKGxWTylTxhsobFV+oTBUnKv8lFV+onFScqEwVk8pUcaIyVZyovFFxonJS8cXDWmtd8rDWWpc8rLXWJfYHF6lMFZPKVHGi8kbFFypfVEwqU8Wk8kbFFyonFZPKVDGpnFScqEwVJypTxaQyVfwmlaliUpkqTlSmii9UpopJZar44mGttS55WGutSx7WWuuSHz5SeaPiRGWqmFSmiknlpGJSOamYVKaKmyq+UPlCZaq4SeVEZaqYKt5QOal4Q+VEZar4QmWqmFROKiaVqeKmh7XWuuRhrbUueVhrrUvsD36RylQxqbxR8ZtU3qiYVKaKm1SmijdUTipOVKaKSeWkYlKZKiaVk4oTlaniROWNijdUpopJZap4Q+WkYlKZKr54WGutSx7WWuuSh7XWuuSHy1TeqPhC5aRiUjmpmFS+UHmjYlKZKiaVk4qp4g2VNypOVKaKSWWqOFGZKqaKE5WpYlL5QuVEZao4UTmpOFH5TQ9rrXXJw1prXfKw1lqX/PCXqUwVk8pJxUnFScWk8psqJpWpYlKZKk4q3lA5qZgqbqqYVKaKE5WpYlI5qZgq3qiYVN6omFROVE4qJpWpYqr4TQ9rrXXJw1prXfKw1lqX2B/8QypTxW9SeaNiUpkqJpWp4guVk4pJZap4Q2WqmFROKr5QmSomlaliUnmj4g2VqWJSmSq+UPmi4m96WGutSx7WWuuSh7XWusT+4C9SOamYVKaKSeWk4kRlqjhR+U0Vk8pJxYnKVPEvqUwVJypfVEwqJxWTyknFicobFScqU8UbKicVXzystdYlD2utdcnDWmtdYn/wgcpU8YbKScWkclJxovJGxYnKScVNKm9UTCpTxaQyVUwqb1ScqEwVJyonFZPKFxWTylTxhspUMamcVPyXPay11iUPa611ycNaa13ywy9TeaNiUvlCZao4UTlRmSomlUllqviXKk4qJpWTijdUTlSmipOKSeWNii9UpopJ5UTlDZWpYlI5qZhUpoovHtZa65KHtda65GGttS6xP/hA5YuKm1SmihOVqWJS+aLiN6lMFScqU8WkclJxojJV/EsqU8WkclIxqbxR8YbKGxWTyknFb3pYa61LHtZa65KHtda6xP7gA5WpYlI5qThRualiUpkqTlSmikllqnhD5YuKSeWNiknljYovVKaKE5WbKt5QualiUpkq3lB5o+KLh7XWuuRhrbUueVhrrUt++KhiUvlCZao4UTmpmFSmikllqjhRmSomlTcqJpWpYlI5qZhUpopJ5aRiUrmp4ouKSeUmlTcqJpUvVE4qpopJZaq46WGttS55WGutSx7WWusS+4MPVKaKSeVfqphUbqqYVN6oeENlqphUpooTld9UcaLyRsWJyhsVk8pNFScqv6niRGWq+OJhrbUueVhrrUse1lrrkh8+qphUpopJ5aTiDZU3Km5SeaPiRGWqOFGZKr6oeENlqjhReaNiUjmpmFSmipOKL1S+qHhDZaqYVE4qbnpYa61LHtZa65KHtda65IePVH6TylRxUvE3VXyh8kbFpHKi8oXKVHGi8kbFicpJxaQyVXyhMlVMKlPFicobKlPFTSpTxRcPa611ycNaa13ysNZal/xwWcWkMlVMKicVb6icVEwqJxWTylQxqUwVk8pNFb+p4o2KSeWmiknlRGWqmFR+k8oXFV9UnKjc9LDWWpc8rLXWJQ9rrXXJD/8xKl9UTCqTyhcVb6hMFZPKVPGFylQxqZyo/KaKSeWkYlKZKt5QmSreUHmjYlI5UflCZao4qbjpYa21LnlYa61LHtZa65IfPqq4qeJfqjhRmSqmihOVE5V/qWJS+aLiN6lMFZPKicpJxUnFpDJVvFHxN6lMFV88rLXWJQ9rrXXJw1prXfLDRypTxVRxUjGpvFFxk8pU8YbKVDFVTCpvVJyovFExqbxRMamcVEwVb1ScqEwVX6h8ofKGyhcVJyq/6WGttS55WGutSx7WWuuSHz6qmFSmii8q3lA5qfii4g2VqWKqmFRuUnmj4kTlJpWTikllqvi/pOILlanii4qbHtZa65KHtda65GGttS6xP/hFKlPFpHJTxaRyUjGpTBWTym+qmFSmihOVqeINlS8qJpWTii9UTiomlS8qJpUvKv4llanii4e11rrkYa21LnlYa61LfvhI5TdVnKhMKlPF31RxovJGxaRyUnGi8kbFGypTxRsqU8Wk8obKVDGpTBUnKm9UvKHyRsWkMlVMKr/pYa21LnlYa61LHtZa6xL7g4tU3qg4UZkqJpWpYlKZKm5SeaPiJpUvKr5QmSomlZOKE5WpYlK5qeJE5Y2KSeVvqphUpoqbHtZa65KHtda65GGttS754SOVqeILlaniN6lMFScqU8Wk8oXKVPFGxaQyVUwqU8WJylQxqZxUnKi8UfGGyonKVDFVnKhMKlPFicpJxRcVk8pU8cXDWmtd8rDWWpc8rLXWJfYHH6i8UTGpTBWTylRxovJFxU0qX1ScqHxRMan8SxWTylTxhspUcZPKVDGp3FRxonJSMalMFV88rLXWJQ9rrXXJw1prXWJ/8IHKGxU3qUwVk8oXFZPKScWk8kbFicpU8YbKFxVfqLxRcaLyRcUbKm9UTCpTxaTyRsWk8kXFFw9rrXXJw1prXfKw1lqX/HBZxaQyqZxUTCpTxYnKVHGiMlWcVLxRMalMFW9UnKhMFW9UnKi8UfFGxaRyUvGGyonKb6qYVN6oOKmYVP6mh7XWuuRhrbUueVhrrUt++McqTiomlS9UpooTlaniDZU3VKaKSWWqmCreqJhUpoqp4g2VqeJE5aRiUjmpmCpOKiaVk4ovKiaVqWJSmSpOKk5UbnpYa61LHtZa65KHtda65IePKt6omFSmikllqphUpoqTiknlDZU3KiaVSWWqmFTeUJkqvlA5qZhUTlROKiaVSWWqeENlqphU3lCZKk5Upoqp4guVk4rf9LDWWpc8rLXWJQ9rrXXJD7+sYlJ5o+ImlaniROWk4jdVTCqTylQxqZyoTBWTylRxUjGpnFRMKicVJypTxVRxUjGpTBWTyqQyVUwVJypTxf8lD2utdcnDWmtd8rDWWpf88JHKVHFS8YbK36TyhcpJxRsqJxWTylTxm1ROKiaVSWWqOFGZKqaKSWWqmFROKk4qJpVJZaqYVE5U3qg4UflND2utdcnDWmtd8rDWWpf8cJnKScUbFScqJyo3VZxUTCqTyknFVDGpnFRMKlPFpPKGylQxqbxRcaIyVUwqb6jcpHJS8UbFpHJTxW96WGutSx7WWuuSh7XWusT+4AOVk4pJ5TdV/CaVNyomlaliUpkqTlROKr5QmSomlTcqJpWpYlKZKt5QOamYVKaKSeU3VZyovFFxojJVfPGw1lqXPKy11iUPa611yQ8fVUwqJxW/SeWk4kRlqpgqTlQmlaniDZWbVH5TxYnKicpUcaLyhcpU8UXFGyqTyknFGyp/08Naa13ysNZalzystdYlP1xWMan8TRWTyqQyVZyoTBU3qUwVX6i8UXGiMqlMFZPKVHFS8YbKVHGiMlVMKpPKVDFVnKicVNyk8l/ysNZalzystdYlD2utdckPH6m8UTGpTBW/qWJSeUNlqpgqTlSmiknlpGJSmSreUHmj4r9E5Q2VqWJSuanijYo3Kr5QuelhrbUueVhrrUse1lrrEvuDD1S+qDhROal4Q+WNikllqphUvqiYVE4qJpWp4kTlpoo3VE4qvlA5qThRmSomlaniROW/pOKmh7XWuuRhrbUueVhrrUvsD/4PU5kq3lCZKt5QmSpOVKaKE5W/qeINlaniROWk4guVk4rfpDJVTConFW+oTBUnKlPFTQ9rrXXJw1prXfKw1lqX/PCRyt9UMVVMKl+onFR8UXGiMlVMKicVb6icqEwVX1RMKpPKFxUnKlPFpHJSMamcqEwVk8qJylRxonJSMalMFV88rLXWJQ9rrXXJw1prXfLDZRU3qZyoTBVvqJxUTCpTxRcqJypTxaQyqUwVX1TcpPJFxYnKFxUnKicVN1V8UfE3Pay11iUPa611ycNaa13ywy9TeaPiN6lMFZPKScWkclIxqfxLKicqX6icVEwqJxWTylRxUvGFyhcqb6h8UTGpTBVTxU0Pa611ycNaa13ysNZal/zwP0blDZWbKiaVNyomlUnlpGJS+U0Vb6h8UfGGyknFScUbKlPFpDJVTConFZPKFypTxRcPa611ycNaa13ysNZal/zw/5mKSWWqmFROKiaVk4pJZVK5qeILlaniRGWqmComlROVk4qpYlKZKk5UTipOKk4q3qiYVKaK/5KHtda65GGttS55WGutS374ZRW/qeJE5aRiUpkqTlSmihOVk4o3VCaVqeJE5QuVqeJEZaqYVG6qeKNiUplUpopJZaqYVN5Q+aLib3pYa61LHtZa65KHtda6xP7gA5W/qWJSOak4UXmjYlI5qZhUflPFFypTxaQyVZyovFExqUwVJypTxaQyVUwqU8WkclJxk8pU8YXKScUXD2utdcnDWmtd8rDWWpfYH6y11gUPa611ycNaa13ysNZalzystdYlD2utdcnDWmtd8rDWWpc8rLXWJQ9rrXXJw1prXfKw1lqXPKy11iUPa611ycNaa13ysNZal/w/1ZV2j2OtGMUAAAAASUVORK5CYII=\"}" - } - ] - }, - { - "name": "Delete Session", - "request": { - "method": "DELETE", - "header": [], - "url": { - "raw": "{{BASE_URL}}/sessions/:sessionId", - "host": ["{{BASE_URL}}"], - "path": ["sessions", ":sessionId"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Delete a session" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "DELETE", - "header": [], - "url": { - "raw": "http://localhost:3000/sessions/:sessionId", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": ["sessions", ":sessionId"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "29" - }, - { - "key": "ETag", - "value": "W/\"1d-ILxigtiSa6WDHWPzEHKKbgV7iDQ\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 12:13:53 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"message\": \"Session deleted\"\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "DELETE", - "header": [], - "url": { - "raw": "{{BASE_URL}}/sessions/:sessionId", - "host": ["{{BASE_URL}}"], - "path": ["sessions", ":sessionId"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Not Found", - "code": 404, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "29" - }, - { - "key": "ETag", - "value": "W/\"1d-SFg1yB5C4mPMRmz91HR7SP18WdM\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 08:18:08 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"Session not found\"\n}" - } - ] - } - ] - }, - { - "name": "Chats", - "item": [ - { - "name": "Chat List", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/chats", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "chats"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Get list of chats" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/chats", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "chats"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "8081" - }, - { - "key": "ETag", - "value": "W/\"1f91-zrmZzjUJ24Wi50rIH4/QJp1uUAY\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 11:47:06 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"data\": [\n {\n \"pkId\": 268,\n \"sessionId\": \"john\",\n \"conversationTimestamp\": \"1670751010\",\n \"id\": \"628231xxxxx@s.whatsapp.net\",\n \"unreadCount\": 1\n },\n {\n \"pkId\": 270,\n \"sessionId\": \"john\",\n \"id\": \"628121xxxxx@s.whatsapp.net\",\n \"messages\": [\n {\n \"message\": {\n \"key\": {\n \"id\": \"496547XXXXXXXXXXXXXX\",\n \"fromMe\": true,\n \"remoteJid\": \"628121xxxxx@s.whatsapp.net\"\n },\n \"messageStubType\": \"E2E_ENCRYPTED\",\n \"messageTimestamp\": \"1670745789\"\n }\n }\n ],\n \"participant\": []\n },\n ...\n ],\n \"cursor\": 294\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/chats", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "chats"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "45" - }, - { - "key": "ETag", - "value": "W/\"2d-NELHGnJkSmArgNUV9e6szPSxHrw\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 10:48:09 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during chat list\"\n}" - } - ] - }, - { - "name": "Load Conversation", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/chats/:jid", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "chats", ":jid"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "62813xxxxx@s.whatsapp.net", - "description": "Chat jid" - } - ] - }, - "description": "Load a conversation with someone or a group" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/chats/:jid", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "chats", ":jid"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "62813xxxxx@s.whatsapp.net", - "description": "Chat jid" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "14973" - }, - { - "key": "ETag", - "value": "W/\"3a7d-4+d0S7xZ+Nb5CDSbAQo2ye6mcPE\"" - }, - { - "key": "Date", - "value": "Thu, 05 Jan 2023 04:07:24 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"data\": [\n {\n \"pkId\": 343,\n \"sessionId\": \"john\",\n \"remoteJid\": \"628132xxxxx@s.whatsapp.net\",\n \"id\": \"B61CE995AXXXXXXXXXXXXXX\",\n \"ephemeralOutOfSync\": false,\n \"key\": {\n \"id\": \"B61CE995AXXXXXXXXXXXXXXX\",\n \"fromMe\": false,\n \"remoteJid\": \"628132xxxxx@s.whatsapp.net\"\n },\n \"labels\": [],\n \"message\": {\n \"conversation\": \"Isn't looks good?\"\n },\n \"messageStubParameters\": [],\n \"messageTimestamp\": \"1669206859\",\n \"pollUpdates\": [],\n \"reactions\": [],\n \"userReceipt\": []\n },\n {\n \"pkId\": 466,\n \"sessionId\": \"john\",\n \"remoteJid\": \"628132xxxxx@s.whatsapp.net\",\n \"id\": \"5EB77606567BB6XXXXXXXXXXX\",\n \"ephemeralOutOfSync\": false,\n \"key\": {\n \"id\": \"5EB77606567BB6XXXXXXXXXXX\",\n \"fromMe\": false,\n \"remoteJid\": \"628132xxxxx@s.whatsapp.net\"\n },\n \"labels\": [],\n \"message\": {\n \"conversation\": \"Awesome!\"\n },\n \"messageStubParameters\": [],\n \"messageTimestamp\": \"1669205548\",\n \"pollUpdates\": [],\n \"reactions\": [],\n \"userReceipt\": []\n },\n ...\n ],\n \"cursor\": 489\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/chats/:jid", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "chats", ":jid"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "62813xxxxx@s.whatsapp.net", - "description": "Chat jid" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "45" - }, - { - "key": "ETag", - "value": "W/\"2d-NELHGnJkSmArgNUV9e6szPSxHrw\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 10:48:09 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during chat find\"\n}" - } - ] - } - ] - }, - { - "name": "Contacts", - "item": [ - { - "name": "Contact List", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Get list of contacts" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/contacts", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "contacts"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "1676" - }, - { - "key": "ETag", - "value": "W/\"68c-sevpQPy0ZDLpGm1wr8iRTiNo3o4\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:50:15 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"data\": [\n {\n \"pkId\": 467,\n \"sessionId\": \"john\",\n \"id\": \"628138xxxxx@s.whatsapp.net\",\n \"name\": \"Bob William\",\n \"notify\": null,\n \"verifiedName\": null,\n \"imgUrl\": null,\n \"status\": null\n },\n ...\n ],\n \"cursor\": 493\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "45" - }, - { - "key": "ETag", - "value": "W/\"2d-NELHGnJkSmArgNUV9e6szPSxHrw\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 10:48:09 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during chat list\"\n}" - } - ] - }, - { - "name": "Check Number", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts/:jid", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts", ":jid"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628138xxxxx@s.whatsapp.net", - "description": "Number jid" - } - ] - }, - "description": "Check if number exists on WhatsApp or not" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/contacts/:jid", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "contacts", ":jid"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628138xxxxx@s.whatsapp.net", - "description": "Number jid" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "15" - }, - { - "key": "ETag", - "value": "W/\"f-lWSD52foMX4qLT82tweJE091S9Q\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:53:34 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"exists\": true\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts/:jid", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts", ":jid"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628138xxxxx@s.whatsapp.net", - "description": "Number jid" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "45" - }, - { - "key": "ETag", - "value": "W/\"2d-yQtTZSgB5CH3vcY7RJljHmEWYjk\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:54:15 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during jid check\"\n}" - } - ] - }, - { - "name": "Profile Picture", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts/:jid/photo", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts", ":jid", "photo"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628138xxxxx@s.whatsapp.net", - "description": "Number jid" - } - ] - }, - "description": "Get someone's profile picture" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/contacts/:jid/photo", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "contacts", ":jid", "photo"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628138xxxxx@s.whatsapp.net", - "description": "Number jid" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "176" - }, - { - "key": "ETag", - "value": "W/\"b0-bQBN29wReWTYvevkkCAxBHytQ8w\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:56:58 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"url\": \"https://pps.whatsapp.net/v/t61.xxxx-2x/xxxxx4973_1xxxx97530430_228xxxxxx555_n.jpg?ccb=11-4&oh=01_AdT0SebmPzpFyNKCvvPw0rYSmhIbVlkVcYQ-FJ0VohYNiw&oe=63C534EE\"\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts/:jid/photo", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts", ":jid", "photo"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628138xxxxx@s.whatsapp.net", - "description": "Number jid" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "47" - }, - { - "key": "ETag", - "value": "W/\"2f-k2MDpOqngNXXgbQSBm4xw7+N0a4\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:57:45 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during photo fetch\"\n}" - } - ] - }, - { - "name": "Blocked Number List", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts/blocklist", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts", "blocklist"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Get list of blocked numbers" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/contacts/blocklist", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "contacts", "blocklist"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "63" - }, - { - "key": "ETag", - "value": "W/\"3f-SDcFKUGiPldqMqNVIw8IaUV5jZA\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:01:25 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "[\n \"628122xxxxx@s.whatsapp.net\",\n \"628199xxxxx@s.whatsapp.net\"\n]" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts/blocklist", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts", "blocklist"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "47" - }, - { - "key": "ETag", - "value": "W/\"2f-k2MDpOqngNXXgbQSBm4xw7+N0a4\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:57:45 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during blocklist fetch\"\n}" - } - ] - }, - { - "name": "Block / Unblock Number", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"jid\": \"628122xxxxx@s.whatsapp.net\",\r\n \"action\": \"block\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts/blocklist/update", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts", "blocklist", "update"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Block / unblock number. Expect the below JSON object shape:\n\n``` json\n{\n \"jid\": \"62xxxxx@s.whatsapp.net\", // The target number jid\n \"action\": \"block\" // The action, can be either \"block\" or \"unblock\"\n}\n```" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"jid\": \"628122xxxxx@s.whatsapp.net\",\r\n \"action\": \"block\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "http://localhost:3000/:sessionId/contacts/blocklist/update", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "contacts", "blocklist", "update"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "31" - }, - { - "key": "ETag", - "value": "W/\"1f-rwg7CjZZTkTi13guWwUuOdH04is\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:06:44 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"message\": \"Contact blocked\"\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"jid\": \"628122xxxxx@s.whatsapp.net\",\r\n \"action\": \"block\"\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/:sessionId/contacts/blocklist/update", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "contacts", "blocklist", "update"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "31" - }, - { - "key": "ETag", - "value": "W/\"1f-rwg7CjZZTkTi13guWwUuOdH04is\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:06:44 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during blocklist update\"\n}" - } - ] - } - ] - }, - { - "name": "Groups", - "item": [ - { - "name": "Group List", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/groups", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "groups"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Get list of groups" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/groups", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "groups"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "175" - }, - { - "key": "ETag", - "value": "W/\"af-m4MZKLonIfvSvDMexvCNrV3p1Ds\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:30:42 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"data\": [\n {\n \"pkId\": 609,\n \"sessionId\": \"john\",\n \"id\": \"628950xxxxx-1631xxxx@g.us\",\n \"name\": \"The Raven\",\n \"notify\": null,\n \"verifiedName\": null,\n \"imgUrl\": null,\n \"status\": null\n },\n ...\n ],\n \"cursor\": 634\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/groups", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "groups"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "45" - }, - { - "key": "ETag", - "value": "W/\"2d-NELHGnJkSmArgNUV9e6szPSxHrw\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 10:48:09 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during group list\"\n}" - } - ] - }, - { - "name": "Group Metadata", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/groups/:jid", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "groups", ":jid"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628950xxxxx-1631xxxxx@g.us", - "description": "Group jid" - } - ] - }, - "description": "Get group metadata" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/groups/:jid", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "groups", ":jid"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628950xxxxx-1631xxxxx@g.us", - "description": "Group jid" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "465" - }, - { - "key": "ETag", - "value": "W/\"1d1-LWhmW4VM2/FA409+GSYnSeYQYso\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:36:35 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"id\": \"628950xxxxx-1631xxxxx@g.us\",\n \"subject\": \"The Raven\",\n \"subjectOwner\": \"628950xxxxx@s.whatsapp.net\",\n \"subjectTime\": 1631090896,\n \"size\": 4,\n \"creation\": 1631090896,\n \"owner\": \"628950xxxxx@s.whatsapp.net\",\n \"restrict\": false,\n \"announce\": false,\n \"participants\": [\n {\n \"id\": \"628132xxxxx@s.whatsapp.net\",\n \"admin\": null\n },\n {\n \"id\": \"628950xxxxx@s.whatsapp.net\",\n \"admin\": \"superadmin\"\n }\n ]\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/groups/:jid", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "groups", ":jid"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628950xxxxx-1631xxxxx@g.us", - "description": "Group jid" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "45" - }, - { - "key": "ETag", - "value": "W/\"2d-NELHGnJkSmArgNUV9e6szPSxHrw\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 10:48:09 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during group metadata fetch\"\n}" - } - ] - }, - { - "name": "Profile Picture", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/groups/:jid/photo", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "groups", ":jid", "photo"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628950xxxxx-1631xxxxx@g.us", - "description": "Group jid" - } - ] - }, - "description": "Get group's profile picture" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/groups/:jid/photo", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "groups", ":jid", "photo"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628950xxxxx-1631xxxxx@g.us", - "description": "Group jid" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "176" - }, - { - "key": "ETag", - "value": "W/\"b0-LqeipByKETY9sPcRFBhxO8EjNqU\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 14:43:14 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"url\": \"https://pps.whatsapp.net/v/t61.2xxxx-2x/3xxxx8882_648xxxxxxx963_460xxxxxxx50_n.jpg?ccb=11-4&oh=01_AdRPjAc_RsvEnqNXP-_kQ-JAbe1b8PTaJMCMXvyeLewouw&oe=63C542AE\"\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/groups/:jid/photo", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "groups", ":jid", "photo"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - }, - { - "key": "jid", - "value": "628950xxxxx-1631xxxxx@g.us", - "description": "Group jid" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "45" - }, - { - "key": "ETag", - "value": "W/\"2d-NELHGnJkSmArgNUV9e6szPSxHrw\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 10:48:09 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during photo fetch\"\n}" - } - ] - } - ] - }, - { - "name": "Messages", - "item": [ - { - "name": "Message List", - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/messages", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "messages"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Get list of messages. Note that this route returns all messages from the store without filtering the jid. You may want to use the `Chats Load Conversation` route if you only want load messages with specific person or group" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "http://localhost:3000/:sessionId/messages", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "messages"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "14459" - }, - { - "key": "ETag", - "value": "W/\"387b-5TaGieZbj9/7YkdllELdvzMgf0g\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:12:49 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"data\": [\n {\n \"pkId\": 1458,\n \"sessionId\": \"john\",\n \"remoteJid\": \"628132xxxxx@s.whatsapp.net\",\n \"id\": \"BF7DB5EE494FXXXXXXXXXXXXXXXX\",\n \"key\": {\n \"id\": \"BF7DB5EE494FXXXXXXXXXXXXXXXX\",\n \"fromMe\": true,\n \"remoteJid\": \"6281320761832@s.whatsapp.net\"\n },\n \"message\": {\n \"protocolMessage\": {\n \"type\": \"INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC\",\n \"initialSecurityNotificationSettingSync\": {\n \"securityNotificationEnabled\": false\n }\n }\n },\n \"messageTimestamp\": \"1673015208\",\n \"pushName\": \"Nothing\",\n \"status\": 2\n },\n ...\n ],\n \"cursor\": 1482\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "GET", - "header": [], - "url": { - "raw": "{{BASE_URL}}/:sessionId/messages", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "messages"], - "query": [ - { - "key": "limit", - "value": "25", - "description": "Limit data length per request (Optional, default to 25)", - "disabled": true - }, - { - "key": "cursor", - "value": "25", - "description": "Cursor for the next page (Optional)", - "disabled": true - } - ], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "45" - }, - { - "key": "ETag", - "value": "W/\"2d-NELHGnJkSmArgNUV9e6szPSxHrw\"" - }, - { - "key": "Date", - "value": "Sun, 11 Dec 2022 10:48:09 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during message list\"\n}" - } - ] - }, - { - "name": "Send Message", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"jid\": \"628950xxxxx-1631xxxx@g.us\",\r\n \"type\": \"group\",\r\n \"message\": {\r\n \"text\": \"What's that @62823xxxx?\",\r\n \"mentions\": [\"62823xxxx@s.whatsapp.net\"]\r\n }\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/:sessionId/messages/send", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "messages", "send"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Send a message to someone or group. Expect the below JSON object shape:\n\n``` json\n{\n \"jid\": \"62xxxx@s.whatsapp.net\", // Target jid\n \"type\": \"number\", // Use \"number\" for number jid, or \"group\" for group jid\n \"message\": {\n \"text\": \"Hello!\"\n }, // `AnyMessageContent`\n \"options\": {} // Optional `MiscMessageGenerationOptions`, eg: to quote message, etc\n}\n\n```\n\nPlease see [this section](https://github.com/adiwajshing/Baileys#sending-messages) to learn how to send any kind of message in baileys" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"jid\": \"628950xxxxx-1631xxxx@g.us\",\r\n \"type\": \"group\",\r\n \"message\": {\r\n \"text\": \"What's that @62823xxxx?\",\r\n \"mentions\": [\"62823xxxx@s.whatsapp.net\"]\r\n }\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "http://localhost:3000/:sessionId/messages/send", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "messages", "send"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "327" - }, - { - "key": "ETag", - "value": "W/\"147-uzjVxFQmRFBfTvxqegxOJwD/Mao\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:27:17 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"key\": {\n \"remoteJid\": \"628950xxxxx-1631xxxx@g.us\",\n \"fromMe\": true,\n \"id\": \"BAE58AXXXXXXXX\"\n },\n \"message\": {\n \"extendedTextMessage\": {\n \"text\": \"What's that @62823xxxxx?\",\n \"contextInfo\": {\n \"mentionedJid\": [\n \"62823xxxxx@s.whatsapp.net\"\n ]\n }\n }\n },\n \"messageTimestamp\": \"1673018835\",\n \"status\": \"PENDING\",\n \"participant\": \"628132xxxxx:78@s.whatsapp.net\"\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"jid\": \"628950xxxxx-1631xxxx@g.us\",\r\n \"type\": \"group\",\r\n \"message\": {\r\n \"text\": \"What's that @62823xxxx?\",\r\n \"mentions\": [\"62823xxxx@s.whatsapp.net\"]\r\n }\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/:sessionId/messages/send", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "messages", "send"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "327" - }, - { - "key": "ETag", - "value": "W/\"147-uzjVxFQmRFBfTvxqegxOJwD/Mao\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:27:17 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during message send\"\n}" - } - ] - }, - { - "name": "Send Bulk Message", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "[\r\n {\r\n \"jid\": \"62895xxxxx-1631xxxxx@g.us\",\r\n \"type\": \"group\",\r\n \"message\": {\r\n \"text\": \"Okay then!\"\r\n }\r\n },\r\n {\r\n \"jid\": \"628231xxxxx@s.whatsapp.net\",\r\n \"type\": \"number\",\r\n \"delay\": 5000,\r\n \"message\": {\r\n \"text\": \"Hello!\"\r\n }\r\n }\r\n]", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/:sessionId/messages/send/bulk", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "messages", "send", "bulk"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Send a multiple messages. Accept an array of JSON object that has the same shape as the `Send Message` route. But it also accept an additional `delay` properties to add a delay for the specific message to send (in `milliseconds`), default to `1000`. Keep in mind that it won't be used for the message in first position" - }, - "response": [ - { - "name": "Response Success", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "[\r\n {\r\n \"jid\": \"62895xxxxx-1631xxxxx@g.us\",\r\n \"type\": \"group\",\r\n \"message\": {\r\n \"text\": \"Okay then!\"\r\n }\r\n },\r\n {\r\n \"jid\": \"628231xxxxx@s.whatsapp.net\",\r\n \"type\": \"number\",\r\n \"delay\": 5000,\r\n \"message\": {\r\n \"text\": \"Hello!\"\r\n }\r\n }\r\n]", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "http://localhost:3000/:sessionId/messages/send/bulk", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "messages", "send", "bulk"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "511" - }, - { - "key": "ETag", - "value": "W/\"1ff-UenwtSTBf9lIrco534dkKJ/ay1E\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:43:12 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"results\": [\n {\n \"index\": 0,\n \"result\": {\n \"key\": {\n \"remoteJid\": \"62895xxxxx-1631xxxxx@g.us\",\n \"fromMe\": true,\n \"id\": \"BAE5DAXXXXXXX\"\n },\n \"message\": {\n \"extendedTextMessage\": {\n \"text\": \"Okay then!\"\n }\n },\n \"messageTimestamp\": \"1673019785\",\n \"status\": \"PENDING\",\n \"participant\": \"628132xxxxx:78@s.whatsapp.net\"\n }\n },\n {\n \"index\": 1,\n \"result\": {\n \"key\": {\n \"remoteJid\": \"628231xxxxx@s.whatsapp.net\",\n \"fromMe\": true,\n \"id\": \"BAE51CFXXXXXX\"\n },\n \"message\": {\n \"extendedTextMessage\": {\n \"text\": \"Hello!\"\n }\n },\n \"messageTimestamp\": \"1673019792\",\n \"status\": \"PENDING\"\n }\n }\n ],\n \"errors\": []\n}" - }, - { - "name": "Partial Success", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "[\r\n {\r\n \"jid\": \"62895xxxxx-1631xxxxx@g.us\",\r\n \"type\": \"group\",\r\n \"message\": {\r\n \"text\": \"Okay then!\"\r\n }\r\n },\r\n {\r\n \"jid\": \"628231xxxxx@s.whatsapp.net\",\r\n \"type\": \"number\",\r\n \"delay\": 5000,\r\n \"message\": {\r\n \"text\": \"Hello!\"\r\n }\r\n }\r\n]", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/:sessionId/messages/send/bulk", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "messages", "send", "bulk"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "OK", - "code": 200, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "511" - }, - { - "key": "ETag", - "value": "W/\"1ff-UenwtSTBf9lIrco534dkKJ/ay1E\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:43:12 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"results\": [\n {\n \"index\": 0,\n \"result\": {\n \"key\": {\n \"remoteJid\": \"62895xxxxx-1631xxxxx@g.us\",\n \"fromMe\": true,\n \"id\": \"BAE5DAXXXXXXX\"\n },\n \"message\": {\n \"extendedTextMessage\": {\n \"text\": \"Okay then!\"\n }\n },\n \"messageTimestamp\": \"1673019785\",\n \"status\": \"PENDING\",\n \"participant\": \"628132xxxxx:78@s.whatsapp.net\"\n }\n }\n ],\n \"errors\": [\n {\n \"index\": 1,\n \"error\": \"An error occured during message send\"\n }\n ]\n}" - }, - { - "name": "Response Failed", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "[\r\n {\r\n \"jid\": \"62895xxxxx-1631xxxxx@g.us\",\r\n \"type\": \"group\",\r\n \"message\": {\r\n \"text\": \"Okay then!\"\r\n }\r\n },\r\n {\r\n \"jid\": \"628231xxxxx@s.whatsapp.net\",\r\n \"type\": \"number\",\r\n \"delay\": 5000,\r\n \"message\": {\r\n \"text\": \"Hello!\"\r\n }\r\n }\r\n]", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/:sessionId/messages/send/bulk", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "messages", "send", "bulk"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "126" - }, - { - "key": "ETag", - "value": "W/\"7e-vwijcK5514jDJ9ozSQ9hfiFT+Jc\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:41:18 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"results\": [],\n \"errors\": [\n {\n \"index\": 0,\n \"error\": \"An error occured during message send\"\n },\n {\n \"index\": 1,\n \"error\": \"An error occured during message send\"\n }\n ]\n}" - } - ] - }, - { - "name": "Download Message Media", - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"id\": \"FA85D84D835A5XXXXXXXXXXXX\",\r\n \"ephemeralOutOfSync\": false,\r\n \"key\": {\r\n \"id\": \"FA85D84D835A5XXXXXXXXXXXX\",\r\n \"fromMe\": false,\r\n \"remoteJid\": \"62823xxxxx@s.whatsapp.net\"\r\n },\r\n \"labels\": [],\r\n \"mediaData\": {\r\n \"localPath\": \"Media/WhatsApp Images/IMG-20230205-WA0000.jpg\"\r\n },\r\n \"message\": {\r\n \"imageMessage\": {\r\n \"url\": \"https://mmg.whatsapp.net/v/t62.7118-24/xxxxxxxxxxxxxx.enc?ccb=11-4&oh=xxxxxxxx&oe=xxxxx&mms3=true\",\r\n \"width\": 738,\r\n \"height\": 1600,\r\n \"mediaKey\": \"xxxxxxxx/xxxxxxx+xxxxxxxxxx=\",\r\n \"mimetype\": \"image/jpeg\",\r\n \"directPath\": \"/v/t62.7118-24/xxxxxxxxxxxx.enc?ccb=11-4&oh=xxxxxxx&oe=xxxx\",\r\n \"fileLength\": \"148979\",\r\n \"fileSha256\": \"xxxxxxxxx+xxxxxxxxxx=\",\r\n \"scanLengths\": [11804, 74479, 27132, 35564],\r\n \"scansSidecar\": \"xxxxxxxxxxxxx+xxx==\",\r\n \"fileEncSha256\": \"xxxxxxxxx+0k=\",\r\n \"mediaKeyTimestamp\": \"1675586197\",\r\n \"midQualityFileSha256\": \"xxxxxxxxxx/xxxxxxxxxx+xxxxxxx=\"\r\n }\r\n },\r\n \"messageStubParameters\": [],\r\n \"messageTimestamp\": \"1675586199\",\r\n \"pollUpdates\": [],\r\n \"reactions\": [],\r\n \"userReceipt\": []\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BASE_URL}}/:sessionId/messages/download", - "host": ["{{BASE_URL}}"], - "path": [":sessionId", "messages", "download"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - }, - "description": "Download media from a message. Return the media with its associated content type on success" - }, - "response": [ - { - "name": "Response Failed", - "originalRequest": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\r\n \"id\": \"FA85D84D835A5XXXXXXXXXXXX\",\r\n \"ephemeralOutOfSync\": false,\r\n \"key\": {\r\n \"id\": \"FA85D84D835A5XXXXXXXXXXXX\",\r\n \"fromMe\": false,\r\n \"remoteJid\": \"62823xxxxx@s.whatsapp.net\"\r\n },\r\n \"labels\": [],\r\n \"mediaData\": {\r\n \"localPath\": \"Media/WhatsApp Images/IMG-20230205-WA0000.jpg\"\r\n },\r\n \"message\": {\r\n \"imageMessage\": {\r\n \"url\": \"https://mmg.whatsapp.net/v/t62.7118-24/xxxxxxxxxxxxxx.enc?ccb=11-4&oh=xxxxxxxx&oe=xxxxx&mms3=true\",\r\n \"width\": 738,\r\n \"height\": 1600,\r\n \"mediaKey\": \"xxxxxxxx/xxxxxxx+xxxxxxxxxx=\",\r\n \"mimetype\": \"image/jpeg\",\r\n \"directPath\": \"/v/t62.7118-24/xxxxxxxxxxxx.enc?ccb=11-4&oh=xxxxxxx&oe=xxxx\",\r\n \"fileLength\": \"148979\",\r\n \"fileSha256\": \"xxxxxxxxx+xxxxxxxxxx=\",\r\n \"scanLengths\": [11804, 74479, 27132, 35564],\r\n \"scansSidecar\": \"xxxxxxxxxxxxx+xxx==\",\r\n \"fileEncSha256\": \"xxxxxxxxx+0k=\",\r\n \"mediaKeyTimestamp\": \"1675586197\",\r\n \"midQualityFileSha256\": \"xxxxxxxxxx/xxxxxxxxxx+xxxxxxx=\"\r\n }\r\n },\r\n \"messageStubParameters\": [],\r\n \"messageTimestamp\": \"1675586199\",\r\n \"pollUpdates\": [],\r\n \"reactions\": [],\r\n \"userReceipt\": []\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "http://localhost:3000/:sessionId/messages/download", - "protocol": "http", - "host": ["localhost"], - "port": "3000", - "path": [":sessionId", "messages", "download"], - "variable": [ - { - "key": "sessionId", - "value": "john", - "description": "Session id" - } - ] - } - }, - "status": "Internal Server Error", - "code": 500, - "_postman_previewlanguage": "json", - "header": [ - { - "key": "X-Powered-By", - "value": "Express" - }, - { - "key": "Access-Control-Allow-Origin", - "value": "*" - }, - { - "key": "Content-Type", - "value": "application/json; charset=utf-8" - }, - { - "key": "Content-Length", - "value": "327" - }, - { - "key": "ETag", - "value": "W/\"147-uzjVxFQmRFBfTvxqegxOJwD/Mao\"" - }, - { - "key": "Date", - "value": "Fri, 06 Jan 2023 15:27:17 GMT" - }, - { - "key": "Connection", - "value": "keep-alive" - }, - { - "key": "Keep-Alive", - "value": "timeout=5" - } - ], - "cookie": [], - "body": "{\n \"error\": \"An error occured during message media download\"\n}" - } - ] - } - ] - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "exec": [""] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [""] - } - } - ], - "variable": [ - { - "key": "BASE_URL", - "value": "http://localhost:3000", - "type": "string" - } - ] -} diff --git a/prettier.config.js b/prettier.config.js deleted file mode 100644 index 13828e03..00000000 --- a/prettier.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - printWidth: 100, - tabWidth: 2, - useTabs: false, - endOfLine: 'lf', - semi: true, - singleQuote: true, -}; diff --git a/prisma/schema.prisma b/prisma/schema.prisma deleted file mode 100644 index 94fd6e25..00000000 --- a/prisma/schema.prisma +++ /dev/null @@ -1,162 +0,0 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} - -model Chat { - pkId Int @id @default(autoincrement()) - sessionId String @db.VarChar(128) - archived Boolean? - contactPrimaryIdentityKey Bytes? - conversationTimestamp BigInt? - createdAt BigInt? - createdBy String? @db.VarChar(128) - description String? @db.VarChar(255) - disappearingMode Json? - displayName String? @db.VarChar(128) - endOfHistoryTransfer Boolean? - endOfHistoryTransferType Int? - ephemeralExpiration Int? - ephemeralSettingTimestamp BigInt? - id String @db.VarChar(128) - isDefaultSubgroup Boolean? - isParentGroup Boolean? - lastMsgTimestamp BigInt? - lidJid String? @db.VarChar(128) - markedAsUnread Boolean? - mediaVisibility Int? - messages Json? - muteEndTime BigInt? - name String? @db.VarChar(128) - newJid String? @db.VarChar(128) - notSpam Boolean? - oldJid String? @db.VarChar(128) - pHash String? @db.VarChar(128) - parentGroupId String? @db.VarChar(128) - participant Json? - pinned Int? - pnJid String? @db.VarChar(128) - pnhDuplicateLidThread Boolean? - readOnly Boolean? - shareOwnPn Boolean? - support Boolean? - suspended Boolean? - tcToken Bytes? - tcTokenSenderTimestamp BigInt? - tcTokenTimestamp BigInt? - terminated Boolean? - unreadCount Int? - unreadMentionCount Int? - wallpaper Json? - lastMessageRecvTimestamp Int? - - @@unique([sessionId, id], map: "unique_id_per_session_id") - @@index([sessionId]) -} - -model Contact { - pkId Int @id @default(autoincrement()) - sessionId String @db.VarChar(128) - id String @db.VarChar(128) - name String? @db.VarChar(128) - notify String? @db.VarChar(128) - verifiedName String? @db.VarChar(128) - imgUrl String? @db.VarChar(255) - status String? @db.VarChar(128) - - @@unique([sessionId, id], map: "unique_id_per_session_id") - @@index([sessionId]) -} - -model GroupMetadata { - pkId Int @id @default(autoincrement()) - sessionId String @db.VarChar(128) - id String @db.VarChar(128) - owner String? @db.VarChar(128) - subject String @db.VarChar(128) - subjectOwner String? @db.VarChar(128) - subjectTime Int? - creation Int? - desc String? @db.VarChar(255) - descOwner String? @db.VarChar(128) - descId String? @db.VarChar(128) - restrict Boolean? - announce Boolean? - size Int? - participants Json - ephemeralDuration Int? - inviteCode String? @db.VarChar(255) - - @@unique([sessionId, id], map: "unique_id_per_session_id") - @@index([sessionId]) -} - -model Message { - pkId Int @id @default(autoincrement()) - sessionId String @db.VarChar(128) - remoteJid String @db.VarChar(128) - id String @db.VarChar(128) - agentId String? @db.VarChar(128) - bizPrivacyStatus Int? - broadcast Boolean? - clearMedia Boolean? - duration Int? - ephemeralDuration Int? - ephemeralOffToOn Boolean? - ephemeralOutOfSync Boolean? - ephemeralStartTimestamp BigInt? - finalLiveLocation Json? - futureproofData Bytes? - ignore Boolean? - keepInChat Json? - key Json - labels Json? - mediaCiphertextSha256 Bytes? - mediaData Json? - message Json? - messageC2STimestamp BigInt? - messageSecret Bytes? - messageStubParameters Json? - messageStubType Int? - messageTimestamp BigInt? - multicast Boolean? - originalSelfAuthorUserJidString String? @db.VarChar(128) - participant String? @db.VarChar(128) - paymentInfo Json? - photoChange Json? - pollAdditionalMetadata Json? - pollUpdates Json? - pushName String? @db.VarChar(128) - quotedPaymentInfo Json? - quotedStickerData Json? - reactions Json? - revokeMessageTimestamp BigInt? - starred Boolean? - status Int? - statusAlreadyViewed Boolean? - statusPsa Json? - urlNumber Boolean? - urlText Boolean? - userReceipt Json? - verifiedBizName String? @db.VarChar(128) - - @@unique([sessionId, remoteJid, id], map: "unique_message_key_per_session_id") - @@index([sessionId]) -} - -model Session { - pkId Int @id @default(autoincrement()) - sessionId String @db.VarChar(128) - id String @db.VarChar(255) - data String @db.Text - - @@unique([sessionId, id], map: "unique_id_per_session_id") - @@index([sessionId]) -} diff --git a/src/controllers/chat.ts b/src/controllers/chat.ts deleted file mode 100644 index febbdf3b..00000000 --- a/src/controllers/chat.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { serializePrisma } from '@ookamiiixd/baileys-store'; -import type { RequestHandler } from 'express'; -import { logger, prisma } from '../shared'; - -export const list: RequestHandler = async (req, res) => { - try { - const { sessionId } = req.params; - const { cursor = undefined, limit = 25 } = req.query; - const chats = ( - await prisma.chat.findMany({ - cursor: cursor ? { pkId: Number(cursor) } : undefined, - take: Number(limit), - skip: cursor ? 1 : 0, - where: { sessionId }, - }) - ).map((c) => serializePrisma(c)); - - res.status(200).json({ - data: chats, - cursor: - chats.length !== 0 && chats.length === Number(limit) ? chats[chats.length - 1].pkId : null, - }); - } catch (e) { - const message = 'An error occured during chat list'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const find: RequestHandler = async (req, res) => { - try { - const { sessionId, jid } = req.params; - const { cursor = undefined, limit = 25 } = req.query; - const messages = ( - await prisma.message.findMany({ - cursor: cursor ? { pkId: Number(cursor) } : undefined, - take: Number(limit), - skip: cursor ? 1 : 0, - where: { sessionId, remoteJid: jid }, - orderBy: { messageTimestamp: 'desc' }, - }) - ).map((m) => serializePrisma(m)); - - res.status(200).json({ - data: messages, - cursor: - messages.length !== 0 && messages.length === Number(limit) - ? messages[messages.length - 1].pkId - : null, - }); - } catch (e) { - const message = 'An error occured during chat find'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; diff --git a/src/controllers/contact.ts b/src/controllers/contact.ts deleted file mode 100644 index 0fe2dfe4..00000000 --- a/src/controllers/contact.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { RequestHandler } from 'express'; -import { logger, prisma } from '../shared'; -import { getSession, jidExists } from '../wa'; -import { makePhotoURLHandler } from './misc'; - -export const list: RequestHandler = async (req, res) => { - try { - const { sessionId } = req.params; - const { cursor = undefined, limit = 25 } = req.query; - const contacts = await prisma.contact.findMany({ - cursor: cursor ? { pkId: Number(cursor) } : undefined, - take: Number(limit), - skip: cursor ? 1 : 0, - where: { id: { endsWith: 's.whatsapp.net' }, sessionId }, - }); - - res.status(200).json({ - data: contacts, - cursor: - contacts.length !== 0 && contacts.length === Number(limit) - ? contacts[contacts.length - 1].pkId - : null, - }); - } catch (e) { - const message = 'An error occured during contact list'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const listBlocked: RequestHandler = async (req, res) => { - try { - const session = getSession(req.params.sessionId)!; - const data = await session.fetchBlocklist(); - res.status(200).json(data); - } catch (e) { - const message = 'An error occured during blocklist fetch'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const updateBlock: RequestHandler = async (req, res) => { - try { - const session = getSession(req.params.sessionId)!; - const { jid, action = 'block' } = req.body; - - const exists = await jidExists(session, jid); - if (!exists) return res.status(400).json({ error: 'Jid does not exists' }); - - await session.updateBlockStatus(jid, action); - res.status(200).json({ message: `Contact ${action}ed` }); - } catch (e) { - const message = 'An error occured during blocklist update'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const check: RequestHandler = async (req, res) => { - try { - const { sessionId, jid } = req.params; - const session = getSession(sessionId)!; - - const exists = await jidExists(session, jid); - res.status(200).json({ exists }); - } catch (e) { - const message = 'An error occured during jid check'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const photo = makePhotoURLHandler(); diff --git a/src/controllers/group.ts b/src/controllers/group.ts deleted file mode 100644 index 63d35930..00000000 --- a/src/controllers/group.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { RequestHandler } from 'express'; -import { logger, prisma } from '../shared'; -import { getSession } from '../wa'; -import { makePhotoURLHandler } from './misc'; - -export const list: RequestHandler = async (req, res) => { - try { - const { sessionId } = req.params; - const { cursor = undefined, limit = 25 } = req.query; - const groups = await prisma.contact.findMany({ - cursor: cursor ? { pkId: Number(cursor) } : undefined, - take: Number(limit), - skip: cursor ? 1 : 0, - where: { id: { endsWith: 'g.us' }, sessionId }, - }); - - res.status(200).json({ - data: groups, - cursor: - groups.length !== 0 && groups.length === Number(limit) - ? groups[groups.length - 1].pkId - : null, - }); - } catch (e) { - const message = 'An error occured during group list'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const find: RequestHandler = async (req, res) => { - try { - const { sessionId, jid } = req.params; - const session = getSession(sessionId)!; - const data = await session.groupMetadata(jid); - res.status(200).json(data); - } catch (e) { - const message = 'An error occured during group metadata fetch'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const photo = makePhotoURLHandler('group'); diff --git a/src/controllers/message.ts b/src/controllers/message.ts deleted file mode 100644 index d2d71ca4..00000000 --- a/src/controllers/message.ts +++ /dev/null @@ -1,105 +0,0 @@ -import type { proto, WAGenericMediaMessage, WAMessage } from '@adiwajshing/baileys'; -import { downloadMediaMessage } from '@adiwajshing/baileys'; -import { serializePrisma } from '@ookamiiixd/baileys-store'; -import type { RequestHandler } from 'express'; -import { logger, prisma } from '../shared'; -import { delay as delayMs } from '../utils'; -import { getSession, jidExists } from '../wa'; - -export const list: RequestHandler = async (req, res) => { - try { - const { sessionId } = req.params; - const { cursor = undefined, limit = 25 } = req.query; - const messages = ( - await prisma.message.findMany({ - cursor: cursor ? { pkId: Number(cursor) } : undefined, - take: Number(limit), - skip: cursor ? 1 : 0, - where: { sessionId }, - }) - ).map((m) => serializePrisma(m)); - - res.status(200).json({ - data: messages, - cursor: - messages.length !== 0 && messages.length === Number(limit) - ? messages[messages.length - 1].pkId - : null, - }); - } catch (e) { - const message = 'An error occured during message list'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const send: RequestHandler = async (req, res) => { - try { - const { jid, type = 'number', message, options } = req.body; - const session = getSession(req.params.sessionId)!; - - const exists = await jidExists(session, jid, type); - if (!exists) return res.status(400).json({ error: 'JID does not exists' }); - - const result = await session.sendMessage(jid, message, options); - res.status(200).json(result); - } catch (e) { - const message = 'An error occured during message send'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; - -export const sendBulk: RequestHandler = async (req, res) => { - const session = getSession(req.params.sessionId)!; - const results: { index: number; result: proto.WebMessageInfo | undefined }[] = []; - const errors: { index: number; error: string }[] = []; - - for (const [ - index, - { jid, type = 'number', delay = 1000, message, options }, - ] of req.body.entries()) { - try { - const exists = await jidExists(session, jid, type); - if (!exists) { - errors.push({ index, error: 'JID does not exists' }); - continue; - } - - if (index > 0) await delayMs(delay); - const result = await session.sendMessage(jid, message, options); - results.push({ index, result }); - } catch (e) { - const message = 'An error occured during message send'; - logger.error(e, message); - errors.push({ index, error: message }); - } - } - - res - .status(req.body.length !== 0 && errors.length === req.body.length ? 500 : 200) - .json({ results, errors }); -}; - -export const download: RequestHandler = async (req, res) => { - try { - const session = getSession(req.params.sessionId)!; - const message = req.body as WAMessage; - const type = Object.keys(message.message!)[0] as keyof proto.IMessage; - const content = message.message![type] as WAGenericMediaMessage; - const buffer = await downloadMediaMessage( - message, - 'buffer', - {}, - { logger, reuploadRequest: session.updateMediaMessage } - ); - - res.setHeader('Content-Type', content.mimetype!); - res.write(buffer); - res.end(); - } catch (e) { - const message = 'An error occured during message media download'; - logger.error(e, message); - res.status(500).json({ error: message }); - } -}; diff --git a/src/controllers/misc.ts b/src/controllers/misc.ts deleted file mode 100644 index d77fdc9b..00000000 --- a/src/controllers/misc.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { RequestHandler } from 'express'; -import { logger } from '../shared'; -import { getSession, jidExists } from '../wa'; - -export const makePhotoURLHandler = - (type: 'number' | 'group' = 'number'): RequestHandler => - async (req, res) => { - try { - const { sessionId, jid } = req.params; - const session = getSession(sessionId)!; - - const exists = await jidExists(session, jid, type); - if (!exists) return res.status(400).json({ error: 'Jid does not exists' }); - - const url = await session.profilePictureUrl(jid, 'image'); - res.status(200).json({ url }); - } catch (e) { - const message = 'An error occured during photo fetch'; - logger.error(e, message); - res.status(500).json({ error: message }); - } - }; diff --git a/src/controllers/session.ts b/src/controllers/session.ts deleted file mode 100644 index 538590d2..00000000 --- a/src/controllers/session.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { RequestHandler } from 'express'; -import { - createSession, - deleteSession, - getSession, - getSessionStatus, - listSessions, - sessionExists, -} from '../wa'; - -export const list: RequestHandler = (req, res) => { - res.status(200).json(listSessions()); -}; - -export const find: RequestHandler = (req, res) => - res.status(200).json({ message: 'Session found' }); - -export const status: RequestHandler = (req, res) => { - const session = getSession(req.params.sessionId)!; - res.status(200).json({ status: getSessionStatus(session) }); -}; - -export const add: RequestHandler = async (req, res) => { - const { sessionId, readIncomingMessages, ...socketConfig } = req.body; - - if (sessionExists(sessionId)) return res.status(400).json({ error: 'Session already exists' }); - createSession({ sessionId, res, readIncomingMessages, socketConfig }); -}; - -export const addSSE: RequestHandler = async (req, res) => { - const { sessionId } = req.params; - res.writeHead(200, { - 'Content-Type': 'text/event-stream', - 'Cache-Control': 'no-cache', - Connection: 'keep-alive', - }); - - if (sessionExists(sessionId)) { - res.write(`data: ${JSON.stringify({ error: 'Session already exists' })}\n\n`); - res.end(); - return; - } - createSession({ sessionId, res, SSE: true }); -}; - -export const del: RequestHandler = async (req, res) => { - await deleteSession(req.params.sessionId); - res.status(200).json({ message: 'Session deleted' }); -}; diff --git a/src/index.ts b/src/index.ts index 3367179e..0247bf4b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,20 +1,71 @@ -import cors from 'cors'; -import 'dotenv/config'; -import express from 'express'; -import routes from './routes'; -import { init } from './wa'; +import { serve } from "@hono/node-server"; +import { serveStatic } from "@hono/node-server/serve-static"; +import { swaggerUI } from "@hono/swagger-ui"; +import { OpenAPIHono } from "@hono/zod-openapi"; +import { cors } from "hono/cors"; +import { HTTPException } from "hono/http-exception"; +import { logger as honoLogger } from "hono/logger"; +import { env } from "./lib/env"; +import { serializeError } from "./lib/error"; +import { logger } from "./lib/logger"; +import { restoreConnections } from "./lib/whatsapp"; +import { connectionMiddleware } from "./middlewares/connection"; +import { connectionRoutes } from "./routes/connections"; +import { messageRoutes } from "./routes/messages"; -const app = express(); +await restoreConnections(); + +const app = new OpenAPIHono(); app.use(cors()); -app.use(express.json()); -app.use('/', routes); -app.all('*', (req, res) => res.status(404).json({ error: 'URL not found' })); - -const host = process.env.HOST || '0.0.0.0'; -const port = Number(process.env.PORT || 3000); -const listener = () => console.log(`Server is listening on http://${host}:${port}`); - -(async () => { - await init(); - app.listen(port, host, listener); -})(); +app.use(honoLogger()); + +if (env.NODE_ENV === "development") { + app.get("/", serveStatic({ root: "./examples", path: "./sse.html" })); +} +app.route("/connections", connectionRoutes); + +const guarded = new OpenAPIHono(); +guarded.use(connectionMiddleware); +guarded.route("/messages", messageRoutes); + +app.route("/connections/:name", guarded); + +app.doc("/doc", { + openapi: "3.0.0", + info: { + version: "1.0.0", + title: "Baileys API", + description: `API documentation for the [Baileys API](https://github.com/ookamiiixd/baileys-api) project + +**Note**: Any routes that accepts a body, expects it in JSON format. Make sure to include the appropriate header`, + }, +}); +app.get("/ui", swaggerUI({ url: "/doc" })); + +app.onError((err, c) => { + const code = err instanceof HTTPException ? err.status : 500; + return c.json( + { + success: false as const, + error: serializeError(err), + }, + code, + ); +}); + +const server = serve({ port: env.PORT, fetch: app.fetch }); +logger.info(`Server is running on http://localhost:${env.PORT}`); + +process.on("SIGINT", () => { + server.close(); + process.exit(0); +}); +process.on("SIGTERM", () => { + server.close((err) => { + if (err) { + logger.error({ err }, "Unexpected error while closing server"); + process.exit(1); + } + process.exit(0); + }); +}); diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts new file mode 100644 index 00000000..7c721c02 --- /dev/null +++ b/src/lib/db/index.ts @@ -0,0 +1,17 @@ +import { drizzle } from "drizzle-orm/node-postgres"; +import pg from "pg"; +import { env } from "../env"; +import * as schema from "./schema"; + +const pool = new pg.Pool({ connectionString: env.DATABASE_URL }); +export const db = drizzle(pool, { + schema, + logger: env.NODE_ENV === "development", + casing: "snake_case", +}); + +export * as tables from "./schema"; + +export type TransactionDbClient = Parameters< + Parameters<(typeof db)["transaction"]>[0] +>[0]; diff --git a/src/lib/db/schema.ts b/src/lib/db/schema.ts new file mode 100644 index 00000000..61bd7d81 --- /dev/null +++ b/src/lib/db/schema.ts @@ -0,0 +1,293 @@ +import type { GroupParticipant, proto } from "baileys"; +import { relations } from "drizzle-orm"; +import { + bigint, + boolean, + integer, + jsonb, + pgTable, + smallint, + text, + timestamp, + unique, + varchar, +} from "drizzle-orm/pg-core"; +import type { WhatsAppConnectionOptions } from "../whatsapp/connection"; +import { bytea } from "./types/bytea"; +import { long } from "./types/long"; + +export const connections = pgTable("connections", { + id: bigint({ mode: "number" }) + .notNull() + .primaryKey() + .generatedAlwaysAsIdentity(), + name: varchar({ length: 255 }).notNull().unique(), + data: jsonb().$type(), + createdAt: timestamp({ mode: "date", withTimezone: true }) + .notNull() + .defaultNow(), + updatedAt: timestamp({ mode: "date", withTimezone: true }) + .notNull() + .defaultNow() + .$onUpdateFn(() => new Date()), +}); + +export const connectionRelations = relations(connections, ({ many }) => ({ + authStates: many(authStates), + chats: many(chats), + contacts: many(contacts), + groups: many(groups), +})); + +export const authStates = pgTable( + "auth_states", + { + id: bigint({ mode: "number" }) + .notNull() + .primaryKey() + .generatedAlwaysAsIdentity(), + connectionId: bigint({ mode: "number" }) + .notNull() + .references(() => connections.id, { onDelete: "cascade" }), + name: varchar({ length: 255 }).notNull(), + data: text(), + }, + (table) => [unique().on(table.connectionId, table.name)], +); + +export const authStateRelations = relations(authStates, ({ one }) => ({ + connection: one(connections, { + fields: [authStates.connectionId], + references: [connections.id], + }), +})); + +export const chats = pgTable( + "chats", + { + internalId: bigint({ mode: "number" }) + .notNull() + .primaryKey() + .generatedAlwaysAsIdentity(), + connectionId: bigint({ mode: "number" }) + .notNull() + .references(() => connections.id, { onDelete: "cascade" }), + + id: varchar({ length: 36 }).notNull(), + messages: jsonb().$type(), + newJid: varchar({ length: 128 }), + oldJid: varchar({ length: 128 }), + lastMsgTimestamp: long(), + unreadCount: integer(), + readOnly: boolean(), + endOfHistoryTransfer: boolean(), + ephemeralExpiration: integer(), + ephemeralSettingTimestamp: long(), + endOfHistoryTransferType: smallint(), + conversationTimestamp: long(), + name: varchar({ length: 255 }), + pHash: varchar({ length: 64 }), + notSpam: boolean(), + archived: boolean(), + disappearingMode: jsonb().$type(), + unreadMentionCount: integer(), + markedAsUnread: boolean(), + participant: jsonb().$type(), + tcToken: bytea(), + tcTokenTimestamp: long(), + contactPrimaryIdentityKey: bytea(), + pinned: integer(), + muteEndTime: long(), + wallpaper: jsonb().$type(), + mediaVisibility: smallint(), + tcTokenSenderTimestamp: long(), + suspended: boolean(), + terminated: boolean(), + createdAt: long(), + createdBy: varchar({ length: 128 }), + description: text(), + support: boolean(), + isParentGroup: boolean(), + parentGroupId: varchar({ length: 128 }), + isDefaultSubgroup: boolean(), + displayName: varchar({ length: 255 }), + pnJid: varchar({ length: 128 }), + shareOwnPn: boolean(), + pnhDuplicateLidThread: boolean(), + lidJid: varchar({ length: 128 }), + username: varchar({ length: 64 }), + lidOriginType: varchar({ length: 32 }), + commentsCount: integer(), + locked: boolean(), + systemMessageToInsert: jsonb().$type(), + capiCreatedGroup: boolean(), + accountLid: varchar({ length: 128 }), + limitSharing: boolean(), + limitSharingSettingTimestamp: long(), + limitSharingTrigger: smallint(), + limitSharingInitiatedByMe: boolean(), + lastMessageRecvTimestamp: bigint({ mode: "number" }), + }, + (table) => [unique().on(table.connectionId, table.id)], +); + +export const chatRelations = relations(chats, ({ one }) => ({ + connection: one(connections, { + fields: [chats.connectionId], + references: [connections.id], + }), +})); + +export const contacts = pgTable( + "contacts", + { + internalId: bigint({ mode: "number" }) + .notNull() + .primaryKey() + .generatedAlwaysAsIdentity(), + connectionId: bigint({ mode: "number" }) + .notNull() + .references(() => connections.id, { onDelete: "cascade" }), + + id: varchar({ length: 128 }).notNull(), + lid: varchar({ length: 128 }), + name: varchar({ length: 255 }), + notify: varchar({ length: 255 }), + verifiedName: varchar({ length: 255 }), + imgUrl: varchar({ length: 2048 }), + status: varchar({ length: 255 }), + }, + (table) => [unique().on(table.connectionId, table.id)], +); + +export const contactRelations = relations(contacts, ({ one }) => ({ + connection: one(connections, { + fields: [contacts.connectionId], + references: [connections.id], + }), +})); + +export const messages = pgTable( + "messages", + { + internalId: bigint({ mode: "number" }) + .notNull() + .primaryKey() + .generatedAlwaysAsIdentity(), + connectionId: bigint({ mode: "number" }) + .notNull() + .references(() => connections.id, { onDelete: "cascade" }), + + key: jsonb().$type().notNull(), + message: jsonb().$type(), + messageTimestamp: long(), + status: smallint(), + participant: varchar({ length: 128 }), + messageC2STimestamp: long(), + ignore: boolean(), + starred: boolean(), + broadcast: boolean(), + pushName: varchar({ length: 255 }), + mediaCiphertextSha256: bytea(), + futureproofData: bytea(), + messageSecret: bytea(), + multicast: boolean(), + urlText: boolean(), + urlNumber: boolean(), + messageStubType: smallint(), + clearMedia: boolean(), + messageStubParameters: jsonb().$type(), + duration: integer(), + labels: jsonb().$type(), + paymentInfo: jsonb().$type(), + quotedPaymentInfo: jsonb().$type(), + finalLiveLocation: jsonb().$type(), + ephemeralStartTimestamp: long(), + ephemeralDuration: integer(), + ephemeralOffToOn: boolean(), + ephemeralOutOfSync: boolean(), + bizPrivacyStatus: smallint(), + verifiedBizName: varchar({ length: 255 }), + mediaData: jsonb().$type(), + quotedStickerData: jsonb().$type(), + photoChange: jsonb().$type(), + userReceipt: jsonb().$type(), + reactions: jsonb().$type(), + statusPsa: jsonb().$type(), + pollUpdates: jsonb().$type(), + pollAdditionalMetadata: jsonb().$type(), + newsletterServerId: long(), + eventAdditionalMetadata: jsonb().$type(), + agentId: varchar({ length: 128 }), + botMessageInvokerJid: varchar({ length: 128 }), + botTargetId: varchar({ length: 128 }), + messageAddOns: jsonb().$type(), + keepInChat: jsonb().$type(), + pinInChat: jsonb().$type(), + premiumMessageInfo: jsonb().$type(), + is1PBizBotMessage: boolean(), + isGroupHistoryMessage: boolean(), + commentMetadata: jsonb().$type(), + eventResponses: jsonb().$type(), + reportingTokenInfo: jsonb().$type(), + isMentionedInStatus: boolean(), + statusMentions: jsonb().$type(), + statusMentionMessageInfo: jsonb().$type(), + statusMentionSources: jsonb().$type(), + isSupportAiMessage: boolean(), + supportAiCitations: jsonb().$type(), + revokeMessageTimestamp: long(), + }, + (table) => [unique().on(table.connectionId, table.key)], +); + +export const messageRelations = relations(messages, ({ one }) => ({ + connection: one(connections, { + fields: [messages.connectionId], + references: [connections.id], + }), +})); + +export const groups = pgTable( + "groups", + { + internalId: bigint({ mode: "number" }) + .notNull() + .primaryKey() + .generatedAlwaysAsIdentity(), + connectionId: bigint({ mode: "number" }) + .notNull() + .references(() => connections.id, { onDelete: "cascade" }), + + id: varchar({ length: 128 }).notNull(), + addressingMode: varchar({ length: 3 }), + owner: varchar({ length: 128 }), + subject: varchar({ length: 255 }), + subjectOwner: varchar({ length: 128 }), + subjectTime: bigint({ mode: "number" }), + creation: bigint({ mode: "number" }), + desc: text(), + descOwner: varchar({ length: 128 }), + descId: varchar({ length: 128 }), + linkedParent: varchar({ length: 128 }), + restrict: boolean(), + announce: boolean(), + memberAddMode: boolean(), + joinApprovalMode: boolean(), + isCommunity: boolean(), + isCommunityAnnounce: boolean(), + size: integer(), + participants: jsonb().$type(), + ephemeralDuration: integer(), + inviteCode: varchar({ length: 64 }), + author: varchar({ length: 128 }), + }, + (table) => [unique().on(table.connectionId, table.id)], +); + +export const groupRelations = relations(groups, ({ one }) => ({ + connection: one(connections, { + fields: [groups.connectionId], + references: [connections.id], + }), +})); diff --git a/src/lib/db/types/bytea.ts b/src/lib/db/types/bytea.ts new file mode 100644 index 00000000..fe40a395 --- /dev/null +++ b/src/lib/db/types/bytea.ts @@ -0,0 +1,13 @@ +import { customType } from "drizzle-orm/pg-core"; + +export const bytea = customType<{ data: Uint8Array }>({ + dataType() { + return "bytea"; + }, + toDriver(value) { + return Buffer.from(value); + }, + fromDriver(value) { + return new Uint8Array(value as Buffer); + }, +}); diff --git a/src/lib/db/types/long.ts b/src/lib/db/types/long.ts new file mode 100644 index 00000000..c93c323f --- /dev/null +++ b/src/lib/db/types/long.ts @@ -0,0 +1,14 @@ +import { customType } from "drizzle-orm/pg-core"; +import Long from "long"; + +export const long = customType<{ data: number | Long; driverData: number }>({ + dataType() { + return "bigint"; + }, + toDriver(value: Long | number) { + return Long.isLong(value) ? value.toNumber() : value; + }, + fromDriver(value) { + return value; + }, +}); diff --git a/src/lib/db/utils.ts b/src/lib/db/utils.ts new file mode 100644 index 00000000..b11729eb --- /dev/null +++ b/src/lib/db/utils.ts @@ -0,0 +1,24 @@ +import { type SQL, sql } from "drizzle-orm"; + +export function generateExcludedFields< + Data extends Record, + ExcludedKeys extends (keyof Data)[] = never, +>( + data: Data, + excludedKeys?: ExcludedKeys, +): Omit, ExcludedKeys[number]> { + return Object.keys(data) + .filter((key) => !excludedKeys?.includes(key as keyof Data)) + .reduce( + (acc, key) => { + acc[key] = sql.raw(`excluded.${camelToSnake(key)}`); + return acc; + }, + // biome-ignore lint/suspicious/noExplicitAny: No brainer way to type this + {} as any, + ); +} + +function camelToSnake(str: string) { + return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`); +} diff --git a/src/lib/env.ts b/src/lib/env.ts new file mode 100644 index 00000000..fa9c00b3 --- /dev/null +++ b/src/lib/env.ts @@ -0,0 +1,16 @@ +import z from "zod/v4"; + +const schema = z.object({ + NODE_ENV: z + .enum(["development", "production", "test"]) + .default("development"), + LOG_LEVEL: z.string().default("debug"), + DATABASE_URL: z.url(), + PORT: z.coerce.number().default(3000), + MAX_RECONNECT_ATTEMPTS: z.coerce.number().min(1).default(5), + RECONNECT_INTERVAL: z.coerce.number().min(1000).default(5000), + MAX_QR_ATTEMPTS: z.coerce.number().min(1).default(5), + PAIR_CODE_TIMEOUT: z.coerce.number().min(1000).default(60_000), +}); + +export const env = schema.parse(process.env); diff --git a/src/lib/error.ts b/src/lib/error.ts new file mode 100644 index 00000000..93be7b45 --- /dev/null +++ b/src/lib/error.ts @@ -0,0 +1,19 @@ +export function getError(error: unknown) { + if (error instanceof Error) { + return error; + } + + if (typeof error === "string") { + return new Error(error); + } + + return new Error("Unknown error"); +} + +export function serializeError(error: unknown) { + const err = getError(error); + return { + name: err.name, + message: err.message, + }; +} diff --git a/src/lib/logger.ts b/src/lib/logger.ts new file mode 100644 index 00000000..ca4e852d --- /dev/null +++ b/src/lib/logger.ts @@ -0,0 +1,4 @@ +import pino from "pino"; +import { env } from "./env"; + +export const logger = pino({ level: env.LOG_LEVEL, name: "App" }); diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 00000000..8cf46c99 --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,5 @@ +export type ShallowExtract = T extends T + ? U extends Partial + ? T + : never + : never; diff --git a/src/lib/validation.ts b/src/lib/validation.ts new file mode 100644 index 00000000..95233265 --- /dev/null +++ b/src/lib/validation.ts @@ -0,0 +1,33 @@ +import { z } from "@hono/zod-openapi"; + +export const successResponseSchema = z.object({ + success: z.literal(true), + message: z.string().optional(), +}); + +export const errorResponseSchema = z.object({ + success: z.literal(false), + error: z.object({ + name: z.string().optional(), + message: z.string(), + }), +}); + +// Must be a numeric string with 3 to 32 digits, starting with a non-zero digit +export const PHONE_REGEX = /^[1-9]\d{2,31}$/; + +export const phoneNumberSchema = z.string().trim().regex(PHONE_REGEX).openapi({ + description: "Phone number in E.164 format without the '+' prefix", + example: "1234567890123", + pattern: "^[1-9]\\d{2,31}$", +}); + +export const paginationSchema = z.object({ + cursor: z.coerce.number().int().min(1).nullable().default(null).openapi({ + description: "Cursor for pagination", + }), + size: z.coerce.number().int().min(1).max(100).default(20).openapi({ + description: "Number of items per page", + example: 20, + }), +}); diff --git a/src/lib/whatsapp/auth-state.ts b/src/lib/whatsapp/auth-state.ts new file mode 100644 index 00000000..ee1f6a4b --- /dev/null +++ b/src/lib/whatsapp/auth-state.ts @@ -0,0 +1,156 @@ +import * as baileys from "baileys"; +import { and, eq, inArray, sql } from "drizzle-orm"; +import type pino from "pino"; +import { db, type TransactionDbClient, tables } from "../db"; +import type { WhatsAppConnection } from "./connection"; + +export class WhatsAppAuthState { + #connection: WhatsAppConnection; + #logger: pino.Logger; + + // Mutable, since baileys will mutate the state + state: baileys.AuthenticationState; + + constructor(connection: WhatsAppConnection) { + this.#connection = connection; + this.#logger = connection.logger.child({ name: "WhatsAppAuthState" }); + + this.state = { + creds: baileys.initAuthCreds(), + keys: { + get: this.#handleKeysGet, + set: this.#handleKeysSet, + }, + }; + } + + async initialize() { + const credentials = await this.#read("credentials"); + if (credentials) { + this.state.creds = credentials; + } + } + + async saveCredentials() { + await this.#write("credentials", this.state.creds); + } + + #handleKeysGet: baileys.SignalKeyStore["get"] = async (type, names) => { + const data: Record = {}; + const authStates = await this.#readMany(names); + + for (const authState of authStates) { + let value = authState.state; + if (type === "app-state-sync-key" && value) { + value = baileys.proto.Message.AppStateSyncKeyData.fromObject(value); + } + data[authState.name] = value; + } + + return data; + }; + + #handleKeysSet: baileys.SignalKeyStore["set"] = async (data) => { + await db.transaction(async (tx) => { + const promises: Promise[] = []; + + type Category = keyof baileys.SignalDataTypeMap; + for (const category in data) { + for (const name in data[category as Category]) { + const value = data[category as Category]?.[name]; + const stateName = `${category}-${name}`; + promises.push( + value + ? this.#write(stateName, value, tx) + : this.#delete(stateName, tx), + ); + } + } + + await Promise.all(promises); + }); + }; + + async #read(name: string) { + try { + const data = await db.query.authStates.findFirst({ + where: and( + eq(tables.authStates.connectionId, this.#connection.id), + eq(tables.authStates.name, name), + ), + }); + if (!data) { + return null; + } + + return JSON.parse(data.data ?? "{}", baileys.BufferJSON.reviver); + } catch (err) { + this.#logger.error({ err }, `Failed to read auth state for "${name}"`); + return null; + } + } + + async #readMany(names: string[]) { + try { + const data = await db.query.authStates.findMany({ + where: and( + eq(tables.authStates.connectionId, this.#connection.id), + inArray(tables.authStates.name, names), + ), + }); + + const deserialized = data.map((d) => { + try { + return { + ...d, + state: JSON.parse(d.data ?? "{}", baileys.BufferJSON.reviver), + }; + } catch { + return { ...d, state: null }; + } + }); + + return deserialized; + } catch (err) { + this.#logger.error( + { err }, + `Failed to read auth states for "${names.join(", ")}"`, + ); + return []; + } + } + + // biome-ignore lint/suspicious/noExplicitAny: This is a dynamic write + async #write(name: string, value: any, tx?: TransactionDbClient) { + try { + await (tx ?? db) + .insert(tables.authStates) + .values({ + connectionId: this.#connection.id, + name, + data: JSON.stringify(value, baileys.BufferJSON.replacer), + }) + .onConflictDoUpdate({ + target: [tables.authStates.connectionId, tables.authStates.name], + set: { data: sql`excluded.data` }, + }); + } catch (err) { + this.#logger.error({ err }, `Failed to write auth state for "${name}"`); + } + } + + async #delete(name: string, tx?: TransactionDbClient) { + try { + await (tx ?? db) + .delete(tables.authStates) + .where( + and( + eq(tables.authStates.connectionId, this.#connection.id), + eq(tables.authStates.name, name), + ), + ); + } catch (err) { + this.#logger.error({ err }, `Failed to delete auth state for "${name}"`); + } + } +} diff --git a/src/lib/whatsapp/connection.ts b/src/lib/whatsapp/connection.ts new file mode 100644 index 00000000..7813c22e --- /dev/null +++ b/src/lib/whatsapp/connection.ts @@ -0,0 +1,501 @@ +import { Boom } from "@hapi/boom"; +import { + Browsers, + DisconnectReason, + type GroupMetadata, + jidNormalizedUser, + makeCacheableSignalKeyStore, + makeWASocket, + type proto, + type SocketConfig, + type WASocket, +} from "baileys"; +import { and, eq, sql } from "drizzle-orm"; +import type pino from "pino"; +import type z from "zod/v4"; +import type { createConnectionBodySchema } from "~/routes/connections/create"; +import { db, tables } from "../db"; +import { env } from "../env"; +import { logger } from "../logger"; +import type { ShallowExtract } from "../types"; +import { WhatsAppAuthState } from "./auth-state"; +import { type ConnectionEvents, eventEmitter } from "./events"; +import { + WhatsAppChatHandlers, + WhatsAppContactHandlers, + WhatsAppGroupHandlers, + WhatsAppMessageHandlers, +} from "./handlers"; +import type { BaileysEvents, EventHandler, EventHandlers } from "./types"; + +const connectionsMap = new Map(); +const reconnectAttemptsMap = new Map(); +const qrAttemptsMap = new Map(); + +const MAX_RECONNECT_ATTEMPTS = env.MAX_RECONNECT_ATTEMPTS; +const RECONNECT_INTERVAL = env.RECONNECT_INTERVAL; +const MAX_QR_ATTEMPTS = env.MAX_QR_ATTEMPTS; +const PAIR_CODE_TIMEOUT = env.PAIR_CODE_TIMEOUT; + +export type WhatsAppConnectionOptions = z.infer< + typeof createConnectionBodySchema +>; + +export class WhatsAppConnection { + #id: number | null; + #options: WhatsAppConnectionOptions; + #logger: pino.Logger = logger; + + #connection: WASocket | null = null; + #eventHandlers: EventHandlers = {}; + + #qrCode: string | null = null; + #pairCode: string | null = null; + #pairCodeTimeout: NodeJS.Timeout | null = null; + + constructor(options: WhatsAppConnectionOptions, id?: number) { + this.#id = id ?? null; + this.#options = options; + this.#setup(); + } + + get id() { + if (!this.#id) { + throw new Error("Attempting to access connection ID before it was set"); + } + return this.#id; + } + + get logger() { + return this.#logger; + } + + get connection() { + if (!this.#connection) { + throw new Error("Connection is not initialized"); + } + return this.#connection; + } + + get status() { + if (!this.#connection) { + return "disconnected"; + } + + const authenticatedJid = this.#connection.authState.creds.me?.id; + return authenticatedJid ? "authenticated" : "connected"; + } + + get qrCode() { + return this.#qrCode; + } + + get pairCode() { + return this.#pairCode; + } + + async setOptions(options: Partial) { + const existingConnection = options.name + ? connectionsMap.get(options.name) + : null; + if (existingConnection) { + const message = `Connection with name ${options.name} already exists`; + this.#logger.error(message); + throw new Error(message); + } + + const newOptions = { + ...this.#options, + ...options, + baileysOptions: { + ...this.#options.baileysOptions, + ...options.baileysOptions, + }, + }; + + try { + await db.transaction(async (tx) => { + await tx + .update(tables.connections) + .set({ name: options.name, data: newOptions }) + .where(eq(tables.connections.id, this.id)); + }); + } catch (err) { + const message = `Failed to update connection options`; + this.#logger.error({ err }, message); + throw new Error(message); + } + + // Delete the instance from the map if the name changed + if (options.name && options.name !== this.#options.name) { + connectionsMap.delete(this.#options.name); + } + + // Reset auth method if phone number changed + if (options.phone && options.phone !== this.#options.phone) { + await this.setAuthMethod("qr"); + } else if ( + options.authMethod && + options.authMethod !== this.#options.authMethod + ) { + await this.setAuthMethod(options.authMethod); + } + + this.#options = newOptions; + this.#setup(); + + logger.info("Restarting connection due to options change"); + this.#connection?.end( + new Boom("Restarting connection", { + statusCode: DisconnectReason.restartRequired, + }), + ); + await this.connect(); + } + + async setAuthMethod(method: WhatsAppConnectionOptions["authMethod"]) { + if (method === "qr") { + this.#resetPairCode(); + return; + } + + // Stop if we already authenticated, client is not ready, QR has not been issued or we have alive pair code + if (this.status !== "connected" || !this.#qrCode || this.#pairCode) { + return; + } + + await this.#requestAndBroadcastPairCode(); + } + + async connect() { + connectionsMap.set(this.#options.name, this); + if (!this.#id) { + const message = "Initializing connection"; + this.#logger.info(message); + this.#broadcastEvent("connection:initialize", { message }); + await this.#save(); + } + + const authState = new WhatsAppAuthState(this); + await authState.initialize(); + + this.#connection = makeWASocket({ + markOnlineOnConnect: false, + generateHighQualityLinkPreview: true, + syncFullHistory: true, + browser: Browsers.ubuntu("Chrome"), + ...this.#options.baileysOptions, + logger, + auth: { + creds: authState.state.creds, + keys: makeCacheableSignalKeyStore(authState.state.keys, logger), + }, + getMessage: this.#getMessage.bind(this), + cachedGroupMetadata: this.#getGroup.bind(this), + }); + + this.#connection.ev.on( + "creds.update", + authState.saveCredentials.bind(authState), + ); + for (const [event, handler] of Object.entries(this.#eventHandlers)) { + this.#connection.ev.on( + event as BaileysEvents, + handler as EventHandler, + ); + } + } + + async destroy(shouldLogout = true) { + try { + if (shouldLogout) { + await this.#connection?.logout(); + } + + await db.transaction(async (tx) => { + await tx + .delete(tables.connections) + .where(eq(tables.connections.name, this.#options.name)); + }); + } catch (err) { + this.#logger.error( + { err }, + "Unexpected error while destroying connection", + ); + } + + this.#connection?.ev.removeAllListeners("creds.update"); + for (const event of Object.keys(this.#eventHandlers)) { + this.#connection?.ev.removeAllListeners(event as BaileysEvents); + } + this.#connection = null; + this.#qrCode = null; + this.#resetPairCode(); + + connectionsMap.delete(this.#options.name); + reconnectAttemptsMap.delete(this.#options.name); + qrAttemptsMap.delete(this.#options.name); + } + + #setup() { + this.#logger = logger.child({ + name: "WhatsAppConnection", + connectionName: this.#options.name, + phone: this.#options.phone, + }); + + this.#qrCode = null; + this.#resetPairCode(); + reconnectAttemptsMap.delete(this.#options.name); + qrAttemptsMap.delete(this.#options.name); + + this.#connection?.ev.removeAllListeners("creds.update"); + for (const event of Object.keys(this.#eventHandlers)) { + this.#connection?.ev.removeAllListeners(event as BaileysEvents); + } + + const chatHandlers = new WhatsAppChatHandlers(this); + const contactHandlers = new WhatsAppContactHandlers(this); + const groupHandlers = new WhatsAppGroupHandlers(this); + const messageHandlers = new WhatsAppMessageHandlers(this); + + this.#eventHandlers = { + ...chatHandlers.handlers, + ...contactHandlers.handlers, + ...groupHandlers.handlers, + ...messageHandlers.handlers, + "connection.update": this.#handleConnectionUpdate.bind(this), + call: this.#handleCall.bind(this), + }; + } + + async #save() { + const message = "Failed to save connection, destroying connection"; + + try { + await db.transaction(async (tx) => { + const [connection] = await tx + .insert(tables.connections) + .values({ + name: this.#options.name, + data: this.#options, + }) + .onConflictDoUpdate({ + target: tables.connections.name, + set: { data: this.#options }, + }) + .returning(); + if (!connection) { + this.#logger.error(message); + await this.destroy(false); + return; + } + + this.#id = connection.id; + }); + } catch (err) { + this.#logger.error({ err }, message); + await this.destroy(false); + throw new Error(message); + } + } + + async #requestAndBroadcastPairCode() { + const pairCode = await this.connection.requestPairingCode( + this.#options.phone, + ); + this.#pairCode = pairCode; + this.#broadcastEvent("connection:token_received", { + type: "pair", + token: pairCode, + }); + + // Abort the connection after the timeout reached + this.#pairCodeTimeout = setTimeout(async () => { + if (this.status !== "authenticated") { + this.#broadcastEvent("connection:error", { + code: "pair_code_timeout_reached", + message: "Pair code timeout reached, destroying connection", + }); + await this.destroy(); + } + }, PAIR_CODE_TIMEOUT); + } + + #shouldReconnect() { + const attempts = reconnectAttemptsMap.get(this.#options.name) || 0; + if (attempts >= MAX_RECONNECT_ATTEMPTS) { + this.#logger.error( + "Max reconnect attempts reached, destroying connection", + ); + return { reconnect: false, delay: 0 }; + } + + const delay = RECONNECT_INTERVAL ** attempts; + reconnectAttemptsMap.set(this.#options.name, attempts + 1); + return { reconnect: true, delay }; + } + + #resetPairCode() { + this.#pairCode = null; + if (this.#pairCodeTimeout) { + clearTimeout(this.#pairCodeTimeout); + this.#pairCodeTimeout = null; + } + } + + #handleConnectionUpdate: EventHandler<"connection.update"> = async ( + update, + ) => { + const { connection, lastDisconnect } = update; + if (connection === "open") { + reconnectAttemptsMap.delete(this.#options.name); + qrAttemptsMap.delete(this.#options.name); + + this.#qrCode = null; + this.#resetPairCode(); + this.#broadcastEvent("connection:authenticated", { + message: "Connection authenticated successfully", + }); + + const groups = await this.connection.groupFetchAllParticipating(); + this.connection.ev.emit("groups.upsert", Object.values(groups)); + return; + } + + if (connection === "close") { + const code = + lastDisconnect?.error instanceof Boom + ? lastDisconnect.error.output.statusCode + : 0; + const { reconnect, delay } = this.#shouldReconnect(); + + if (code === DisconnectReason.loggedOut || !reconnect) { + await this.destroy(code !== DisconnectReason.loggedOut); + this.#broadcastEvent("connection:error", { + code: "disconnected", + message: + "Logged out or max reconnect attempts reached, destroying connection", + }); + return; + } + + if (code !== DisconnectReason.restartRequired) { + const message = `Disconnected from server. Reconnecting in ${(delay / 1000).toFixed(2)} seconds`; + this.#logger.warn({ code, delay }, message); + this.#broadcastEvent("connection:reconnecting", { message }); + } + setTimeout( + async () => { + await this.connect(); + }, + code === DisconnectReason.restartRequired ? 0 : delay, + ); + return; + } + + const qrAttempts = qrAttemptsMap.get(this.#options.name) ?? 0; + if (update.qr) { + this.#qrCode = update.qr; + + // Do nothing and wait for the user to pair the device or the timeout to abort the connection + if (this.#options.authMethod === "pair" && this.#pairCode) { + return; + } + + if (this.#options.authMethod === "pair" && !this.#pairCode) { + await this.#requestAndBroadcastPairCode(); + return; + } + + if (this.#options.authMethod === "qr" && qrAttempts >= MAX_QR_ATTEMPTS) { + this.#broadcastEvent("connection:error", { + code: "max_qr_attempts_reached", + message: `Max QR attempts exceeded, destroying connection`, + }); + await this.destroy(); + return; + } + + qrAttemptsMap.set(this.#options.name, qrAttempts + 1); + this.#broadcastEvent("connection:token_received", { + type: "qr", + token: this.#qrCode, + }); + } + }; + + #handleCall: EventHandler<"call"> = async (calls) => { + if (this.#options.shouldRejectCall) { + for (const call of calls) { + await this.#connection?.rejectCall(call.id, call.from); + } + } + }; + + #getMessage: SocketConfig["getMessage"] = async (key) => { + if (!key.remoteJid || !key.id) { + return undefined; + } + + try { + const normalizedJid = jidNormalizedUser(key.remoteJid); + const data = await db.query.messages.findFirst({ + where: and( + eq(tables.messages.connectionId, this.id), + eq(sql`${tables.messages.key}->>'remoteJid'`, normalizedJid), + eq(sql`${tables.messages.key}->>'id'`, key.id), + ), + }); + + return data?.message as proto.IMessage; + } catch (err) { + this.#logger.error({ err, key }, `Failed to get message`); + return undefined; + } + }; + + #getGroup: SocketConfig["cachedGroupMetadata"] = async (jid) => { + try { + const normalizedJid = jidNormalizedUser(jid); + const data = await db.query.groups.findFirst({ + where: and( + eq(tables.groups.connectionId, this.id), + eq(tables.groups.id, normalizedJid), + ), + }); + + return data as GroupMetadata; + } catch (err) { + this.#logger.error({ err, jid }, `Failed to get group metadata`); + return undefined; + } + }; + + #broadcastEvent( + name: EventName, + data: ShallowExtract["data"], + ) { + const event = { name, data }; + this.#logger.info({ event }, `Broadcasting event`); + eventEmitter.emit("event", { + event, + connection: { name: this.#options.name }, + }); + } +} + +export async function restoreConnections() { + const connections = await db.query.connections.findMany(); + for (const connection of connections) { + const options = connection.data!; + const instance = new WhatsAppConnection(options, connection.id); + + void instance.connect(); + logger.info(`Restoring connection "${options.name}"...`); + } +} + +export function getConnectionByName(name: string) { + return connectionsMap.get(name) ?? null; +} diff --git a/src/lib/whatsapp/events.ts b/src/lib/whatsapp/events.ts new file mode 100644 index 00000000..597abdaf --- /dev/null +++ b/src/lib/whatsapp/events.ts @@ -0,0 +1,31 @@ +import { EventEmitter } from "node:events"; + +export const eventEmitter = new EventEmitter(); + +export type ConnectionEvents = + | { + name: + | "connection:initialize" + | "connection:authenticated" + | "connection:reconnecting"; + data: { message: string }; + } + | { + name: "connection:token_received"; + data: { type: "qr" | "pair"; token: string }; + } + | { + name: "connection:error"; + data: { + code: + | "disconnected" + | "max_qr_attempts_reached" + | "pair_code_timeout_reached"; + message: string; + }; + }; + +export interface Events { + connection: { name: string }; + event: ConnectionEvents; +} diff --git a/src/lib/whatsapp/handlers/chats.ts b/src/lib/whatsapp/handlers/chats.ts new file mode 100644 index 00000000..b8340195 --- /dev/null +++ b/src/lib/whatsapp/handlers/chats.ts @@ -0,0 +1,139 @@ +import { type Chat, jidNormalizedUser } from "baileys"; +import { and, eq, inArray, sql } from "drizzle-orm"; +import type pino from "pino"; +import { db, type TransactionDbClient, tables } from "~/lib/db"; +import { generateExcludedFields } from "~/lib/db/utils"; +import type { WhatsAppConnection } from "../connection"; +import type { EventHandler, EventHandlers } from "../types"; + +export class WhatsAppChatHandlers { + #connection: WhatsAppConnection; + #logger: pino.Logger; + #handlers: EventHandlers; + + constructor(connection: WhatsAppConnection) { + this.#connection = connection; + this.#logger = connection.logger.child({ name: "WhatsAppChatHandlers" }); + this.#handlers = { + "messaging-history.set": this.#historySync.bind(this), + "chats.upsert": this.#upsert.bind(this), + "chats.update": this.#update.bind(this), + "chats.delete": this.#delete.bind(this), + }; + } + + get handlers() { + return this.#handlers; + } + + #historySync: EventHandler<"messaging-history.set"> = async ({ + chats, + isLatest, + }) => { + try { + await db.transaction(async (tx) => { + if (isLatest) { + await tx + .delete(tables.chats) + .where(eq(tables.chats.connectionId, this.#connection.id)); + } + + await this.#upsert(chats, tx); + }); + } catch (err) { + this.#logger.error({ err }, "Failed to sync chats history"); + } + }; + + async #upsert(chats: Chat[], maybeTx?: TransactionDbClient) { + try { + const upsert = async (tx: TransactionDbClient) => { + const data = chats.map((chat) => ({ + ...chat, + id: jidNormalizedUser(chat.id), + connectionId: this.#connection.id, + })); + const result = await tx + .insert(tables.chats) + .values(data) + .onConflictDoUpdate({ + target: [tables.chats.connectionId, tables.chats.id], + set: generateExcludedFields(data[0]!, ["connectionId", "id"]), + }) + .returning({ internalId: tables.chats.internalId }); + + this.#logger.info(`Synced ${result.length} chats`); + }; + + if (maybeTx) { + await upsert(maybeTx); + } else { + await db.transaction(upsert); + } + } catch (err) { + this.#logger.error({ err }, "Failed to sync chats history"); + } + } + + #update: EventHandler<"chats.update"> = async (updates) => { + try { + for (const { id, ...update } of updates) { + if (!id) { + this.#logger.warn( + { update }, + "Got unexpected chat update without id", + ); + continue; + } + + const normalizedId = jidNormalizedUser(id); + await db.transaction(async (tx) => { + const affected = await tx + .update(tables.chats) + .set({ + ...update, + unreadCount: update.unreadCount + ? sql`${tables.chats.unreadCount} + ${update.unreadCount}` + : undefined, + }) + .where( + and( + eq(tables.chats.connectionId, this.#connection.id), + eq(tables.chats.id, normalizedId), + ), + ) + .returning({ internalId: tables.chats.internalId }); + + if (affected.length <= 0) { + this.#logger.warn( + { update }, + `Got update for non-existent chat with id: "${normalizedId}"`, + ); + } + }); + } + } catch (err) { + this.#logger.error({ err }, "Failed to update chats"); + } + }; + + #delete: EventHandler<"chats.delete"> = async (ids) => { + try { + await db.transaction(async (tx) => { + const affected = await tx + .delete(tables.chats) + .where( + and( + eq(tables.chats.connectionId, this.#connection.id), + inArray(tables.chats.id, ids.map(jidNormalizedUser)), + ), + ) + .returning({ internalId: tables.chats.internalId }); + + this.#logger.info(`Deleted ${affected.length} chats`); + }); + } catch (err) { + this.#logger.error({ err }, "Failed to delete chats"); + } + }; +} diff --git a/src/lib/whatsapp/handlers/contacts.ts b/src/lib/whatsapp/handlers/contacts.ts new file mode 100644 index 00000000..112b9f29 --- /dev/null +++ b/src/lib/whatsapp/handlers/contacts.ts @@ -0,0 +1,94 @@ +import { type Contact, jidNormalizedUser } from "baileys"; +import { and, eq } from "drizzle-orm"; +import type pino from "pino"; +import { db, tables } from "~/lib/db"; +import { generateExcludedFields } from "~/lib/db/utils"; +import type { WhatsAppConnection } from "../connection"; +import type { EventHandler, EventHandlers } from "../types"; + +export class WhatsAppContactHandlers { + #connection: WhatsAppConnection; + #logger: pino.Logger; + #handlers: EventHandlers; + + constructor(connection: WhatsAppConnection) { + this.#connection = connection; + this.#logger = connection.logger.child({ name: "WhatsAppContactHandlers" }); + this.#handlers = { + "messaging-history.set": this.#historySync.bind(this), + "contacts.upsert": this.#upsert.bind(this), + "contacts.update": this.#update.bind(this), + }; + } + + get handlers() { + return this.#handlers; + } + + #historySync: EventHandler<"messaging-history.set"> = async ({ + contacts, + }) => { + await this.#upsert(contacts); + }; + + #upsert: EventHandler<"contacts.upsert"> = async (contacts: Contact[]) => { + try { + await db.transaction(async (tx) => { + const data = contacts.map((contact) => ({ + ...contact, + id: jidNormalizedUser(contact.id), + connectionId: this.#connection.id, + })); + const result = await tx + .insert(tables.contacts) + .values(data) + .onConflictDoUpdate({ + target: [tables.contacts.connectionId, tables.contacts.id], + set: generateExcludedFields(data[0]!, ["connectionId", "id"]), + }) + .returning({ internalId: tables.contacts.internalId }); + + this.#logger.info(`Synced ${result.length} contacts`); + }); + } catch (err) { + this.#logger.error({ err }, "Failed to sync contacts history"); + } + }; + + #update: EventHandler<"contacts.update"> = async (updates) => { + try { + for (const { id, ...update } of updates) { + if (!id) { + this.#logger.warn( + { update }, + "Got unexpected contact update without id", + ); + continue; + } + + const normalizedId = jidNormalizedUser(id); + await db.transaction(async (tx) => { + const affected = await tx + .update(tables.contacts) + .set(update) + .where( + and( + eq(tables.contacts.connectionId, this.#connection.id), + eq(tables.contacts.id, normalizedId), + ), + ) + .returning({ internalId: tables.contacts.internalId }); + + if (affected.length <= 0) { + this.#logger.warn( + { update }, + `Got update for non-existent contact with id: "${normalizedId}"`, + ); + } + }); + } + } catch (err) { + this.#logger.error({ err }, "Failed to update contacts"); + } + }; +} diff --git a/src/lib/whatsapp/handlers/groups.ts b/src/lib/whatsapp/handlers/groups.ts new file mode 100644 index 00000000..1b36f219 --- /dev/null +++ b/src/lib/whatsapp/handlers/groups.ts @@ -0,0 +1,149 @@ +import { jidNormalizedUser } from "baileys"; +import { and, eq } from "drizzle-orm"; +import type pino from "pino"; +import { db, tables } from "~/lib/db"; +import { generateExcludedFields } from "~/lib/db/utils"; +import type { WhatsAppConnection } from "../connection"; +import type { EventHandler, EventHandlers } from "../types"; + +export class WhatsAppGroupHandlers { + #connection: WhatsAppConnection; + #logger: pino.Logger; + #handlers: EventHandlers; + + constructor(connection: WhatsAppConnection) { + this.#connection = connection; + this.#logger = connection.logger.child({ name: "WhatsAppGroupHandlers" }); + this.#handlers = { + "groups.upsert": this.#upsert.bind(this), + "groups.update": this.#update.bind(this), + "group-participants.update": this.#participantsUpdate.bind(this), + }; + } + + get handlers() { + return this.#handlers; + } + + #upsert: EventHandler<"groups.upsert"> = async (groups) => { + try { + await db.transaction(async (tx) => { + const data = groups.map((group) => ({ + ...group, + id: jidNormalizedUser(group.id), + connectionId: this.#connection.id, + })); + const result = await tx + .insert(tables.groups) + .values(data) + .onConflictDoUpdate({ + target: [tables.groups.connectionId, tables.groups.id], + set: generateExcludedFields(data[0]!, ["connectionId", "id"]), + }) + .returning({ internalId: tables.groups.internalId }); + + this.#logger.info(`Synced ${result.length} groups`); + }); + } catch (err) { + this.#logger.error({ err }, "Failed to sync groups"); + } + }; + + #update: EventHandler<"groups.update"> = async (updates) => { + try { + for (const { id, ...update } of updates) { + if (!id) { + this.#logger.warn( + { update }, + "Got unexpected group update without id", + ); + continue; + } + + const normalizedId = jidNormalizedUser(id); + await db.transaction(async (tx) => { + const affected = await tx + .update(tables.groups) + .set(update) + .where( + and( + eq(tables.groups.connectionId, this.#connection.id), + eq(tables.groups.id, normalizedId), + ), + ) + .returning({ internalId: tables.groups.internalId }); + + if (affected.length <= 0) { + this.#logger.warn( + { update }, + `Got update for non-existing group with id: "${normalizedId}"`, + ); + } + }); + } + } catch (err) { + this.#logger.error({ err }, "Failed to update groups"); + } + }; + + #participantsUpdate: EventHandler<"group-participants.update"> = async ( + update, + ) => { + try { + await db.transaction(async (tx) => { + const normalizedId = jidNormalizedUser(update.id); + const group = await tx.query.groups.findFirst({ + where: and( + eq(tables.groups.connectionId, this.#connection.id), + eq(tables.groups.id, normalizedId), + ), + }); + if (!group) { + this.#logger.warn( + { update }, + `Got participants update for non-existing group with id: "${normalizedId}"`, + ); + return; + } + + let participants = group.participants ?? []; + switch (update.action) { + case "add": + participants.push( + ...update.participants.map((id) => ({ + id, + isAdmin: false, + isSuperAdmin: false, + })), + ); + break; + case "demote": + case "promote": + for (const participant of participants) { + if (update.participants.includes(participant.id)) { + participant.isAdmin = update.action === "promote"; + } + } + break; + case "remove": + participants = participants.filter( + (participant) => !update.participants.includes(participant.id), + ); + break; + } + + await tx + .update(tables.groups) + .set({ participants }) + .where( + and( + eq(tables.groups.connectionId, this.#connection.id), + eq(tables.groups.id, normalizedId), + ), + ); + }); + } catch (err) { + this.#logger.error({ err }, "Failed to update group participants"); + } + }; +} diff --git a/src/lib/whatsapp/handlers/index.ts b/src/lib/whatsapp/handlers/index.ts new file mode 100644 index 00000000..47a6b175 --- /dev/null +++ b/src/lib/whatsapp/handlers/index.ts @@ -0,0 +1,4 @@ +export * from "./chats"; +export * from "./contacts"; +export * from "./groups"; +export * from "./messages"; diff --git a/src/lib/whatsapp/handlers/messages.ts b/src/lib/whatsapp/handlers/messages.ts new file mode 100644 index 00000000..f842ad0e --- /dev/null +++ b/src/lib/whatsapp/handlers/messages.ts @@ -0,0 +1,340 @@ +import { + type BaileysEventMap, + getKeyAuthor, + jidNormalizedUser, + toNumber, +} from "baileys"; +import { and, eq, inArray, sql } from "drizzle-orm"; +import type pino from "pino"; +import { db, type TransactionDbClient, tables } from "~/lib/db"; +import { generateExcludedFields } from "~/lib/db/utils"; +import type { WhatsAppConnection } from "../connection"; +import type { EventHandler, EventHandlers } from "../types"; + +export class WhatsAppMessageHandlers { + #connection: WhatsAppConnection; + #logger: pino.Logger; + #handlers: EventHandlers; + + constructor(connection: WhatsAppConnection) { + this.#connection = connection; + this.#logger = connection.logger.child({ name: "WhatsAppMessageHandlers" }); + this.#handlers = { + "messaging-history.set": this.#historySync.bind(this), + "messages.upsert": this.#upsert.bind(this), + "messages.update": this.#update.bind(this), + "messages.delete": this.#delete.bind(this), + "messages.reaction": this.#reaction.bind(this), + "message-receipt.update": this.#receipt.bind(this), + }; + } + + get handlers() { + return this.#handlers; + } + + #historySync: EventHandler<"messaging-history.set"> = async ({ + messages, + isLatest, + }) => { + try { + await db.transaction(async (tx) => { + if (isLatest) { + await tx + .delete(tables.messages) + .where(eq(tables.messages.connectionId, this.#connection.id)); + } + + await this.#upsert({ messages, type: "append" }, tx); + }); + } catch (err) { + this.#logger.error({ err }, "Failed to sync messages history"); + } + }; + + async #upsert( + { messages, type }: BaileysEventMap["messages.upsert"], + maybeTx?: TransactionDbClient, + ) { + try { + const upsert = async (tx: TransactionDbClient) => { + const data = messages.map((message) => ({ + ...message, + key: { + ...message.key, + remoteJid: jidNormalizedUser(message.key.remoteJid!), + }, + connectionId: this.#connection.id, + })); + const result = await tx + .insert(tables.messages) + .values(data) + .onConflictDoUpdate({ + target: [tables.messages.connectionId, tables.messages.key], + set: generateExcludedFields(data[0]!, ["connectionId", "key"]), + }) + .returning({ internalId: tables.messages.internalId }); + + this.#logger.info(`Synced ${result.length} messages`); + + if (type !== "notify") { + return; + } + + const normalizedMessages = messages.map((message) => ({ + ...message, + key: { + ...message.key, + remoteJid: jidNormalizedUser(message.key.remoteJid!), + }, + })); + const jids = new Set( + normalizedMessages.map((message) => message.key.remoteJid), + ); + + const foundChats = await tx.query.chats.findMany({ + columns: { id: true }, + where: and( + eq(tables.chats.connectionId, this.#connection.id), + inArray(tables.chats.id, Array.from(jids)), + ), + }); + + for (const jid of jids) { + if (foundChats.some((chat) => chat.id === jid)) { + continue; + } + + const latestMessage = normalizedMessages + .filter((message) => message.key.remoteJid === jid) + .sort( + (a, b) => + toNumber(b.messageTimestamp) - toNumber(a.messageTimestamp), + )[0]; + if (!latestMessage) { + continue; + } + + this.#connection.connection.ev.emit("chats.upsert", [ + { + id: jid, + conversationTimestamp: latestMessage.messageTimestamp, + unreadCount: 1, + }, + ]); + } + }; + + if (maybeTx) { + await upsert(maybeTx); + } else { + await db.transaction(upsert); + } + } catch (err) { + this.#logger.error({ err }, "Failed to sync messages history"); + } + } + + #update: EventHandler<"messages.update"> = async (updates) => { + try { + for (const { key, update } of updates) { + if (!key.id || !key.remoteJid) { + this.#logger.warn( + { update }, + "Got unexpected message update without key", + ); + continue; + } + + await db.transaction(async (tx) => { + const affected = await tx + .update(tables.messages) + .set(update) + .where( + and( + eq(tables.messages.connectionId, this.#connection.id), + eq(sql`${tables.messages.key}->>'remoteJid'`, key.remoteJid), + eq(sql`${tables.messages.key}->>'id'`, key.id), + ), + ) + .returning({ internalId: tables.messages.internalId }); + + if (affected.length <= 0) { + this.#logger.warn( + { update, key }, + `Got update for non-existent message`, + ); + } + }); + } + } catch (err) { + this.#logger.error({ err }, "Failed to update messages"); + } + }; + + #delete: EventHandler<"messages.delete"> = async (payload) => { + try { + await db.transaction(async (tx) => { + if ("all" in payload) { + const normalizedJid = jidNormalizedUser(payload.jid); + const affected = await tx + .delete(tables.messages) + .where( + and( + eq(tables.messages.connectionId, this.#connection.id), + eq(sql`${tables.messages.key}->>'remoteJid'`, normalizedJid), + ), + ) + .returning({ internalId: tables.messages.internalId }); + + this.#logger.info( + `Deleted ${affected.length} messages from "${normalizedJid}"`, + ); + return; + } + + const normalizedJid = jidNormalizedUser(payload.keys[0]!.remoteJid!); + const affected = await tx + .delete(tables.messages) + .where( + and( + eq(tables.messages.connectionId, this.#connection.id), + eq(sql`${tables.messages.key}->>'remoteJid'`, normalizedJid), + inArray( + sql`${tables.messages.key}->>'id'`, + payload.keys.map((key) => key.id!), + ), + ), + ) + .returning({ internalId: tables.messages.internalId }); + + this.#logger.info( + `Deleted ${affected.length} messages from "${normalizedJid}"`, + ); + }); + } catch (err) { + this.#logger.error({ err }, "Failed to delete messages"); + } + }; + + #reaction: EventHandler<"messages.reaction"> = async (updates) => { + try { + for (const { key, reaction } of updates) { + if (!key.id || !key.remoteJid) { + this.#logger.warn( + { reaction }, + "Got unexpected message reaction without key", + ); + continue; + } + + const normalizedJid = jidNormalizedUser(key.remoteJid); + const message = await db.query.messages.findFirst({ + where: and( + eq(tables.messages.connectionId, this.#connection.id), + eq(sql`${tables.messages.key}->>'remoteJid'`, normalizedJid), + eq(sql`${tables.messages.key}->>'id'`, key.id), + ), + }); + if (!message) { + this.#logger.warn( + { reaction, key }, + `Got reaction for non-existent message`, + ); + continue; + } + + await db.transaction(async (tx) => { + const authorJid = getKeyAuthor(reaction.key); + const reactions = (message.reactions || []).filter( + (r) => getKeyAuthor(r.key) !== authorJid, + ); + reaction.text = reaction.text || ""; + reactions.push(reaction); + + const affected = await tx + .update(tables.messages) + .set({ reactions }) + .where( + and( + eq(tables.messages.connectionId, this.#connection.id), + eq(sql`${tables.messages.key}->>'remoteJid'`, normalizedJid), + eq(sql`${tables.messages.key}->>'id'`, key.id), + ), + ) + .returning({ internalId: tables.messages.internalId }); + + if (affected.length <= 0) { + this.#logger.warn( + { reaction, key }, + `Got reaction for non-existent message`, + ); + } + }); + } + } catch (err) { + this.#logger.error({ err }, "Failed to update message reactions"); + } + }; + + #receipt: EventHandler<"message-receipt.update"> = async (updates) => { + try { + for (const { key, receipt } of updates) { + if (!key.id || !key.remoteJid) { + this.#logger.warn( + { receipt }, + "Got unexpected message receipt without key", + ); + continue; + } + + const normalizedJid = jidNormalizedUser(key.remoteJid); + const message = await db.query.messages.findFirst({ + where: and( + eq(tables.messages.connectionId, this.#connection.id), + eq(sql`${tables.messages.key}->>'remoteJid'`, normalizedJid), + eq(sql`${tables.messages.key}->>'id'`, key.id), + ), + }); + if (!message) { + this.#logger.warn( + { receipt, key }, + `Got receipt for non-existent message`, + ); + continue; + } + + await db.transaction(async (tx) => { + const receipts = (message.userReceipt || []).filter( + (r) => r.userJid !== receipt.userJid, + ); + const originalReceipt = (message.userReceipt || []).find( + (r) => r.userJid === receipt.userJid, + ); + receipts.push({ ...originalReceipt, ...receipt }); + + const affected = await tx + .update(tables.messages) + .set({ userReceipt: receipts }) + .where( + and( + eq(tables.messages.connectionId, this.#connection.id), + eq(sql`${tables.messages.key}->>'remoteJid'`, normalizedJid), + eq(sql`${tables.messages.key}->>'id'`, key.id), + ), + ) + .returning({ internalId: tables.messages.internalId }); + + if (affected.length <= 0) { + this.#logger.warn( + { receipt, key }, + `Got receipt for non-existent message`, + ); + } + }); + } + } catch (err) { + this.#logger.error({ err }, "Failed to update message receipts"); + } + }; +} diff --git a/src/lib/whatsapp/index.ts b/src/lib/whatsapp/index.ts new file mode 100644 index 00000000..53073f6a --- /dev/null +++ b/src/lib/whatsapp/index.ts @@ -0,0 +1,2 @@ +export * from "./connection"; +export * from "./events"; diff --git a/src/lib/whatsapp/types.ts b/src/lib/whatsapp/types.ts new file mode 100644 index 00000000..03b35810 --- /dev/null +++ b/src/lib/whatsapp/types.ts @@ -0,0 +1,9 @@ +import type { BaileysEventMap } from "baileys"; + +export type BaileysEvents = keyof BaileysEventMap; +export type EventHandler = ( + data: BaileysEventMap[T], +) => Promise | void; +export type EventHandlers = { + [K in BaileysEvents]?: EventHandler; +}; diff --git a/src/middlewares/connection.ts b/src/middlewares/connection.ts new file mode 100644 index 00000000..c5607eda --- /dev/null +++ b/src/middlewares/connection.ts @@ -0,0 +1,30 @@ +import { createMiddleware } from "hono/factory"; +import { HTTPException } from "hono/http-exception"; +import { getConnectionByName, type WhatsAppConnection } from "../lib/whatsapp"; + +interface ContextVariables { + instance: WhatsAppConnection; +} + +export const connectionMiddleware = createMiddleware<{ + Variables: ContextVariables; +}>(async (c, next) => { + const name = c.req.path.split("/connections/")?.[1]?.split("/")?.[0]; + if (!name) { + throw new HTTPException(500, { + message: "Could not determine connection name from request path", + }); + } + + const instance = getConnectionByName(name); + if (!instance) { + throw new HTTPException(404, { message: `Connection "${name}" not found` }); + } + + c.set("instance", instance); + await next(); +}); + +declare module "hono" { + interface ContextVariableMap extends ContextVariables {} +} diff --git a/src/middlewares/request-validator.ts b/src/middlewares/request-validator.ts deleted file mode 100644 index f362ffff..00000000 --- a/src/middlewares/request-validator.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { RequestHandler } from 'express'; -import { validationResult } from 'express-validator'; - -const validate: RequestHandler = (req, res, next) => { - const errors = validationResult(req); - if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() }); - next(); -}; - -export default validate; diff --git a/src/middlewares/session-validator.ts b/src/middlewares/session-validator.ts deleted file mode 100644 index e13707b6..00000000 --- a/src/middlewares/session-validator.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { RequestHandler } from 'express'; -import { sessionExists } from '../wa'; - -const validate: RequestHandler = (req, res, next) => { - if (!sessionExists(req.params.sessionId)) - return res.status(404).json({ error: 'Session not found' }); - next(); -}; - -export default validate; diff --git a/src/routes/chats.ts b/src/routes/chats.ts deleted file mode 100644 index e41c0a47..00000000 --- a/src/routes/chats.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Router } from 'express'; -import { query } from 'express-validator'; -import * as controller from '../controllers/chat'; -import requestValidator from '../middlewares/request-validator'; - -const router = Router({ mergeParams: true }); -router.get( - '/', - query('cursor').isNumeric().optional(), - query('limit').isNumeric().optional(), - requestValidator, - controller.list -); -router.get( - '/:jid', - query('cursor').isNumeric().optional(), - query('limit').isNumeric().optional(), - requestValidator, - controller.find -); - -export default router; diff --git a/src/routes/connections/create.ts b/src/routes/connections/create.ts new file mode 100644 index 00000000..4a85b3c4 --- /dev/null +++ b/src/routes/connections/create.ts @@ -0,0 +1,67 @@ +import { createRoute, z } from "@hono/zod-openapi"; +import { + errorResponseSchema, + phoneNumberSchema, + successResponseSchema, +} from "~/lib/validation"; + +export const createConnectionBodySchema = z.object({ + name: z.string().trim().min(1).max(255).openapi({ + description: "Unique identifier for the connection name", + example: "connection-123", + }), + phone: phoneNumberSchema, + authMethod: z.enum(["qr", "pair"]).default("qr").openapi({ + description: "Authentication method to use for the connection", + }), + shouldRejectCall: z.boolean().default(false).openapi({ + description: "Whether to reject a call whenever it comes in", + }), + baileysOptions: z.record(z.string(), z.any()).optional().openapi({ + description: + "Additional options for the baileys connection. You can only pass JSON parse-able values", + }), +}); + +export const route = createRoute({ + tags: ["Connections"], + summary: "Create new connection", + description: "Create a new connection with the provided options", + method: "post", + path: "/create", + request: { + body: { + content: { + "application/json": { + schema: createConnectionBodySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Connection created successfully", + content: { + "application/json": { + schema: successResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request parameters", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + }, +}); diff --git a/src/routes/connections/delete.ts b/src/routes/connections/delete.ts new file mode 100644 index 00000000..a7d45b81 --- /dev/null +++ b/src/routes/connections/delete.ts @@ -0,0 +1,48 @@ +import { createRoute } from "@hono/zod-openapi"; +import { errorResponseSchema, successResponseSchema } from "~/lib/validation"; +import { findConnectionParamsSchema } from "./find"; + +export const route = createRoute({ + tags: ["Connections"], + summary: "Delete connection", + description: "Delete an existing connection", + method: "delete", + path: "/{name}", + request: { + params: findConnectionParamsSchema, + }, + responses: { + 200: { + description: "Connection deleted successfully", + content: { + "application/json": { + schema: successResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request parameters", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 404: { + description: "Connection not found", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + }, +}); diff --git a/src/routes/connections/events.ts b/src/routes/connections/events.ts new file mode 100644 index 00000000..d1be8476 --- /dev/null +++ b/src/routes/connections/events.ts @@ -0,0 +1,24 @@ +import { createRoute, z } from "@hono/zod-openapi"; + +const successResponseSchema = z.string().openapi({ + description: "Stream of connection events", + example: `{"event":{"name":"connection:initialize","data":{"message":"Initializing connection"}},"connection":{"name":"test"}}`, +}); + +export const route = createRoute({ + tags: ["Connections"], + summary: "Event streams for connections", + description: "Subscribe to event streams for all instantiated connections", + method: "get", + path: "/events", + responses: { + 200: { + description: "Stream of connection events", + content: { + "text/event-stream": { + schema: successResponseSchema, + }, + }, + }, + }, +}); diff --git a/src/routes/connections/find.ts b/src/routes/connections/find.ts new file mode 100644 index 00000000..0184386d --- /dev/null +++ b/src/routes/connections/find.ts @@ -0,0 +1,67 @@ +import { createRoute, z } from "@hono/zod-openapi"; +import { createSelectSchema } from "drizzle-zod"; +import { tables } from "~/lib/db"; +import { + successResponseSchema as baseSuccessResponseSchema, + errorResponseSchema, +} from "~/lib/validation"; +import { createConnectionBodySchema } from "./create"; + +export const connectionSchema = createSelectSchema(tables.connections) + .extend({ + status: z.enum(["disconnected", "connected", "authenticated"]), + }) + .openapi("Connection"); + +export const findConnectionParamsSchema = createConnectionBodySchema.pick({ + name: true, +}); + +const successResponseSchema = baseSuccessResponseSchema.extend({ + data: connectionSchema, +}); + +export const route = createRoute({ + tags: ["Connections"], + summary: "Get connection details", + description: "Retrieve details of a specific connection", + method: "get", + path: "/{name}", + request: { + params: findConnectionParamsSchema, + }, + responses: { + 200: { + description: "Connection details retrieved successfully", + content: { + "application/json": { + schema: successResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request parameters", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 404: { + description: "Connection not found", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + }, +}); diff --git a/src/routes/connections/index.ts b/src/routes/connections/index.ts new file mode 100644 index 00000000..faa2ff85 --- /dev/null +++ b/src/routes/connections/index.ts @@ -0,0 +1,236 @@ +import { OpenAPIHono } from "@hono/zod-openapi"; +import { desc, eq, lt } from "drizzle-orm"; +import { streamSSE } from "hono/streaming"; +import { db, tables } from "~/lib/db"; +import { getError, serializeError } from "~/lib/error"; +import { + type Events, + eventEmitter, + getConnectionByName, + WhatsAppConnection, +} from "~/lib/whatsapp"; +import { connectionMiddleware } from "~/middlewares/connection"; +import { route as createRoute } from "./create"; +import { route as deleteRoute } from "./delete"; +import { route as eventsRoute } from "./events"; +import { route as findRoute } from "./find"; +import { route as listRoute } from "./list"; +import { route as pairRoute } from "./pair"; +import { route as qrRoute } from "./qr"; +import { route as updateRoute } from "./update"; + +const app = new OpenAPIHono(); +const guarded = new OpenAPIHono(); +guarded.use(connectionMiddleware); + +app.openapi(createRoute, async (c) => { + const body = c.req.valid("json"); + const existingConnection = getConnectionByName(body.name); + if (existingConnection) { + return c.json( + { + success: false as const, + error: serializeError( + `Connection with name "${body.name}" already exists`, + ), + }, + 400, + ); + } + + try { + const instance = new WhatsAppConnection(body); + await instance.connect(); + + return c.json( + { + success: true as const, + message: `Connection "${body.name}" created successfully`, + }, + 200, + ); + } catch (err) { + return c.json( + { + success: false as const, + error: serializeError(err), + }, + 500, + ); + } +}); + +app.openapi(listRoute, async (c) => { + const query = c.req.valid("query"); + + try { + const connections = await db.query.connections.findMany({ + limit: query.size, + where: query.cursor ? lt(tables.connections.id, query.cursor) : undefined, + orderBy: [desc(tables.connections.createdAt)], + }); + const data = connections.map((connection) => { + const instance = getConnectionByName(connection.name); + return { + ...connection, + status: (instance + ? instance.status + : "disconnected") as WhatsAppConnection["status"], + }; + }); + + return c.json( + { + success: true as const, + message: "Connections retrieved successfully", + data, + cursor: data.length === query.size ? data[data.length - 1]!.id : null, + }, + 200, + ); + } catch (err) { + return c.json( + { + success: false as const, + error: serializeError(err), + }, + 500, + ); + } +}); + +guarded.openapi(findRoute, async (c) => { + const params = c.req.valid("param"); + const instance = c.get("instance"); + + try { + const connection = await db.query.connections.findFirst({ + where: eq(tables.connections.name, params.name), + }); + if (!connection) { + return c.json( + { + success: false as const, + error: serializeError(`Connection "${params.name}" not found`), + }, + 404, + ); + } + + return c.json( + { + success: true as const, + message: `Connection details retrieved successfully`, + data: { + ...connection, + // Idk why it yells without this cast + status: instance.status as WhatsAppConnection["status"], + }, + }, + 200, + ); + } catch (err) { + return c.json( + { + success: false as const, + error: serializeError(err), + }, + 500, + ); + } +}); + +guarded.openapi(qrRoute, (c) => { + const instance = c.get("instance"); + return c.json( + { + success: true as const, + message: `QR code retrieved successfully`, + data: instance.qrCode, + }, + 200, + ); +}); + +guarded.openapi(pairRoute, (c) => { + const instance = c.get("instance"); + return c.json( + { + success: true as const, + message: `Pair code retrieved successfully`, + data: instance.pairCode, + }, + 200, + ); +}); + +guarded.openapi(updateRoute, async (c) => { + const body = c.req.valid("json"); + const instance = c.get("instance"); + + try { + await instance.setOptions(body); + return c.json( + { + success: true as const, + message: `Connection updated successfully`, + }, + 200, + ); + } catch (err) { + const error = getError(err); + // TODO: Should use a more deterministic approach + const code = error.message.includes("already exists") ? 400 : 500; + + return c.json( + { + success: false as const, + error: serializeError(err), + }, + code, + ); + } +}); + +guarded.openapi(deleteRoute, async (c) => { + const instance = c.get("instance"); + + try { + await instance.destroy(); + return c.json( + { + success: true as const, + message: `Connection deleted successfully`, + }, + 200, + ); + } catch (err) { + return c.json( + { + success: false as const, + error: serializeError(err), + }, + 500, + ); + } +}); + +app.openapi(eventsRoute, async (c) => { + return streamSSE(c, async (stream) => { + async function handler(data: Events) { + await stream.writeSSE({ data: JSON.stringify(data) }); + } + + eventEmitter.on("event", handler); + await new Promise((resolve) => { + c.req.raw.signal.addEventListener("abort", () => { + eventEmitter.off("event", handler); + resolve(); + }); + }); + }); +}); + +app.route("/", guarded); + +export { app as connectionRoutes }; diff --git a/src/routes/connections/list.ts b/src/routes/connections/list.ts new file mode 100644 index 00000000..8e207348 --- /dev/null +++ b/src/routes/connections/list.ts @@ -0,0 +1,50 @@ +import { createRoute, z } from "@hono/zod-openapi"; +import { + successResponseSchema as baseSuccessResponseSchema, + errorResponseSchema, + paginationSchema, +} from "~/lib/validation"; +import { connectionSchema } from "./find"; + +const successResponseSchema = baseSuccessResponseSchema.extend({ + data: z.array(connectionSchema), + cursor: paginationSchema.shape.cursor, +}); + +export const route = createRoute({ + tags: ["Connections"], + summary: "List all connections", + description: + "Retrieve a list of saved connections in cursor-based pagination format", + method: "get", + path: "/", + request: { + query: paginationSchema, + }, + responses: { + 200: { + description: "Connections list retrieved successfully", + content: { + "application/json": { + schema: successResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request parameters", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + }, +}); diff --git a/src/routes/connections/pair.ts b/src/routes/connections/pair.ts new file mode 100644 index 00000000..e22859aa --- /dev/null +++ b/src/routes/connections/pair.ts @@ -0,0 +1,50 @@ +import { createRoute } from "@hono/zod-openapi"; +import { errorResponseSchema } from "~/lib/validation"; +import { findConnectionParamsSchema } from "./find"; +import { connectionQrSuccessResponseSchema } from "./qr"; + +export const route = createRoute({ + tags: ["Connections"], + summary: "Pair code for connection", + description: + "Retrieve the pair code for a connection to authenticate your device. Although this works, it is always recommended to use the Server-Sent Events (SSE) endpoint, especially when building a real-time UI. Streaming approaches are more efficient and reliable", + method: "get", + path: "/{name}/pair", + request: { + params: findConnectionParamsSchema, + }, + responses: { + 200: { + description: "Pair code retrieved successfully", + content: { + "application/json": { + schema: connectionQrSuccessResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request parameters", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 404: { + description: "Connection not found", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + }, +}); diff --git a/src/routes/connections/qr.ts b/src/routes/connections/qr.ts new file mode 100644 index 00000000..b6cb1e01 --- /dev/null +++ b/src/routes/connections/qr.ts @@ -0,0 +1,53 @@ +import { createRoute, z } from "@hono/zod-openapi"; +import { errorResponseSchema, successResponseSchema } from "~/lib/validation"; +import { findConnectionParamsSchema } from "./find"; + +export const connectionQrSuccessResponseSchema = successResponseSchema.extend({ + data: z.string().nullable(), +}); + +export const route = createRoute({ + tags: ["Connections"], + summary: "QR Code for connection", + description: + "Retrieve the QR code for a connection to authenticate your device. Although this works, it is always recommended to use the Server-Sent Events (SSE) endpoint, especially when building a real-time UI. Streaming approaches are more efficient and reliable", + method: "get", + path: "/{name}/qr", + request: { + params: findConnectionParamsSchema, + }, + responses: { + 200: { + description: "QR code retrieved successfully", + content: { + "application/json": { + schema: connectionQrSuccessResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request parameters", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 404: { + description: "Connection not found", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + }, +}); diff --git a/src/routes/connections/update.ts b/src/routes/connections/update.ts new file mode 100644 index 00000000..5640678e --- /dev/null +++ b/src/routes/connections/update.ts @@ -0,0 +1,59 @@ +import { createRoute } from "@hono/zod-openapi"; +import { errorResponseSchema, successResponseSchema } from "~/lib/validation"; +import { createConnectionBodySchema } from "./create"; +import { findConnectionParamsSchema } from "./find"; + +const bodySchema = createConnectionBodySchema.partial(); + +export const route = createRoute({ + tags: ["Connections"], + summary: "Update connection", + description: + "Update an existing connection with the provided options. This will restart the connection", + method: "patch", + path: "/{name}", + request: { + params: findConnectionParamsSchema, + body: { + content: { + "application/json": { + schema: bodySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Connection updated successfully", + content: { + "application/json": { + schema: successResponseSchema, + }, + }, + }, + 400: { + description: "Invalid request parameters", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 404: { + description: "Connection not found", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: errorResponseSchema, + }, + }, + }, + }, +}); diff --git a/src/routes/contacts.ts b/src/routes/contacts.ts deleted file mode 100644 index cf01dd3a..00000000 --- a/src/routes/contacts.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Router } from 'express'; -import { body, query } from 'express-validator'; -import * as controller from '../controllers/contact'; -import requestValidator from '../middlewares/request-validator'; -import sessionValidator from '../middlewares/session-validator'; - -const router = Router({ mergeParams: true }); -router.get( - '/', - query('cursor').isNumeric().optional(), - query('limit').isNumeric().optional(), - requestValidator, - controller.list -); -router.get('/blocklist', sessionValidator, controller.listBlocked); -router.post( - '/blocklist/update', - body('jid').isString().notEmpty(), - body('action').isString().isIn(['block', 'unblock']).optional(), - requestValidator, - sessionValidator, - controller.updateBlock -); -router.get('/:jid', sessionValidator, controller.check); -router.get('/:jid/photo', sessionValidator, controller.photo); - -export default router; diff --git a/src/routes/groups.ts b/src/routes/groups.ts deleted file mode 100644 index 8c0f037d..00000000 --- a/src/routes/groups.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Router } from 'express'; -import { query } from 'express-validator'; -import * as controller from '../controllers/group'; -import requestValidator from '../middlewares/request-validator'; -import sessionValidator from '../middlewares/session-validator'; - -const router = Router({ mergeParams: true }); -router.get( - '/', - query('cursor').isNumeric().optional(), - query('limit').isNumeric().optional(), - requestValidator, - controller.list -); -router.get('/:jid', sessionValidator, controller.find); -router.get('/:jid/photo', sessionValidator, controller.photo); - -export default router; diff --git a/src/routes/index.ts b/src/routes/index.ts deleted file mode 100644 index 08b845fb..00000000 --- a/src/routes/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Router } from 'express'; -import chatRoutes from './chats'; -import contactRoutes from './contacts'; -import groupRoutes from './groups'; -import messageRoutes from './messages'; -import sessionRoutes from './sessions'; - -const router = Router(); -router.use('/sessions', sessionRoutes); -router.use('/:sessionId/chats', chatRoutes); -router.use('/:sessionId/contacts', contactRoutes); -router.use('/:sessionId/groups', groupRoutes); -router.use('/:sessionId/messages', messageRoutes); - -export default router; diff --git a/src/routes/messages.ts b/src/routes/messages.ts deleted file mode 100644 index 29ffc526..00000000 --- a/src/routes/messages.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Router } from 'express'; -import { body, query } from 'express-validator'; -import * as controller from '../controllers/message'; -import requestValidator from '../middlewares/request-validator'; -import sessionValidator from '../middlewares/session-validator'; - -const router = Router({ mergeParams: true }); -router.get( - '/', - query('cursor').isNumeric().optional(), - query('limit').isNumeric().optional(), - requestValidator, - controller.list -); -router.post( - '/send', - body('jid').isString().notEmpty(), - body('type').isString().isIn(['group', 'number']).optional(), - body('message').isObject().notEmpty(), - body('options').isObject().optional(), - requestValidator, - sessionValidator, - controller.send -); -router.post( - '/send/bulk', - body().isArray().notEmpty(), - requestValidator, - sessionValidator, - controller.sendBulk -); -router.post( - '/download', - body().isObject().notEmpty(), - requestValidator, - sessionValidator, - controller.download -); - -export default router; diff --git a/src/routes/messages/index.ts b/src/routes/messages/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/routes/sessions.ts b/src/routes/sessions.ts deleted file mode 100644 index 3dd3cbad..00000000 --- a/src/routes/sessions.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Router } from 'express'; -import { body } from 'express-validator'; -import * as controller from '../controllers/session'; -import requestValidator from '../middlewares/request-validator'; -import sessionValidator from '../middlewares/session-validator'; - -const router = Router(); -router.get('/', controller.list); -router.get('/:sessionId', sessionValidator, controller.find); -router.get('/:sessionId/status', sessionValidator, controller.status); -router.post('/add', body('sessionId').isString().notEmpty(), requestValidator, controller.add); -router.get('/:sessionId/add-sse', controller.addSSE); -router.delete('/:sessionId', sessionValidator, controller.del); - -export default router; diff --git a/src/shared.ts b/src/shared.ts deleted file mode 100644 index a5bd2759..00000000 --- a/src/shared.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import pino from 'pino'; - -export const prisma = new PrismaClient(); -export const logger = pino({ level: process.env.LOG_LEVEL || 'debug' }); diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index 98eaa4f5..00000000 --- a/src/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function delay(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} diff --git a/src/wa.ts b/src/wa.ts deleted file mode 100644 index c2fc71f0..00000000 --- a/src/wa.ts +++ /dev/null @@ -1,256 +0,0 @@ -import type { ConnectionState, proto, SocketConfig, WASocket } from '@adiwajshing/baileys'; -import makeWASocket, { - Browsers, - DisconnectReason, - isJidBroadcast, - makeCacheableSignalKeyStore, -} from '@adiwajshing/baileys'; -import type { Boom } from '@hapi/boom'; -import { initStore, Store, useSession } from '@ookamiiixd/baileys-store'; -import type { Response } from 'express'; -// import { writeFile } from 'fs/promises'; -// import { join } from 'path'; -import { toDataURL } from 'qrcode'; -import type { WebSocket } from 'ws'; -import { logger, prisma } from './shared'; -import { delay } from './utils'; - -type Session = WASocket & { - destroy: () => Promise; - store: Store; -}; - -const sessions = new Map(); -const retries = new Map(); -const SSEQRGenerations = new Map(); - -const RECONNECT_INTERVAL = Number(process.env.RECONNECT_INTERVAL || 0); -const MAX_RECONNECT_RETRIES = Number(process.env.MAX_RECONNECT_RETRIES || 5); -const SSE_MAX_QR_GENERATION = Number(process.env.SSE_MAX_QR_GENERATION || 5); -const SESSION_CONFIG_ID = 'session-config'; - -export async function init() { - initStore({ prisma, logger }); - const sessions = await prisma.session.findMany({ - select: { sessionId: true, data: true }, - where: { id: { startsWith: SESSION_CONFIG_ID } }, - }); - - for (const { sessionId, data } of sessions) { - const { readIncomingMessages, ...socketConfig } = JSON.parse(data); - createSession({ sessionId, readIncomingMessages, socketConfig }); - } -} - -function shouldReconnect(sessionId: string) { - let attempts = retries.get(sessionId) ?? 0; - - if (attempts < MAX_RECONNECT_RETRIES) { - attempts += 1; - retries.set(sessionId, attempts); - return true; - } - return false; -} - -type createSessionOptions = { - sessionId: string; - res?: Response; - SSE?: boolean; - readIncomingMessages?: boolean; - socketConfig?: SocketConfig; -}; - -export async function createSession(options: createSessionOptions) { - const { sessionId, res, SSE = false, readIncomingMessages = false, socketConfig } = options; - const configID = `${SESSION_CONFIG_ID}-${sessionId}`; - let connectionState: Partial = { connection: 'close' }; - - const destroy = async (logout = true) => { - try { - await Promise.all([ - logout && socket.logout(), - prisma.chat.deleteMany({ where: { sessionId } }), - prisma.contact.deleteMany({ where: { sessionId } }), - prisma.message.deleteMany({ where: { sessionId } }), - prisma.groupMetadata.deleteMany({ where: { sessionId } }), - prisma.session.deleteMany({ where: { sessionId } }), - ]); - } catch (e) { - logger.error(e, 'An error occured during session destroy'); - } finally { - sessions.delete(sessionId); - } - }; - - const handleConnectionClose = () => { - const code = (connectionState.lastDisconnect?.error as Boom)?.output?.statusCode; - const restartRequired = code === DisconnectReason.restartRequired; - const doNotReconnect = !shouldReconnect(sessionId); - - if (code === DisconnectReason.loggedOut || doNotReconnect) { - if (res) { - !SSE && !res.headersSent && res.status(500).json({ error: 'Unable to create session' }); - res.end(); - } - destroy(doNotReconnect); - return; - } - - if (!restartRequired) { - logger.info({ attempts: retries.get(sessionId) ?? 1, sessionId }, 'Reconnecting...'); - } - setTimeout(() => createSession(options), restartRequired ? 0 : RECONNECT_INTERVAL); - }; - - const handleNormalConnectionUpdate = async () => { - if (connectionState.qr?.length) { - if (res && !res.headersSent) { - try { - const qr = await toDataURL(connectionState.qr); - res.status(200).json({ qr }); - return; - } catch (e) { - logger.error(e, 'An error occured during QR generation'); - res.status(500).json({ error: 'Unable to generate QR' }); - } - } - destroy(); - } - }; - - const handleSSEConnectionUpdate = async () => { - let qr: string | undefined = undefined; - if (connectionState.qr?.length) { - try { - qr = await toDataURL(connectionState.qr); - } catch (e) { - logger.error(e, 'An error occured during QR generation'); - } - } - - const currentGenerations = SSEQRGenerations.get(sessionId) ?? 0; - if (!res || res.writableEnded || (qr && currentGenerations >= SSE_MAX_QR_GENERATION)) { - res && !res.writableEnded && res.end(); - destroy(); - return; - } - - const data = { ...connectionState, qr }; - if (qr) SSEQRGenerations.set(sessionId, currentGenerations + 1); - res.write(`data: ${JSON.stringify(data)}\n\n`); - }; - - const handleConnectionUpdate = SSE ? handleSSEConnectionUpdate : handleNormalConnectionUpdate; - const { state, saveCreds } = await useSession(sessionId); - const socket = makeWASocket({ - printQRInTerminal: true, - browser: Browsers.ubuntu('Chrome'), - generateHighQualityLinkPreview: true, - ...socketConfig, - auth: { - creds: state.creds, - keys: makeCacheableSignalKeyStore(state.keys, logger), - }, - logger, - shouldIgnoreJid: (jid) => isJidBroadcast(jid), - getMessage: async (key) => { - const data = await prisma.message.findFirst({ - where: { remoteJid: key.remoteJid!, id: key.id!, sessionId }, - }); - return (data?.message || undefined) as proto.IMessage | undefined; - }, - }); - - const store = new Store(sessionId, socket.ev); - sessions.set(sessionId, { ...socket, destroy, store }); - - socket.ev.on('creds.update', saveCreds); - socket.ev.on('connection.update', (update) => { - connectionState = update; - const { connection } = update; - - if (connection === 'open') { - retries.delete(sessionId); - SSEQRGenerations.delete(sessionId); - } - if (connection === 'close') handleConnectionClose(); - handleConnectionUpdate(); - }); - - if (readIncomingMessages) { - socket.ev.on('messages.upsert', async (m) => { - const message = m.messages[0]; - if (message.key.fromMe || m.type !== 'notify') return; - - await delay(1000); - await socket.readMessages([message.key]); - }); - } - - // Debug events - // socket.ev.on('messaging-history.set', (data) => dump('messaging-history.set', data)); - // socket.ev.on('chats.upsert', (data) => dump('chats.upsert', data)); - // socket.ev.on('contacts.update', (data) => dump('contacts.update', data)); - // socket.ev.on('groups.upsert', (data) => dump('groups.upsert', data)); - - await prisma.session.upsert({ - create: { - id: configID, - sessionId, - data: JSON.stringify({ readIncomingMessages, ...socketConfig }), - }, - update: {}, - where: { sessionId_id: { id: configID, sessionId } }, - }); -} - -export function getSessionStatus(session: Session) { - const state = ['CONNECTING', 'CONNECTED', 'DISCONNECTING', 'DISCONNECTED']; - let status = state[(session.ws as WebSocket).readyState]; - status = session.user ? 'AUTHENTICATED' : status; - return status; -} - -export function listSessions() { - return Array.from(sessions.entries()).map(([id, session]) => ({ - id, - status: getSessionStatus(session), - })); -} - -export function getSession(sessionId: string) { - return sessions.get(sessionId); -} - -export async function deleteSession(sessionId: string) { - sessions.get(sessionId)?.destroy(); -} - -export function sessionExists(sessionId: string) { - return sessions.has(sessionId); -} - -export async function jidExists( - session: Session, - jid: string, - type: 'group' | 'number' = 'number' -) { - try { - if (type === 'number') { - const [result] = await session.onWhatsApp(jid); - return !!result?.exists; - } - - const groupMeta = await session.groupMetadata(jid); - return !!groupMeta.id; - } catch (e) { - return Promise.reject(e); - } -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -// export async function dump(fileName: string, data: any) { -// const path = join(__dirname, '..', 'debug', `${fileName}.json`); -// await writeFile(path, JSON.stringify(data, null, 2)); -// } diff --git a/tsconfig.json b/tsconfig.json index fc5f0785..5d5536ee 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,32 @@ { - "compilerOptions": { - "target": "ES2017", - "module": "CommonJS", - "moduleResolution": "Node", - "strict": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "declaration": false, - "skipLibCheck": true, - "lib": ["ESNext"], - "outDir": "dist/" - }, - "include": ["src/**/*.ts"] + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false, + + "paths": { + "~/*": ["./src/*"] + } + } } diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 99a56454..00000000 --- a/yarn.lock +++ /dev/null @@ -1,2610 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adiwajshing/baileys@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@adiwajshing/baileys/-/baileys-5.0.0.tgz#17a3e48dd67d0f684d09d55fb8fb931345803bb6" - integrity sha512-AeNyYLfw1nhCwc7hDlMajU9Zr5DK4zmEO8rdrmxUR1qUbmhSKOL6IzwZpyvPjsXyHvl+oPMbp5k8+PX2p6RlJg== - dependencies: - "@hapi/boom" "^9.1.3" - axios "^0.24.0" - futoin-hkdf "^1.5.1" - libsignal "git+https://github.com/adiwajshing/libsignal-node" - music-metadata "^7.12.3" - node-cache "^5.1.2" - pino "^7.0.0" - protobufjs "^6.11.3" - ws "^8.0.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint/eslintrc@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@hapi/boom@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-10.0.0.tgz#3624831d0a26b3378423b246f50eacea16e04a08" - integrity sha512-1YVs9tLHhypBqqinKQRqh7FUERIolarQApO37OWkzD+z6y6USi871Sv746zBPKcIOBuI6g6y4FrwX87mmJ90Gg== - dependencies: - "@hapi/hoek" "10.x.x" - -"@hapi/boom@^9.1.3": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" - integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== - dependencies: - "@hapi/hoek" "9.x.x" - -"@hapi/hoek@10.x.x": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-10.0.1.tgz#ee9da297fabc557e1c040a0f44ee89c266ccc306" - integrity sha512-CvlW7jmOhWzuqOqiJQ3rQVLMcREh0eel4IBnxDx2FAcK8g7qoJRQK4L1CPBASoCY6y8e6zuCy3f2g+HWdkzcMw== - -"@hapi/hoek@9.x.x": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@ookamiiixd/baileys-store@^1.0.0-beta.0": - version "1.0.0-beta.0" - resolved "https://registry.yarnpkg.com/@ookamiiixd/baileys-store/-/baileys-store-1.0.0-beta.0.tgz#1a2a5b2e0edd75c00d68a60c72bdf856dbc881e1" - integrity sha512-djOZUZLRtjEcoy8qt/wjuT7WNLh54CfZ0v1/f1g298kRvnDKLxSKuu1I/6hdTntPMyCoir95xQA/HTBbyCXheA== - dependencies: - tiny-invariant "^1.3.1" - -"@prisma/client@^4.7.1": - version "4.7.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.7.1.tgz#66fe84aca25de17cb3d9141dec003f34714914b9" - integrity sha512-/GbnOwIPtjiveZNUzGXOdp7RxTEkHL4DZP3vBaFNadfr6Sf0RshU5EULFzVaSi9i9PIK9PYd+1Rn7z2B2npb9w== - dependencies: - "@prisma/engines-version" "4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c" - -"@prisma/engines-version@4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c": - version "4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c.tgz#43ff7d85478e64a1d790e4d53e78768a2acfacfe" - integrity sha512-Bd4LZ+WAnUHOq31e9X/ihi5zPlr4SzTRwUZZYxvWOxlerIZ7HJlVa9zXpuKTKLpI9O1l8Ec4OYCKsivWCs5a3Q== - -"@prisma/engines@4.7.1": - version "4.7.1" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.7.1.tgz#d657d4d05724158140022fa00614e143643090c2" - integrity sha512-zWabHosTdLpXXlMefHmnouhXMoTB1+SCbUU3t4FCmdrtIOZcarPKU3Alto7gm/pZ9vHlGOXHCfVZ1G7OIrSbog== - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@tokenizer/token@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" - integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/cors@^2.8.13": - version "2.8.13" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" - integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.18": - version "4.17.31" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@^4.17.14": - version "4.17.14" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" - integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/long@^4.0.0", "@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/node@*", "@types/node@>=13.7.0", "@types/node@^18.11.10": - version "18.11.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.11.tgz#1d455ac0211549a8409d3cdb371cd55cc971e8dc" - integrity sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g== - -"@types/node@^10.1.0": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - -"@types/qrcode@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.5.0.tgz#6a98fe9a9a7b2a9a3167b6dde17eff999eabe40b" - integrity sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA== - dependencies: - "@types/node" "*" - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - -"@types/serve-static@*": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/ws@^8.5.3": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== - dependencies: - "@types/node" "*" - -"@typescript-eslint/eslint-plugin@^5.45.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz#9a96a713b9616c783501a3c1774c9e2b40217ad0" - integrity sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q== - dependencies: - "@typescript-eslint/scope-manager" "5.46.0" - "@typescript-eslint/type-utils" "5.46.0" - "@typescript-eslint/utils" "5.46.0" - debug "^4.3.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.45.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.46.0.tgz#002d8e67122947922a62547acfed3347cbf2c0b6" - integrity sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA== - dependencies: - "@typescript-eslint/scope-manager" "5.46.0" - "@typescript-eslint/types" "5.46.0" - "@typescript-eslint/typescript-estree" "5.46.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz#60790b14d0c687dd633b22b8121374764f76ce0d" - integrity sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA== - dependencies: - "@typescript-eslint/types" "5.46.0" - "@typescript-eslint/visitor-keys" "5.46.0" - -"@typescript-eslint/type-utils@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz#3a4507b3b437e2fd9e95c3e5eea5ae16f79d64b3" - integrity sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg== - dependencies: - "@typescript-eslint/typescript-estree" "5.46.0" - "@typescript-eslint/utils" "5.46.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.46.0.tgz#f4d76622a996b88153bbd829ea9ccb9f7a5d28bc" - integrity sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw== - -"@typescript-eslint/typescript-estree@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz#a6c2b84b9351f78209a1d1f2d99ca553f7fa29a5" - integrity sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw== - dependencies: - "@typescript-eslint/types" "5.46.0" - "@typescript-eslint/visitor-keys" "5.46.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.46.0.tgz#600cd873ba471b7d8b0b9f35de34cf852c6fcb31" - integrity sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.46.0" - "@typescript-eslint/types" "5.46.0" - "@typescript-eslint/typescript-estree" "5.46.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.46.0": - version "5.46.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz#36d87248ae20c61ef72404bcd61f14aa2563915f" - integrity sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw== - dependencies: - "@typescript-eslint/types" "5.46.0" - eslint-visitor-keys "^3.3.0" - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1, acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -atomic-sleep@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" - integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== - -axios@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" - integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== - dependencies: - follow-redirects "^1.14.4" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - 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.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@1.0.0-rc.11: - version "1.0.0-rc.11" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.11.tgz#1be84be1a126958366bcc57a11648cd9b30a60c2" - integrity sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - tslib "^2.4.0" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -clone@2.x: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@^1.0.4, content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -curve25519-js@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/curve25519-js/-/curve25519-js-0.0.4.tgz#e6ad967e8cd284590d657bbfc90d8b50e49ba060" - integrity sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-libc@^2.0.0, detect-libc@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dijkstrajs@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" - integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - -dotenv@^16.0.3: - version "16.0.3" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" - integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== - -duplexify@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" - integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== - dependencies: - end-of-stream "^1.4.1" - inherits "^2.0.3" - readable-stream "^3.1.1" - stream-shift "^1.0.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encode-utf8@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" - integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.29.0: - version "8.29.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.29.0.tgz#d74a88a20fb44d59c51851625bc4ee8d0ec43f87" - integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg== - dependencies: - "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.11.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.15.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-sdsl "^4.1.4" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -express-validator@^6.14.2: - version "6.14.2" - resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-6.14.2.tgz#6147893f7bec0e14162c3a88b3653121afc4678f" - integrity sha512-8XfAUrQ6Y7dIIuy9KcUPCfG/uCbvREctrxf5EeeME+ulanJ4iiW71lWmm9r4YcKKYOCBMan0WpVg7FtHu4Z4Wg== - dependencies: - lodash "^4.17.21" - validator "^13.7.0" - -express@^4.18.2: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - 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.11.0" - 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" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-redact@^3.0.0, fast-redact@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" - integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw== - -fastq@^1.6.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" - integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-type@^16.5.4: - version "16.5.4" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz#474fb4f704bee427681f98dd390058a172a6c2fd" - integrity sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw== - dependencies: - readable-web-to-node-stream "^3.0.0" - strtok3 "^6.2.4" - token-types "^4.1.1" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.14.4: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -futoin-hkdf@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz#141f00427bc9950b38a42aa786b99c318b9b688d" - integrity sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.15.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -"libsignal@git+https://github.com/adiwajshing/libsignal-node": - version "2.0.1" - resolved "git+https://github.com/adiwajshing/libsignal-node#11dbd962ea108187c79a7c46fe4d6f790e23da97" - dependencies: - curve25519-js "^0.0.4" - protobufjs "6.8.8" - -link-preview-js@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/link-preview-js/-/link-preview-js-3.0.4.tgz#1e053f80ee20ef50d03e6742dc30dc8487112653" - integrity sha512-xsuxMigAZd4xmj6BIwMNuQjjpJdh0DWeIo1NXQgaoWSi9Z/dzz/Kxy6vzzsUonFlMTPJ1i0EC8aeOg/xrOMidg== - dependencies: - abort-controller "^3.0.0" - cheerio "1.0.0-rc.11" - cross-fetch "3.1.5" - url "0.11.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -media-typer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" - integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.3: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -music-metadata@^7.12.3: - version "7.13.0" - resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-7.13.0.tgz#796415621f274e17f5ec04d7224d5503f18157ef" - integrity sha512-EoDmAoK84Z9xarNEgjE7YQ4x7cIwHI9kOI3RdA2QlEHCsqBvBuBbIcP3vONGO/SBiPhXe5FF+IVAW+1T2owjEA== - dependencies: - "@tokenizer/token" "^0.3.0" - content-type "^1.0.4" - debug "^4.3.4" - file-type "^16.5.4" - media-typer "^1.1.0" - strtok3 "^6.3.0" - token-types "^4.2.1" - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -node-abi@^3.3.0: - version "3.30.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.30.0.tgz#d84687ad5d24ca81cdfa912a36f2c5c19b137359" - integrity sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw== - dependencies: - semver "^7.3.5" - -node-addon-api@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" - integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== - -node-cache@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-5.1.2.tgz#f264dc2ccad0a780e76253a694e9fd0ed19c398d" - integrity sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg== - dependencies: - clone "2.x" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -on-exit-leak-free@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" - integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== - -on-exit-leak-free@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" - integrity sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -peek-readable@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72" - integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pino-abstract-transport@v0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" - integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== - dependencies: - duplexify "^4.1.2" - split2 "^4.0.0" - -pino-abstract-transport@v1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz#cc0d6955fffcadb91b7b49ef220a6cc111d48bb3" - integrity sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA== - dependencies: - readable-stream "^4.0.0" - split2 "^4.0.0" - -pino-std-serializers@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" - integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== - -pino-std-serializers@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz#4c20928a1bafca122fdc2a7a4a171ca1c5f9c526" - integrity sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ== - -pino@^7.0.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" - integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== - dependencies: - atomic-sleep "^1.0.0" - fast-redact "^3.0.0" - on-exit-leak-free "^0.2.0" - pino-abstract-transport v0.5.0 - pino-std-serializers "^4.0.0" - process-warning "^1.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.1.0" - safe-stable-stringify "^2.1.0" - sonic-boom "^2.2.1" - thread-stream "^0.15.1" - -pino@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-8.7.0.tgz#58621608a3d8540ae643cdd9194cdd94130c78d9" - integrity sha512-l9sA5uPxmZzwydhMWUcm1gI0YxNnYl8MfSr2h8cwLvOAzQLBLewzF247h/vqHe3/tt6fgtXeG9wdjjoetdI/vA== - dependencies: - atomic-sleep "^1.0.0" - fast-redact "^3.1.1" - on-exit-leak-free "^2.1.0" - pino-abstract-transport v1.0.0 - pino-std-serializers "^6.0.0" - process-warning "^2.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.2.0" - safe-stable-stringify "^2.3.1" - sonic-boom "^3.1.0" - thread-stream "^2.0.0" - -pngjs@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" - integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== - -prebuild-install@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-plugin-organize-imports@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.1.tgz#7e0e0a18457e0166e740daaff1aed1c08069fcb9" - integrity sha512-bty7C2Ecard5EOXirtzeCAqj4FU4epeuWrQt/Z+sh8UVEpBlBZ3m3KNPz2kFu7KgRTQx/C9o4/TdquPD1jOqjQ== - -prettier@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" - integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== - -prisma@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.7.1.tgz#0a1beac26abdc4421e496b75eb50413f3ee3b0ba" - integrity sha512-CCQP+m+1qZOGIZlvnL6T3ZwaU0LAleIHYFPN9tFSzjs/KL6vH9rlYbGOkTuG9Q1s6Ki5D0LJlYlW18Z9EBUpGg== - dependencies: - "@prisma/engines" "4.7.1" - -process-warning@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" - integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== - -process-warning@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.1.0.tgz#1e60e3bfe8183033bbc1e702c2da74f099422d1a" - integrity sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -protobufjs@6.8.8: - version "6.8.8" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" - integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - "@types/node" "^10.1.0" - long "^4.0.0" - -protobufjs@^6.11.3: - version "6.11.3" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" - integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qrcode-terminal@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" - integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== - -qrcode@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" - integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== - dependencies: - dijkstrajs "^1.0.1" - encode-utf8 "^1.0.3" - pngjs "^5.0.0" - yargs "^15.3.1" - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-format-unescaped@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" - integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.2.0.tgz#a7ef523d3b39e4962b0db1a1af22777b10eeca46" - integrity sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - -readable-web-to-node-stream@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" - integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== - dependencies: - readable-stream "^3.6.0" - -real-require@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" - integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== - -real-require@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" - integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.3.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61" - integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^7.3.5, semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sharp@^0.30.5: - version "0.30.7" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.30.7.tgz#7862bda98804fdd1f0d5659c85e3324b90d94c7c" - integrity sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig== - dependencies: - color "^4.2.3" - detect-libc "^2.0.1" - node-addon-api "^5.0.0" - prebuild-install "^7.1.1" - semver "^7.3.7" - simple-get "^4.0.1" - tar-fs "^2.1.1" - tunnel-agent "^0.6.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0, simple-get@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sonic-boom@^2.2.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" - integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== - dependencies: - atomic-sleep "^1.0.0" - -sonic-boom@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.2.1.tgz#972ceab831b5840a08a002fa95a672008bda1c38" - integrity sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A== - dependencies: - atomic-sleep "^1.0.0" - -split2@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" - integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strtok3@^6.2.4, strtok3@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0" - integrity sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw== - dependencies: - "@tokenizer/token" "^0.3.0" - peek-readable "^4.1.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tar-fs@^2.0.0, tar-fs@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thread-stream@^0.15.1: - version "0.15.2" - resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" - integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== - dependencies: - real-require "^0.1.0" - -thread-stream@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.2.0.tgz#310c03a253f729094ce5d4638ef5186dfa80a9e8" - integrity sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ== - dependencies: - real-require "^0.2.0" - -tiny-invariant@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -token-types@^4.1.1, token-types@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.1.tgz#0f897f03665846982806e138977dbe72d44df753" - integrity sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ== - dependencies: - "@tokenizer/token" "^0.3.0" - ieee754 "^1.2.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typescript@^4.9.3: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -validator@^13.7.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" - integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@^8.0.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^15.3.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==