From 0417c1906641cea173ea89de647e79fbde9243e8 Mon Sep 17 00:00:00 2001 From: Jakub Sydor Date: Mon, 25 Apr 2022 18:27:25 +0200 Subject: [PATCH] feat: add `decentralized-web-node` app --- .github/workflows/deploy.yml | 2 +- .github/workflows/main.yml | 22 +- apps/decentralized-web-node/.env.dev | 17 + apps/decentralized-web-node/.gitignore | 46 + apps/decentralized-web-node/.sentryclirc | 3 + apps/decentralized-web-node/README.md | 58 + apps/decentralized-web-node/nest-cli.json | 4 + apps/decentralized-web-node/package.json | 108 + apps/decentralized-web-node/src/app.module.ts | 29 + .../src/common/test.utils.ts | 12 + .../src/config/database.config.ts | 42 + apps/decentralized-web-node/src/main.ts | 66 + .../1649246690092-AddMessageTable.ts | 15 + ...ntralized-web-node-response.interceptor.ts | 51 + .../decentralized-web-node.controller.ts | 40 + .../decentralized-web-node.module.ts | 15 + .../dtos/collections-query-descriptor.dto.ts | 47 + .../dtos/collections-write-descriptor.dto.ts | 50 + .../dtos/message.dto.ts | 54 + .../dtos/request-object.dto.ts | 19 + .../dtos/response-object.dto.ts | 26 + .../dtos/response-reply.dto.ts | 20 + .../dtos/response-status.dto.ts | 12 + .../collections-write-message.entity.ts | 44 + .../services/handler.service.ts | 125 + .../services/message.service.ts | 96 + .../health-check/health-check.controller.ts | 26 + .../health-check/health-check.module.ts | 11 + .../health-check/health-check.service.ts | 18 + .../interceptors/interceptors.module.ts | 10 + .../interceptors/sentry-error-interceptor.ts | 31 + .../src/modules/logger/logger.module.ts | 11 + .../src/modules/logger/logger.service.ts | 88 + .../presentation-exchange/dtos/checked.dto.ts | 13 + .../dtos/constraint.dto.ts | 18 + .../presentation-exchange/dtos/field.dto.ts | 27 + .../presentation-exchange/dtos/filter.dto.ts | 137 + .../dtos/input-descriptor.dto.ts | 32 + .../dtos/match-results.dto.ts | 24 + .../dtos/presentation-definition.dto.ts | 31 + .../dtos/submission-requirement-match.dto.ts | 28 + .../presentation-exchange.controller.ts | 25 + .../presentation-exchange.module.ts | 11 + .../services/vc-match.service.ts | 58 + .../src/modules/sentry/sentry.module.ts | 11 + .../src/modules/sentry/sentry.service.ts | 132 + .../fixtures/valid-vc.ts | 88 + .../query-message.e2e-spec.ts | 290 + .../test/decentralized-web-node/utils.ts | 67 + .../write-message.e2e-spec.ts | 214 + .../decentralized-web-node/test/jest-e2e.json | 9 + .../utils/add-credential.ts | 24 + .../utils/get-credential.ts | 36 + .../vc-match.e2e-spec.ts | 319 ++ apps/decentralized-web-node/test/utils.ts | 14 + .../tsconfig.build.json | 9 + apps/decentralized-web-node/tsconfig.json | 19 + common/config/rush/pnpm-lock.yaml | 4976 ++++++++++++++--- docker-compose.dev.yml | 17 + docker/dwn/Dockerfile | 19 + docker/dwn/Dockerfile.dev | 20 + Dockerfile => docker/vc-api/Dockerfile | 4 +- rush.json | 4 + 63 files changed, 7223 insertions(+), 671 deletions(-) create mode 100644 apps/decentralized-web-node/.env.dev create mode 100644 apps/decentralized-web-node/.gitignore create mode 100644 apps/decentralized-web-node/.sentryclirc create mode 100644 apps/decentralized-web-node/README.md create mode 100644 apps/decentralized-web-node/nest-cli.json create mode 100644 apps/decentralized-web-node/package.json create mode 100644 apps/decentralized-web-node/src/app.module.ts create mode 100644 apps/decentralized-web-node/src/common/test.utils.ts create mode 100644 apps/decentralized-web-node/src/config/database.config.ts create mode 100644 apps/decentralized-web-node/src/main.ts create mode 100644 apps/decentralized-web-node/src/migrations/1649246690092-AddMessageTable.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node-response.interceptor.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node.controller.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node.module.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/collections-query-descriptor.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/collections-write-descriptor.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/message.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/request-object.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-object.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-reply.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-status.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/entities/collections-write-message.entity.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/services/handler.service.ts create mode 100644 apps/decentralized-web-node/src/modules/decentralized-web-node/services/message.service.ts create mode 100644 apps/decentralized-web-node/src/modules/health-check/health-check.controller.ts create mode 100644 apps/decentralized-web-node/src/modules/health-check/health-check.module.ts create mode 100644 apps/decentralized-web-node/src/modules/health-check/health-check.service.ts create mode 100644 apps/decentralized-web-node/src/modules/interceptors/interceptors.module.ts create mode 100644 apps/decentralized-web-node/src/modules/interceptors/sentry-error-interceptor.ts create mode 100644 apps/decentralized-web-node/src/modules/logger/logger.module.ts create mode 100644 apps/decentralized-web-node/src/modules/logger/logger.service.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/dtos/checked.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/dtos/constraint.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/dtos/field.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/dtos/filter.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/dtos/input-descriptor.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/dtos/match-results.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/dtos/presentation-definition.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/dtos/submission-requirement-match.dto.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/presentation-exchange.controller.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/presentation-exchange.module.ts create mode 100644 apps/decentralized-web-node/src/modules/presentation-exchange/services/vc-match.service.ts create mode 100644 apps/decentralized-web-node/src/modules/sentry/sentry.module.ts create mode 100644 apps/decentralized-web-node/src/modules/sentry/sentry.service.ts create mode 100644 apps/decentralized-web-node/test/decentralized-web-node/fixtures/valid-vc.ts create mode 100644 apps/decentralized-web-node/test/decentralized-web-node/query-message.e2e-spec.ts create mode 100644 apps/decentralized-web-node/test/decentralized-web-node/utils.ts create mode 100644 apps/decentralized-web-node/test/decentralized-web-node/write-message.e2e-spec.ts create mode 100644 apps/decentralized-web-node/test/jest-e2e.json create mode 100644 apps/decentralized-web-node/test/presentation-exchange/utils/add-credential.ts create mode 100644 apps/decentralized-web-node/test/presentation-exchange/utils/get-credential.ts create mode 100644 apps/decentralized-web-node/test/presentation-exchange/vc-match.e2e-spec.ts create mode 100644 apps/decentralized-web-node/test/utils.ts create mode 100644 apps/decentralized-web-node/tsconfig.build.json create mode 100644 apps/decentralized-web-node/tsconfig.json create mode 100644 docker-compose.dev.yml create mode 100644 docker/dwn/Dockerfile create mode 100644 docker/dwn/Dockerfile.dev rename Dockerfile => docker/vc-api/Dockerfile (84%) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 72173796..98e65ba3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -78,7 +78,7 @@ jobs: BUILD_ID: ${{ steps.tag_version.outputs.new_tag }} ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} run: | - docker build -t $ECR_REGISTRY/${{ steps.env_vars.outputs.aws_ecr_repository }}:$BUILD_ID -f Dockerfile . + docker build -t $ECR_REGISTRY/${{ steps.env_vars.outputs.aws_ecr_repository }}:$BUILD_ID -f docker/vc-api/Dockerfile . docker push $ECR_REGISTRY/${{ steps.env_vars.outputs.aws_ecr_repository }}:$BUILD_ID - name: Logout of Amazon ECR if: always() diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f720c634..f4f7c0a4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,10 +1,20 @@ -name: CI +name: Test on: push: jobs: build-and-test: + services: + postgres: + image: postgres:12 + env: + POSTGRES_USER: user-test + POSTGRES_DB: dev-test + POSTGRES_PASSWORD: password-test + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -12,7 +22,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v2 with: - node-version: '14' + node-version: '16.10.0' - name: Rush install run: node common/scripts/install-run-rush.js install @@ -21,4 +31,12 @@ jobs: run: node common/scripts/install-run-rush.js build --verbose - name: Run test + env: + CI: true + NESTJS_PORT: 3000 + DB_HOST: localhost + DB_PORT: 5432 + DB_USERNAME: user-test + DB_PASSWORD: password-test + DB_NAME: dev-test run: node common/scripts/install-run-rush.js test --verbose diff --git a/apps/decentralized-web-node/.env.dev b/apps/decentralized-web-node/.env.dev new file mode 100644 index 00000000..77b8feeb --- /dev/null +++ b/apps/decentralized-web-node/.env.dev @@ -0,0 +1,17 @@ +# NESTJS CONFIG +NESTJS_PORT=3000 + +# DB Config +DB_HOST=postgres +DB_PORT=5432 +DB_USERNAME=postgres +DB_PASSWORD=password +DB_NAME=dev-test + +# SENTRY CONFIG +SENTRY_DNS= +SENTRY_ENV= +SENTRY_RELEASE= + +# LOGS CONFIG +LOGS_DIRECTORY=logs diff --git a/apps/decentralized-web-node/.gitignore b/apps/decentralized-web-node/.gitignore new file mode 100644 index 00000000..6973ae02 --- /dev/null +++ b/apps/decentralized-web-node/.gitignore @@ -0,0 +1,46 @@ +# compiled output +/dist +/node_modules +/src/ethers +.env + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +*-audit.json + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +.env + +# Using either dev or prod docker-compose file +docker-compose.yml +db_dumps +ormconfig.json +private.pem +public.pem diff --git a/apps/decentralized-web-node/.sentryclirc b/apps/decentralized-web-node/.sentryclirc new file mode 100644 index 00000000..3aae2e25 --- /dev/null +++ b/apps/decentralized-web-node/.sentryclirc @@ -0,0 +1,3 @@ +[defaults] +project=ssi-dwn +org=energy-web diff --git a/apps/decentralized-web-node/README.md b/apps/decentralized-web-node/README.md new file mode 100644 index 00000000..a9867de3 --- /dev/null +++ b/apps/decentralized-web-node/README.md @@ -0,0 +1,58 @@ +# SSI Decentralized Web Node + +## Description + +This [ssi-dwn](./apps/decentralized-web-node) is a NestJs implementation of the [DIF Identity foundation](https://identity.foundation/) [Decentralized Web Node](https://identity.foundation/decentralized-web-node/spec/). +[Nest](https://github.com/nestjs/nest) is a Typescript framework for server-side applications. + +## Installation + +Install using the [rush commands](../../README.md#installation) described in the root README. + +## Running the app + +Alternatively to `npm`, `pnpm` can be used for the commands below. + +```bash +# development +$ npm run start + +# watch mode +$ npm run start:dev + +# production mode +$ npm run start:prod +``` +### Swagger/OpenAPI + +After starting the `ssi-dwn` app, +the Swagger/OpenAPI test page can be see at `{appURL}/api` (`http://localhost:3000/api` if running locally) + +## Test + +Alternatively to `npm`, `pnpm` can be used for the commands below. + +```bash +# e2e tests +$ npm run test + +# test coverage +$ npm run test:cov +``` + +### Decentralized web node Module +An implementation of the [Decentralized Web Node](https://identity.foundation/decentralized-web-node/spec/). Currently it's acting as a Verifiable Credential Storage. + +### Presentation exchange Module +Module is responsible for matching Verifiable Credentials to given presentation definition. Credentials are taken from +decentralized web node module. +## Database +Currently, the app uses an **PostgreSQL** database for app execution and tests. + +## Auth +All endpoints are requiring authentication. Request must contain `token` cookies which contain identity token that can be obtain from [SSI Hub](https://github.com/energywebfoundation/ssi-hub). + +## License + +This project is licensed under the GNU General Public License v3.0 or later - see the [LICENSE](LICENSE) file for details +NestJs is [MIT licensed](LICENSE). diff --git a/apps/decentralized-web-node/nest-cli.json b/apps/decentralized-web-node/nest-cli.json new file mode 100644 index 00000000..56167b36 --- /dev/null +++ b/apps/decentralized-web-node/nest-cli.json @@ -0,0 +1,4 @@ +{ + "collection": "@nestjs/schematics", + "sourceRoot": "src" +} diff --git a/apps/decentralized-web-node/package.json b/apps/decentralized-web-node/package.json new file mode 100644 index 00000000..d0a0581c --- /dev/null +++ b/apps/decentralized-web-node/package.json @@ -0,0 +1,108 @@ +{ + "name": "@energyweb/ssi-dwn", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/src/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "npm run test:e2e", + "test:unit": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@ew-did-registry/credentials-interface": "^0.6.3-alpha.531.0", + "@nestjs/axios": "0.0.7", + "@nestjs/common": "^8.0.6", + "@nestjs/config": "^1.0.1", + "@nestjs/core": "^8.0.6", + "@nestjs/jwt": "^8.0.0", + "@nestjs/passport": "^8.1.0", + "@nestjs/platform-express": "^8.0.6", + "@nestjs/swagger": "^5.0.9", + "@nestjs/terminus": "^8.0.1", + "@nestjs/typeorm": "^8.0.2", + "@sentry/integrations": "^6.2.2", + "@sentry/node": "^6.16.1", + "@sentry/tracing": "^6.16.1", + "@sentry/types": "^6.2.2", + "@sphereon/pex": "^1.0.2", + "@types/passport": "^1.0.7", + "class-transformer": "^0.5.0", + "class-validator": "^0.13.0", + "compression": "^1.7.4", + "cookie-parser": "^1.4.5", + "dotenv": "^10.0.0", + "express": "^4.18.0", + "helmet": "^4.4.1", + "multiformats": "^9.6.4", + "passport": "^0.5.2", + "passport-jwt": "^4.0.0", + "pg": "^8.5.1", + "redact-pii": "^3.2.3", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.3.0", + "swagger-ui-express": "^4.1.4", + "typeorm": "^0.2.41", + "uuid": "^8.3.2", + "winston": "^3.3.3", + "winston-daily-rotate-file": "^4.5.0" + }, + "devDependencies": { + "@types/jsonwebtoken": "^8.5.8", + "@energyweb/eslint-config": "^0.0.2", + "@energyweb/prettier-config": "^0.0.1", + "@nestjs/cli": "^7.5.6", + "@nestjs/schematics": "^7.2.9", + "@nestjs/testing": "^8.0.6", + "@types/compression": "^1.7.0", + "@types/cookie-parser": "^1.4.2", + "@types/express": "^4.17.3", + "@types/jest": "27.4.1", + "@types/node": "^13.9.1", + "@types/passport-jwt": "^3.0.3", + "@types/supertest": "^2.0.8", + "@types/uuid": "^8.3.0", + "@typescript-eslint/eslint-plugin": "^5.9.1", + "@typescript-eslint/parser": "^5.9.1", + "base64url": "^3.0.1", + "ethers": "^5.6.1", + "eslint": "^8.6.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", + "jest": "27.5.1", + "jsonwebtoken": "^8.5.1", + "npm-run-all": "^4.1.5", + "prettier": "^2.5.1", + "rimraf": "^3.0.2", + "supertest": "^4.0.2", + "ts-jest": "27.1.4", + "ts-loader": "^6.2.1", + "ts-node": "^9.0.0", + "typedoc": "^0.22.0", + "typedoc-plugin-markdown": "^3.11.0", + "typescript": "^4.3.5" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "testEnvironment": "node" + } +} diff --git a/apps/decentralized-web-node/src/app.module.ts b/apps/decentralized-web-node/src/app.module.ts new file mode 100644 index 00000000..4e75f915 --- /dev/null +++ b/apps/decentralized-web-node/src/app.module.ts @@ -0,0 +1,29 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { LoggerModule } from './modules/logger/logger.module'; +import { SentryModule } from './modules/sentry/sentry.module'; +import { InterceptorsModule } from './modules/interceptors/interceptors.module'; +import { HealthCheckModule } from './modules/health-check/health-check.module'; +import { DecentralizedWebNodeModule } from './modules/decentralized-web-node/decentralized-web-node.module'; +import { PresentationExchangeModule } from './modules/presentation-exchange/presentation-exchange.module'; +import { getDBConfig } from './config/database.config'; + +@Module({ + imports: [ + TypeOrmModule.forRootAsync({ + inject: [ConfigService], + useFactory: getDBConfig + }), + ConfigModule.forRoot({ + isGlobal: true + }), + LoggerModule, + SentryModule, + InterceptorsModule, + HealthCheckModule, + DecentralizedWebNodeModule, + PresentationExchangeModule + ] +}) +export class AppModule {} diff --git a/apps/decentralized-web-node/src/common/test.utils.ts b/apps/decentralized-web-node/src/common/test.utils.ts new file mode 100644 index 00000000..6c4da988 --- /dev/null +++ b/apps/decentralized-web-node/src/common/test.utils.ts @@ -0,0 +1,12 @@ +import { INestApplication, ValidationPipe, VersioningType } from '@nestjs/common'; +import cookieParser from 'cookie-parser'; + +export function appConfig(app: INestApplication) { + app.enableVersioning({ + type: VersioningType.URI + }); + + // add cookie parser to read jwt token cookie + app.use(cookieParser()); + app.useGlobalPipes(new ValidationPipe()); +} diff --git a/apps/decentralized-web-node/src/config/database.config.ts b/apps/decentralized-web-node/src/config/database.config.ts new file mode 100644 index 00000000..8a9f2356 --- /dev/null +++ b/apps/decentralized-web-node/src/config/database.config.ts @@ -0,0 +1,42 @@ +import fs from 'fs'; +import path from 'path'; +import { ConfigService } from '@nestjs/config'; +import { TypeOrmModuleOptions } from '@nestjs/typeorm'; +import { LoggerOptions } from 'typeorm'; + +export const getDBConfig = (configService: ConfigService) => { + const isProduction = configService.get('NODE_ENV') === 'production'; + + const typeormLoggerOptions = configService + .get('TYPEORM_LOGGING', 'error,migration,warn,info') + .split(',') as LoggerOptions; + + const config: TypeOrmModuleOptions = { + type: 'postgres', + host: configService.get('DB_HOST'), + port: +configService.get('DB_PORT'), + username: configService.get('DB_USERNAME'), + password: configService.get('DB_PASSWORD'), + database: configService.get('DB_NAME'), + migrations: [path.join(__dirname + '/..') + '/migrations/**/*{.ts,.js}'], + cli: { migrationsDir: 'src/migrations' }, + migrationsRun: true, + migrationsTableName: 'migrations_iam_cache_server', + logging: typeormLoggerOptions[0] === 'all' ? 'all' : typeormLoggerOptions, + autoLoadEntities: true, + // Options from pool config https://node-postgres.com/api/pool + extra: { + max: configService.get('DB_MAXIMUM_CONNECTION_POOL', 10), + connectionTimeoutMillis: configService.get('DB_CONNECTION_TIMEOUT', 1000) + } + }; + + // Generating ormconfig.json for running typeOrm CLI in dev env + !isProduction && + fs.writeFileSync( + 'ormconfig.json', + JSON.stringify({ ...config, entities: ['dist/**/*.entity.js'] }, null, 2) + ); + + return config; +}; diff --git a/apps/decentralized-web-node/src/main.ts b/apps/decentralized-web-node/src/main.ts new file mode 100644 index 00000000..2ead0dc4 --- /dev/null +++ b/apps/decentralized-web-node/src/main.ts @@ -0,0 +1,66 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { ValidationPipe, VersioningType } from '@nestjs/common'; +import cookieParser from 'cookie-parser'; +import { ConfigService } from '@nestjs/config'; +import compression from 'compression'; +import helmet from 'helmet'; +import { SentryService } from './modules/sentry/sentry.service'; +import * as SentryNode from '@sentry/node'; + +// This allows TypeScript to detect our global value and properly assign maps for sentry +// See more here: https://docs.sentry.io/platforms/node/typescript/ +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace NodeJS { + interface Global { + __rootdir__: string; + } + } +} + +global.__rootdir__ = process.cwd(); + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + + const configService = app.get(ConfigService); + + const sentryService = new SentryService(configService); + + sentryService.init(app.getHttpAdapter().getInstance()); + + app.use(SentryNode.Handlers.requestHandler()); + app.use(SentryNode.Handlers.tracingHandler()); + + app.enableVersioning({ + type: VersioningType.URI + }); + app.useGlobalPipes(new ValidationPipe()); + + // add security middleware + app.use(helmet()); + + // add cookie parser to read jwt token cookie + app.use(cookieParser()); + + // add compression for the API responses + app.use(compression()); + + const options = new DocumentBuilder() + .setTitle('API') + .setDescription('SSI Decentralized Web Node API documentation') + .setVersion('1.0'); + + const builtOptions = options.build(); + + const document = SwaggerModule.createDocument(app, builtOptions); + SwaggerModule.setup('api', app, document); + + app.enableCors({ credentials: true, origin: true }); + + app.use(SentryNode.Handlers.errorHandler()); + await app.listen(configService.get('NESTJS_PORT')); +} +bootstrap(); diff --git a/apps/decentralized-web-node/src/migrations/1649246690092-AddMessageTable.ts b/apps/decentralized-web-node/src/migrations/1649246690092-AddMessageTable.ts new file mode 100644 index 00000000..1aa0410c --- /dev/null +++ b/apps/decentralized-web-node/src/migrations/1649246690092-AddMessageTable.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddMessageTable1649246690092 implements MigrationInterface { + name = 'AddMessageTable1649246690092'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "collections_write_message" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "objectId" character varying NOT NULL, "target" character varying NOT NULL, "data" character varying, "message" jsonb NOT NULL, "method" character varying NOT NULL, "schema" character varying, "dataFormat" character varying, "dateCreated" TIMESTAMP WITH TIME ZONE NOT NULL, "datePublished" TIMESTAMP WITH TIME ZONE, "cid" character varying, CONSTRAINT "PK_fb5bbcf4b997ca1d29d5bae3ca2" PRIMARY KEY ("id"))` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE "collections_write_message"`); + } +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node-response.interceptor.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node-response.interceptor.ts new file mode 100644 index 00000000..b6eec947 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node-response.interceptor.ts @@ -0,0 +1,51 @@ +import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; +import { Request, Response } from 'express'; +import { Observable, catchError } from 'rxjs'; +import { ResponseObjectDto } from './dtos/response-object.dto'; + +/** + * This is motivated by the example error responses from the DWebNode spec + * https://identity.foundation/decentralized-web-node/spec/#request-level-status-coding + * For example, the "General request-level processing errors" example is + * { + * "requestId": "c5784162-84af-4aab-aff5-f1f8438dfc3d", + * "status": { + * "code": 500, + * "text": "The request could not be processed correctly" + * } + * } + */ +@Injectable() +export class DecentralizedWebNodeInterceptor implements NestInterceptor { + errorStatusMapping(status: number) { + switch (status) { + case 400: + return { + code: 400, + message: 'The request object was malformed or improperly constructed' + }; + default: + return { + code: 500, + message: 'The request could not be processed correctly' + }; + } + } + + intercept(context: ExecutionContext, next: CallHandler): Observable { + const request: Request = context.switchToHttp().getRequest(); + const response: Response = context.switchToHttp().getResponse(); + + return next.handle().pipe( + catchError(async (err) => { + const statusCode = err.status || 500; + const statusObj = this.errorStatusMapping(statusCode); + response.status(statusObj.code); + return { + requestId: request.body.requestId || '', + status: statusObj + }; + }) + ); + } +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node.controller.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node.controller.ts new file mode 100644 index 00000000..b0d51c0c --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node.controller.ts @@ -0,0 +1,40 @@ +import { Body, Controller, Post, UseInterceptors } from '@nestjs/common'; +import { ApiTags, ApiOkResponse } from '@nestjs/swagger'; +import { SentryErrorInterceptor } from '../interceptors/sentry-error-interceptor'; +import { Logger } from '../logger/logger.service'; +import { DecentralizedWebNodeInterceptor } from './decentralized-web-node-response.interceptor'; +import { RequestObjectDto } from './dtos/request-object.dto'; +import { ResponseObjectDto } from './dtos/response-object.dto'; +import { HandlerService } from './services/handler.service'; + +@UseInterceptors(SentryErrorInterceptor, DecentralizedWebNodeInterceptor) +@Controller({ path: 'webnode', version: '1' }) +@ApiTags('Decentralized web node') +export class DecentralizedWebNodeController { + constructor(private readonly logger: Logger, private readonly collectionHandlerService: HandlerService) { + this.logger.setContext(DecentralizedWebNodeController.name); + } + + /* + * This is an implementation of Decentralized Web Node message handling https://identity.foundation/decentralized-web-node/spec/#messages + * Currently, ONLY the Collections interface is supported. + * POST was chosen as the HTTP method to indicate the "messaging" paradigm of this interface + * For a related discussion, see DIDComm HTTP transport: https://identity.foundation/didcomm-messaging/spec/#https + */ + @ApiOkResponse({ + type: ResponseObjectDto + }) + @Post('/') + public async requestHandler(@Body() requestObject: RequestObjectDto): Promise { + const replies = await Promise.all( + requestObject.messages.map((message) => + this.collectionHandlerService.handleMessage(message, requestObject.target) + ) + ); + + return { + requestId: requestObject.requestId, + replies + }; + } +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node.module.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node.module.ts new file mode 100644 index 00000000..9c58f9de --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/decentralized-web-node.module.ts @@ -0,0 +1,15 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { CollectionsWriteMessage } from './entities/collections-write-message.entity'; +import { HandlerService } from './services/handler.service'; +import { MessageService } from './services/message.service'; +import { DecentralizedWebNodeController } from './decentralized-web-node.controller'; +import { DecentralizedWebNodeInterceptor } from './decentralized-web-node-response.interceptor'; + +@Module({ + imports: [TypeOrmModule.forFeature([CollectionsWriteMessage])], + controllers: [DecentralizedWebNodeController], + providers: [MessageService, HandlerService, DecentralizedWebNodeInterceptor], + exports: [HandlerService] +}) +export class DecentralizedWebNodeModule {} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/collections-query-descriptor.dto.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/collections-query-descriptor.dto.ts new file mode 100644 index 00000000..7f50733a --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/collections-query-descriptor.dto.ts @@ -0,0 +1,47 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsDefined, IsEnum, IsMimeType, IsOptional, IsString, IsUrl, IsUUID } from 'class-validator'; + +export type DataSort = + | 'createdAscending' + | 'createdDescending' + | 'publishedAscending' + | 'publishedDescending'; + +// https://identity.foundation/decentralized-web-node/spec/#query +export class CollectionsQueryDescriptorDto { + static methodValue = 'CollectionsQuery' as const; + + @IsString() + @IsDefined() + @IsEnum(['CollectionsQuery']) + @ApiProperty({ type: String, enum: ['CollectionsQuery'] }) + method: typeof CollectionsQueryDescriptorDto.methodValue; + + @ApiProperty() + @IsOptional() + @IsUUID() + objectId?: string; + + @ApiProperty() + @IsOptional() + @IsUrl() + schema?: string; + + @ApiProperty() + @IsOptional() + @IsMimeType() + dataFormat?: string; + + @ApiProperty({ + enum: ['createdAscending', 'createdDescending', 'publishedAscending', 'publishedDescending'] + }) + @IsOptional() + @IsString() + @IsEnum(['createdAscending', 'createdDescending', 'publishedAscending', 'publishedDescending']) + dateSort?: DataSort; + + @ApiProperty() + @IsOptional() + @IsString() + cid?: string; +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/collections-write-descriptor.dto.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/collections-write-descriptor.dto.ts new file mode 100644 index 00000000..d7586944 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/collections-write-descriptor.dto.ts @@ -0,0 +1,50 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { + IsDefined, + IsEnum, + IsMimeType, + IsNumber, + IsOptional, + IsString, + IsUrl, + IsUUID +} from 'class-validator'; + +// https://identity.foundation/decentralized-web-node/spec/#write +export class CollectionsWriteDescriptorDto { + static methodValue = 'CollectionsWrite' as const; + + @IsString() + @IsDefined() + @IsEnum(['CollectionsWrite']) + @ApiProperty({ type: String, enum: ['CollectionsWrite'] }) + method: typeof CollectionsWriteDescriptorDto.methodValue; + + @ApiProperty() + @IsUUID() + objectId: string; + + @ApiProperty() + @IsOptional() + @IsUrl() + schema?: string; + + @ApiProperty() + @IsNumber() + dateCreated: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + datePublished?: number; + + @ApiProperty() + @IsOptional() + @IsMimeType() + dataFormat?: string; + + @ApiProperty() + @IsOptional() + @IsString() + cid?: string; +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/message.dto.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/message.dto.ts new file mode 100644 index 00000000..19e6fc08 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/message.dto.ts @@ -0,0 +1,54 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { IsBase64, IsDefined, IsObject, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { CollectionsQueryDescriptorDto } from './collections-query-descriptor.dto'; +import { CollectionsWriteDescriptorDto } from './collections-write-descriptor.dto'; + +// https://identity.foundation/decentralized-web-node/spec/#messages +export class MessageDto { + @ApiProperty() + @IsString() + @IsOptional() + @IsBase64() + data?: string; + + @ApiProperty({ + discriminator: { + propertyName: 'method', + mapping: { + CollectionsQuery: 'CollectionsQueryDescriptorDto', + CollectionsWrite: 'CollectionsWriteDescriptorDto' + } + } + }) + @IsDefined() + @IsObject() + @ValidateNested() + @Type(() => CollectionsQueryDescriptorDto, { + keepDiscriminatorProperty: true, + discriminator: { + property: 'method', + subTypes: [ + { + value: CollectionsQueryDescriptorDto, + name: CollectionsQueryDescriptorDto.methodValue + }, + { + value: CollectionsWriteDescriptorDto, + name: CollectionsWriteDescriptorDto.methodValue + } + ] + } + }) + descriptor: CollectionsQueryDescriptorDto | CollectionsWriteDescriptorDto; + + @ApiProperty() + @IsObject() + @IsOptional() + attestation?: unknown; // TODO + + @ApiProperty() + @IsObject() + @IsOptional() + authorization?: unknown; // TODO +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/request-object.dto.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/request-object.dto.ts new file mode 100644 index 00000000..7c18b583 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/request-object.dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsArray, IsString, IsUUID } from 'class-validator'; +import { MessageDto } from './message.dto'; + +// https://identity.foundation/decentralized-web-node/spec/#request-object +export class RequestObjectDto { + @ApiProperty() + @IsString() + @IsUUID() + requestId: string; + + @ApiProperty() + @IsString() + target: string; + + @ApiProperty({ type: [MessageDto] }) + @IsArray() + messages: MessageDto[]; +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-object.dto.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-object.dto.ts new file mode 100644 index 00000000..66d58716 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-object.dto.ts @@ -0,0 +1,26 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { IsArray, IsOptional, IsString, IsUUID, ValidateNested } from 'class-validator'; +import { ResponseReplyDto } from './response-reply.dto'; +import { ResponseStatusDto } from './response-status.dto'; + +// https://identity.foundation/decentralized-web-node/spec/#response-objects +export class ResponseObjectDto { + @ApiProperty() + @IsString() + @IsUUID() + requestId: string; + + @ApiProperty({ type: ResponseStatusDto, required: false }) + @IsOptional() + @ValidateNested() + @Type(() => ResponseStatusDto) + status?: ResponseStatusDto; + + @ApiProperty({ type: [ResponseReplyDto], required: false }) + @IsArray() + @IsOptional() + @ValidateNested({ each: true }) + @Type(() => ResponseReplyDto) + replies?: ResponseReplyDto[]; +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-reply.dto.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-reply.dto.ts new file mode 100644 index 00000000..971bc4e4 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-reply.dto.ts @@ -0,0 +1,20 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { IsOptional, IsString, ValidateNested } from 'class-validator'; +import { ResponseStatusDto } from './response-status.dto'; + +export class ResponseReplyDto { + @ApiProperty() + @IsString() + messageId: string; + + @ApiProperty({ type: ResponseStatusDto, required: false }) + @IsOptional() + @ValidateNested() + @Type(() => ResponseStatusDto) + status?: ResponseStatusDto; + + @ApiProperty() + @IsOptional() + entries?: unknown; +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-status.dto.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-status.dto.ts new file mode 100644 index 00000000..6cc8a8f8 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/dtos/response-status.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNumber, IsString } from 'class-validator'; + +export class ResponseStatusDto { + @ApiProperty() + @IsNumber() + code: number; + + @ApiProperty() + @IsString() + message?: string; +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/entities/collections-write-message.entity.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/entities/collections-write-message.entity.ts new file mode 100644 index 00000000..c639a27e --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/entities/collections-write-message.entity.ts @@ -0,0 +1,44 @@ +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; +import { MessageDto } from '../dtos/message.dto'; + +@Entity() +export class CollectionsWriteMessage { + static create(data: Omit): CollectionsWriteMessage { + const entity = new CollectionsWriteMessage(); + Object.assign(entity, data); + return entity; + } + + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + objectId: string; + + @Column() + target: string; + + @Column({ nullable: true }) + data?: string; + + @Column('jsonb') + message: MessageDto; + + @Column() + method: string; + + @Column({ nullable: true }) + schema?: string; + + @Column({ nullable: true }) + dataFormat?: string; + + @Column({ type: 'timestamptz' }) + dateCreated: string; + + @Column({ nullable: true, type: 'timestamptz' }) + datePublished?: string; + + @Column({ nullable: true }) + cid?: string; +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/services/handler.service.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/services/handler.service.ts new file mode 100644 index 00000000..83390821 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/services/handler.service.ts @@ -0,0 +1,125 @@ +import { Injectable } from '@nestjs/common'; +import { plainToClass } from 'class-transformer'; +import { validate } from 'class-validator'; +import { CID } from 'multiformats/cid'; +import * as json from 'multiformats/codecs/json'; +import { sha256 } from 'multiformats/hashes/sha2'; +import { Logger } from '../../logger/logger.service'; +import { CollectionsQueryDescriptorDto } from '../dtos/collections-query-descriptor.dto'; +import { CollectionsWriteDescriptorDto } from '../dtos/collections-write-descriptor.dto'; +import { MessageDto } from '../dtos/message.dto'; +import { ResponseReplyDto } from '../dtos/response-reply.dto'; +import { CollectionsWriteMessage } from '../entities/collections-write-message.entity'; +import { MessageService } from './message.service'; + +@Injectable() +export class HandlerService { + constructor(private readonly logger: Logger, private readonly messageService: MessageService) { + this.logger.setContext(HandlerService.name); + } + + private async generateMessageId(message: MessageDto): Promise { + const bytes = json.encode(message); + const hash = await sha256.digest(bytes); + const cid = CID.create(1, json.code, hash); + return cid.toString(); + } + + async handleMessage(message: MessageDto, target: string): Promise { + const messageId = await this.generateMessageId(message); + const isValid = await validate(plainToClass(MessageDto, message), { + forbidNonWhitelisted: true + }); + + if (isValid.length) { + return { + messageId, + status: { + code: 400, + message: 'The message was malformed or improperly constructed' + } + }; + } + + switch (message.descriptor.method) { + case CollectionsQueryDescriptorDto.methodValue: + return this.handleQuery( + message as MessageDto & { + descriptor: CollectionsQueryDescriptorDto; + }, + target, + messageId + ); + + case CollectionsWriteDescriptorDto.methodValue: + return this.handleWrite( + message as { + descriptor: CollectionsWriteDescriptorDto; + }, + target, + messageId + ); + default: + return { + messageId, + status: { + code: 501, + message: 'The interface method is not implemented' + } + }; + } + } + + private async handleQuery( + message: MessageDto & { descriptor: CollectionsQueryDescriptorDto }, + target: string, + messageId: string + ): Promise { + const entries = await this.messageService.find(target, { + dateSort: message.descriptor.dateSort, + dataFormat: message.descriptor.dataFormat, + schema: message.descriptor.schema, + objectId: message.descriptor.objectId + }); + + return { + messageId, + status: { + code: 200, + message: 'OK' + }, + entries: [...entries.map((entry) => entry.message)] + }; + } + + private async handleWrite( + message: MessageDto & { descriptor: CollectionsWriteDescriptorDto }, + target: string, + messageId: string + ): Promise { + const entry = await this.messageService.save( + CollectionsWriteMessage.create({ + message, + objectId: message.descriptor.objectId, + target, + data: message.data, + method: message.descriptor.method, + schema: message.descriptor.schema, + dataFormat: message.descriptor.dataFormat, + dateCreated: new Date(message.descriptor.dateCreated).toISOString(), + datePublished: + message.descriptor.datePublished && new Date(message.descriptor.datePublished).toISOString(), + cid: message.descriptor.cid + }) + ); + + return { + messageId, + status: { + code: 201, + message: 'OK' + }, + entries: [entry.message] + }; + } +} diff --git a/apps/decentralized-web-node/src/modules/decentralized-web-node/services/message.service.ts b/apps/decentralized-web-node/src/modules/decentralized-web-node/services/message.service.ts new file mode 100644 index 00000000..0cf11e75 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/decentralized-web-node/services/message.service.ts @@ -0,0 +1,96 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { FindManyOptions, Repository } from 'typeorm'; +import { Logger } from '../../logger/logger.service'; +import { DataSort } from '../dtos/collections-query-descriptor.dto'; +import { CollectionsWriteMessage } from '../entities/collections-write-message.entity'; + +@Injectable() +export class MessageService { + constructor( + private readonly logger: Logger, + @InjectRepository(CollectionsWriteMessage) + private readonly messageRepository: Repository + ) { + this.logger.setContext(MessageService.name); + } + + async find( + user: string, + options: { + dateSort?: DataSort; + dataFormat?: string; + schema?: string; + objectId?: string; + } + ): Promise { + const whereParams: Record = { + target: user + }; + + if (options.schema) { + whereParams.schema = options.schema; + } + + if (options.dataFormat) { + whereParams.dataFormat = options.dataFormat; + } + + if (options.objectId) { + whereParams.objectId = options.objectId; + } + + let order: FindManyOptions['order']; + switch (options.dateSort) { + case 'createdDescending': + order = { + dateCreated: 'DESC' + }; + break; + case 'publishedAscending': + order = { + datePublished: 'ASC' + }; + break; + case 'publishedDescending': + order = { + datePublished: 'DESC' + }; + break; + default: + case 'createdAscending': + order = { + dateCreated: 'ASC' + }; + break; + } + + const items = await this.messageRepository.find({ + where: whereParams, + order + }); + return items; + } + + async save(message: CollectionsWriteMessage): Promise { + const foundMessage = await this.messageRepository.findOne({ + where: { + objectId: message.objectId, + target: message.target + } + }); + let item: CollectionsWriteMessage = foundMessage; + + // https://identity.foundation/decentralized-web-node/spec/#processing-instructions + if (foundMessage && message.dateCreated > foundMessage.dateCreated) { + item = await this.messageRepository.save(message); + } else if (foundMessage && message.dateCreated < foundMessage.dateCreated) { + item = foundMessage; + } else if (foundMessage && message.dateCreated === foundMessage.dateCreated) { + item = message.cid > foundMessage.cid ? await this.messageRepository.save(message) : foundMessage; + } else { + item = await this.messageRepository.save(message); + } + return item; + } +} diff --git a/apps/decentralized-web-node/src/modules/health-check/health-check.controller.ts b/apps/decentralized-web-node/src/modules/health-check/health-check.controller.ts new file mode 100644 index 00000000..13fb29f0 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/health-check/health-check.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get } from '@nestjs/common'; +import { HealthCheck } from '@nestjs/terminus'; +import { HealthCheckService } from './health-check.service'; + +@Controller({ path: 'health', version: '1' }) +export class HealthCheckController { + constructor(protected readonly healthCheckService: HealthCheckService) {} + + @Get('ready') + @HealthCheck() + checkReadiness() { + return this.healthCheckService.checkReadiness(); + } + + @HealthCheck() + @Get('live') + checkLiveness() { + return this.healthCheckService.checkLiveness(); + } + + @Get() + @HealthCheck() + check() { + return this.healthCheckService.checkReadiness(); + } +} diff --git a/apps/decentralized-web-node/src/modules/health-check/health-check.module.ts b/apps/decentralized-web-node/src/modules/health-check/health-check.module.ts new file mode 100644 index 00000000..6e694bd5 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/health-check/health-check.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { TerminusModule } from '@nestjs/terminus'; +import { HealthCheckController } from './health-check.controller'; +import { HealthCheckService } from './health-check.service'; + +@Module({ + imports: [TerminusModule], + providers: [HealthCheckService], + controllers: [HealthCheckController] +}) +export class HealthCheckModule {} diff --git a/apps/decentralized-web-node/src/modules/health-check/health-check.service.ts b/apps/decentralized-web-node/src/modules/health-check/health-check.service.ts new file mode 100644 index 00000000..d7373154 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/health-check/health-check.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@nestjs/common'; +import { HealthCheckService as TerminusHealthCheckService, TypeOrmHealthIndicator } from '@nestjs/terminus'; + +@Injectable() +export class HealthCheckService { + constructor( + private readonly terminusHealthCheckService: TerminusHealthCheckService, + private readonly db: TypeOrmHealthIndicator + ) {} + + async checkLiveness() { + return this.terminusHealthCheckService.check([() => this.db.pingCheck('postgres')]); + } + + async checkReadiness() { + return this.terminusHealthCheckService.check([]); + } +} diff --git a/apps/decentralized-web-node/src/modules/interceptors/interceptors.module.ts b/apps/decentralized-web-node/src/modules/interceptors/interceptors.module.ts new file mode 100644 index 00000000..e69dac48 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/interceptors/interceptors.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { SentryModule } from '../sentry/sentry.module'; +import { SentryErrorInterceptor } from './sentry-error-interceptor'; + +@Module({ + imports: [SentryModule], + providers: [SentryErrorInterceptor], + exports: [SentryErrorInterceptor] +}) +export class InterceptorsModule {} diff --git a/apps/decentralized-web-node/src/modules/interceptors/sentry-error-interceptor.ts b/apps/decentralized-web-node/src/modules/interceptors/sentry-error-interceptor.ts new file mode 100644 index 00000000..9fbd8fbb --- /dev/null +++ b/apps/decentralized-web-node/src/modules/interceptors/sentry-error-interceptor.ts @@ -0,0 +1,31 @@ +import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; +import { Handlers } from '@sentry/node'; +import { tap } from 'rxjs/operators'; +import { SentryService } from '../sentry/sentry.service'; + +@Injectable() +export class SentryErrorInterceptor implements NestInterceptor { + constructor(private readonly sentryService: SentryService) {} + intercept(context: ExecutionContext, next: CallHandler) { + return next.handle().pipe( + tap({ + error: (exception) => { + const { withScope, captureException } = this.sentryService.getSentry() || {}; + + if (!withScope || !captureException) return; + + withScope((scope) => { + const data = Handlers.parseRequest({}, context.switchToHttp().getRequest(), {}); + + scope.setExtra('req', data.request); + + if (data.extra) scope.setExtras(data.extra); + if (data.user) scope.setUser(data.user); + + this.sentryService.captureException(exception); + }); + } + }) + ); + } +} diff --git a/apps/decentralized-web-node/src/modules/logger/logger.module.ts b/apps/decentralized-web-node/src/modules/logger/logger.module.ts new file mode 100644 index 00000000..23e44248 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/logger/logger.module.ts @@ -0,0 +1,11 @@ +import { Global, Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { Logger } from './logger.service'; + +@Global() +@Module({ + imports: [ConfigModule], + providers: [Logger], + exports: [Logger] +}) +export class LoggerModule {} diff --git a/apps/decentralized-web-node/src/modules/logger/logger.service.ts b/apps/decentralized-web-node/src/modules/logger/logger.service.ts new file mode 100644 index 00000000..08cbc6bd --- /dev/null +++ b/apps/decentralized-web-node/src/modules/logger/logger.service.ts @@ -0,0 +1,88 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { Injectable, Logger as NestLogger, LoggerService, Scope } from '@nestjs/common'; +import { SyncRedactor } from 'redact-pii'; +import { Logger as WinstonLogger, createLogger, format, transports } from 'winston'; +import 'winston-daily-rotate-file'; +import { ConfigService } from '@nestjs/config'; +import { SentryService } from '../sentry/sentry.service'; + +@Injectable({ scope: Scope.TRANSIENT }) +export class Logger extends NestLogger implements LoggerService { + public readonly logger: WinstonLogger; + private readonly redactor: SyncRedactor; + constructor(configService: ConfigService, private readonly sentryService: SentryService) { + super(); + this.redactor = new SyncRedactor({ + customRedactors: { + before: [ + { + regexpPattern: /(?<=0x[a-f0-9-]{3})[a-f0-9-]+/gi, + replaceWith: '***' + } + ] + } + }); + + const logFormat = format.combine( + format.timestamp(), + format.printf( + ({ level, message, timestamp, context }) => + `${level} [${context || ''}] : ${timestamp} - ${this.redactor.redact(message)}` + ), + format.colorize() + ); + + const console = new transports.Console({ format: logFormat }); + + this.logger = createLogger({ + format: logFormat, + level: 'debug', + transports: [console] + }); + } + + setContext(ctx: string) { + this.context = ctx; + } + + error(error: any, trace?: string, context: string = this.context) { + this.sentryService.captureException(error); + if (Array.isArray(error)) { + this.logger.error(error.map((err) => JSON.stringify(err, null, 2)).join(', ')); + return; + } + if (error instanceof Error) { + const { message, stack, ...meta } = error; + return this.logger.error(message, { + context, + stack: [trace || stack], + ...meta + }); + } + if ('object' === typeof error) { + const { message, ...meta } = error as { message: string }; + return this.logger.error(message, { + context, + stack: [trace], + ...meta + }); + } + this.logger.error(error, { context }); + } + + warn(message: any, context: string = this.context) { + return this.logger.warn(message, { context }); + } + + debug(message: any, context: string = this.context) { + return this.logger.debug(message, { context }); + } + + verbose(message: any, context: string = this.context) { + return this.logger.verbose(message, { context }); + } + + info(message: any, context: string = this.context) { + return this.logger.info(message, { context }); + } +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/checked.dto.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/checked.dto.ts new file mode 100644 index 00000000..402d48a6 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/checked.dto.ts @@ -0,0 +1,13 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Checked, Status } from '@sphereon/pex'; + +export class CheckedDto implements Checked { + @ApiProperty() + tag: string; + + @ApiProperty({ enum: ['info', 'warn', 'error'] }) + status: Status; + + @ApiProperty({ required: false }) + message?: string; +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/constraint.dto.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/constraint.dto.ts new file mode 100644 index 00000000..ae591ae6 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/constraint.dto.ts @@ -0,0 +1,18 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { IsEnum, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { FieldDto } from './field.dto'; + +export class ConstraintDto { + @ApiProperty({ type: [FieldDto], required: false }) + @ValidateNested({ each: true }) + @IsOptional() + @Type(() => FieldDto) + fields?: FieldDto[]; + + @ApiProperty({ enum: ['required', 'preferred'] }) + @IsOptional() + @IsString() + @IsEnum(['required', 'preferred']) + limit_disclosure?: 'required' | 'preferred'; +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/field.dto.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/field.dto.ts new file mode 100644 index 00000000..0140e768 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/field.dto.ts @@ -0,0 +1,27 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { ArrayMinSize, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { FilterDto } from './filter.dto'; + +export class FieldDto { + @ApiProperty() + @IsString({ each: true }) + @ArrayMinSize(1) + path: string[]; + + @ApiProperty() + @IsString() + @IsOptional() + id?: string; + + @ApiProperty() + @IsString() + @IsOptional() + purpose?: string; + + @ApiProperty({ type: FilterDto }) + @ValidateNested() + @IsOptional() + @Type(() => FilterDto) + filter?: FilterDto; +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/filter.dto.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/filter.dto.ts new file mode 100644 index 00000000..de6a3b03 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/filter.dto.ts @@ -0,0 +1,137 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { + ArrayMinSize, + IsArray, + IsBoolean, + IsEnum, + IsNumber, + IsObject, + IsOptional, + IsString, + Min, + ArrayUnique +} from 'class-validator'; + +// https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6 +export class FilterDto { + @ApiProperty({ + enum: ['null', 'boolean', 'object', 'array', 'number', 'string'] + }) + @IsString() + @IsEnum(['null', 'boolean', 'object', 'array', 'number', 'string']) + type: 'null' | 'boolean' | 'object' | 'array' | 'number' | 'string'; + + // Common filters + @ApiProperty() + @IsOptional() + @IsArray() + @ArrayMinSize(1) + @ArrayUnique() + enum?: unknown[]; + + @ApiProperty({ + description: 'Property must have a type specified in the `type` property' + }) + @IsOptional() + const?: unknown; + + // Number filters + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(1) + multipleOf?: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + maximum?: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + exclusiveMaximum?: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + minimum?: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + exclusiveMinimum?: number; + + // string + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(0) + minLength?: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(0) + maxLength?: number; + + @ApiProperty() + @IsString() + @IsOptional() + pattern?: string; + + // array + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(0) + maxItems?: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(0) + minItems?: number; + + @ApiProperty() + @IsBoolean() + @IsOptional() + uniqueItems?: boolean; + + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(0) + maxContains?: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(0) + minContains?: number; + + // object + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(0) + maxProperties?: number; + + @ApiProperty() + @IsNumber() + @IsOptional() + @Min(0) + minProperties?: number; + + @ApiProperty() + @IsOptional() + @IsArray() + @IsString({ each: true }) + @ArrayUnique() + required?: string[]; + + @ApiProperty({ type: Object }) + @IsOptional() + @IsObject() + dependentRequired?: Record; +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/input-descriptor.dto.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/input-descriptor.dto.ts new file mode 100644 index 00000000..8997d8f5 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/input-descriptor.dto.ts @@ -0,0 +1,32 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { IsObject, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { ConstraintDto } from './constraint.dto'; + +// https://identity.foundation/presentation-exchange/#input-descriptor-object +export class InputDescriptorDto { + @IsString() + @ApiProperty() + id: string; + + @IsString() + @IsOptional() + @ApiProperty() + name?: string; + + @IsString() + @IsOptional() + @ApiProperty() + purpose?: string; + + @ApiProperty() + @IsOptional() + format?: unknown; + + @ApiProperty({ type: ConstraintDto }) + @IsObject() + @IsOptional() + @ValidateNested() + @Type(() => ConstraintDto) + constraints?: ConstraintDto; +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/match-results.dto.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/match-results.dto.ts new file mode 100644 index 00000000..ea863348 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/match-results.dto.ts @@ -0,0 +1,24 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IVerifiableCredential, SelectResults, Status } from '@sphereon/pex'; +import { CheckedDto } from './checked.dto'; +import { SubmissionRequirementMatchDto } from './submission-requirement-match.dto'; + +export class MatchResultsDto implements SelectResults { + @ApiProperty({ required: false, type: [CheckedDto] }) + errors?: CheckedDto[]; + + @ApiProperty({ required: false, type: [SubmissionRequirementMatchDto] }) + matches?: SubmissionRequirementMatchDto[]; + + @ApiProperty({ enum: ['info', 'warn', 'error'] }) + areRequiredCredentialsPresent: Status; + + @ApiProperty({ required: false, isArray: true }) + verifiableCredential?: IVerifiableCredential[]; + + @ApiProperty({ required: false }) + vcIndexes?: number[]; + + @ApiProperty({ required: false, type: [CheckedDto] }) + warnings?: CheckedDto[]; +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/presentation-definition.dto.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/presentation-definition.dto.ts new file mode 100644 index 00000000..d2a60fcf --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/presentation-definition.dto.ts @@ -0,0 +1,31 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { IsArray, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { InputDescriptorDto } from './input-descriptor.dto'; + +// https://identity.foundation/presentation-exchange/#presentation-definition +export class PresentationDefinitionDto { + @IsString() + @ApiProperty() + id: string; + + @IsString() + @IsOptional() + @ApiProperty() + name?: string; + + @IsString() + @IsOptional() + @ApiProperty() + purpose?: string; + + @ApiProperty() + @IsOptional() + format?: unknown; + + @ApiProperty({ type: [InputDescriptorDto] }) + @IsArray() + @ValidateNested({ each: true }) + @Type(() => InputDescriptorDto) + input_descriptors: InputDescriptorDto[]; +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/submission-requirement-match.dto.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/submission-requirement-match.dto.ts new file mode 100644 index 00000000..a01f20f9 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/dtos/submission-requirement-match.dto.ts @@ -0,0 +1,28 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { SubmissionRequirementMatch } from '@sphereon/pex'; + +export class SubmissionRequirementMatchDto implements SubmissionRequirementMatch { + @ApiProperty({ required: false }) + name?: string; + + @ApiProperty({ enum: ['all', 'pick'] }) + rule: 'all' | 'pick'; + + @ApiProperty() + min?: number; + + @ApiProperty({ required: false }) + count?: number; + + @ApiProperty({ required: false }) + max?: number; + + @ApiProperty() + vc_path: string[]; + + @ApiProperty({ required: false }) + from?: string[]; + + @ApiProperty({ required: false, type: [SubmissionRequirementMatchDto] }) + from_nested?: SubmissionRequirementMatchDto[]; +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/presentation-exchange.controller.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/presentation-exchange.controller.ts new file mode 100644 index 00000000..00efe028 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/presentation-exchange.controller.ts @@ -0,0 +1,25 @@ +import { Body, Controller, Param, Post, UseInterceptors } from '@nestjs/common'; +import { ApiOkResponse, ApiTags } from '@nestjs/swagger'; +import { SentryErrorInterceptor } from '../interceptors/sentry-error-interceptor'; +import { Logger } from '../logger/logger.service'; +import { MatchResultsDto } from './dtos/match-results.dto'; +import { PresentationDefinitionDto } from './dtos/presentation-definition.dto'; +import { VCMatchService } from './services/vc-match.service'; + +@UseInterceptors(SentryErrorInterceptor) +@Controller({ path: 'vp', version: '1' }) +@ApiTags('Verifiable Presentation') +export class PresentationExchangeController { + constructor(private readonly logger: Logger, private readonly vcMatchService: VCMatchService) { + this.logger.setContext(PresentationExchangeController.name); + } + + @Post('/match/:subject') + @ApiOkResponse({ type: MatchResultsDto }) + public async getMatchedCredentialsForVpDefinition( + @Body() presentationDefinition: PresentationDefinitionDto, + @Param('subject') subject: string + ): Promise { + return await this.vcMatchService.matchCredentials(presentationDefinition, subject); + } +} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/presentation-exchange.module.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/presentation-exchange.module.ts new file mode 100644 index 00000000..461a6ef6 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/presentation-exchange.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { DecentralizedWebNodeModule } from '../decentralized-web-node/decentralized-web-node.module'; +import { VCMatchService } from './services/vc-match.service'; +import { PresentationExchangeController } from './presentation-exchange.controller'; + +@Module({ + imports: [DecentralizedWebNodeModule], + controllers: [PresentationExchangeController], + providers: [VCMatchService] +}) +export class PresentationExchangeModule {} diff --git a/apps/decentralized-web-node/src/modules/presentation-exchange/services/vc-match.service.ts b/apps/decentralized-web-node/src/modules/presentation-exchange/services/vc-match.service.ts new file mode 100644 index 00000000..bec85b1f --- /dev/null +++ b/apps/decentralized-web-node/src/modules/presentation-exchange/services/vc-match.service.ts @@ -0,0 +1,58 @@ +import { Injectable } from '@nestjs/common'; +import { PEX } from '@sphereon/pex'; +import { VerifiableCredential, isVerifiableCredential } from '@ew-did-registry/credentials-interface'; +import { Logger } from '../../logger/logger.service'; +import { HandlerService } from '../../decentralized-web-node/services/handler.service'; +import { MatchResultsDto } from '../dtos/match-results.dto'; +import { PresentationDefinitionDto } from '../dtos/presentation-definition.dto'; +import { MessageDto } from '../../decentralized-web-node/dtos/message.dto'; +import { CollectionsQueryDescriptorDto } from '../../decentralized-web-node/dtos/collections-query-descriptor.dto'; + +@Injectable() +export class VCMatchService { + constructor(private readonly logger: Logger, private readonly handlerService: HandlerService) { + this.logger.setContext(VCMatchService.name); + } + + async matchCredentials( + presentationDefinition: PresentationDefinitionDto, + holder: string + ): Promise { + const pex: PEX = new PEX(); + const credentials = await this.queryHolderVCs(holder); + + return pex.selectFrom(presentationDefinition, credentials, [holder]); + } + + private decodeData(writeMessage: unknown): Record | undefined { + try { + if (!writeMessage['data']) return; + const dataBase64 = Buffer.from(writeMessage['data'], 'base64').toString('utf8'); + return JSON.parse(dataBase64); + } catch { + return; + } + } + + private async queryHolderVCs(holder: string): Promise>[]> { + const queryMessage: MessageDto & { + descriptor: CollectionsQueryDescriptorDto; + } = { + descriptor: { + method: 'CollectionsQuery', + schema: 'https://www.w3.org/2018/credentials#VerifiableCredential', + dataFormat: 'application/ld+json' + } + }; + + const reply = await this.handlerService.handleMessage(queryMessage, holder); + + if (reply.status.code !== 200 || !Array.isArray(reply.entries)) { + throw new Error(`Failed to query holder ${holder} for verifiable credentials`); + } + + const entries = reply.entries.map(this.decodeData).filter(Boolean).filter(isVerifiableCredential); + + return entries; + } +} diff --git a/apps/decentralized-web-node/src/modules/sentry/sentry.module.ts b/apps/decentralized-web-node/src/modules/sentry/sentry.module.ts new file mode 100644 index 00000000..9c968cd0 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/sentry/sentry.module.ts @@ -0,0 +1,11 @@ +import { Global, Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { SentryService } from './sentry.service'; + +@Global() +@Module({ + imports: [ConfigModule], + providers: [SentryService], + exports: [SentryService] +}) +export class SentryModule {} diff --git a/apps/decentralized-web-node/src/modules/sentry/sentry.service.ts b/apps/decentralized-web-node/src/modules/sentry/sentry.service.ts new file mode 100644 index 00000000..3d321598 --- /dev/null +++ b/apps/decentralized-web-node/src/modules/sentry/sentry.service.ts @@ -0,0 +1,132 @@ +import { + BadRequestException, + ForbiddenException, + Injectable, + NotFoundException, + OnApplicationShutdown, + OnModuleDestroy, + ServiceUnavailableException, + UnauthorizedException +} from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { Application } from 'express'; +import * as Sentry from '@sentry/node'; +import { RewriteFrames } from '@sentry/integrations'; +import * as SentryTracing from '@sentry/tracing'; +import { Client, Options } from '@sentry/types'; + +@Injectable() +export class SentryService implements OnModuleDestroy, OnApplicationShutdown { + private sentryEnabled = false; + private readonly EXCLUDED_EXCEPTIONS = [ + BadRequestException, + NotFoundException, + ServiceUnavailableException, + ForbiddenException, + UnauthorizedException + ]; + + constructor(protected readonly configService: ConfigService) {} + + private isExcludedExceptions(exception: unknown): boolean { + return this.EXCLUDED_EXCEPTIONS.some((item) => exception instanceof item); + } + + async onApplicationShutdown(): Promise { + await this.drain(); + } + + async onModuleDestroy(): Promise { + await this.drain(); + } + + getSentry() { + return Sentry; + } + + init(app: Application) { + const dsn = this.configService.get('SENTRY_DNS'); + + if (!dsn) { + return; + } + + this.sentryEnabled = true; + + const [env, release] = [ + this.configService.get('SENTRY_ENV'), + this.configService.get('SENTRY_RELEASE') + ]; + + Sentry.init({ + dsn: dsn, + environment: env, + release: release, + tracesSampleRate: this.configService.get('SENTRY_TRACES_SAMPLE_RATE', 1), + tracesSampler: (samplingContext) => { + if (samplingContext.transactionContext.name.startsWith('GET /v1/health')) { + // Drop this transaction, by setting its sample rate to 0% + return 0; + } else { + // Default sample rate for all others (replaces tracesSampleRate) + return 0.2; + } + }, + integrations: [ + new RewriteFrames({ + root: global.__rootdir__ + }), + new Sentry.Integrations.Http({ tracing: true }), + new SentryTracing.Integrations.Express({ + app + }), + new SentryTracing.Integrations.Postgres({ + usePgNative: false + }), + new Sentry.Integrations.OnUncaughtException({ + onFatalError: async (err) => { + if (this.shouldSkipException(err)) { + return; + } + + (Sentry.getCurrentHub().getClient>() as Client).captureException(err); + } + }), + new Sentry.Integrations.OnUnhandledRejection({ mode: 'warn' }) + ], + beforeSend(event) { + const request = event.request; + if (request) { + delete request.cookies; + delete request.data?.identityToken; + request.url.replace(/refresh_token=.*/, 'refresh_token=[Filtered]'); + const headers = request.headers; + if (headers) { + delete headers['Authorization']; + delete headers.cookie; + } + } + return event; + } + }); + } + + captureException(error: Error | string) { + if (this.isExcludedExceptions(error)) return; + this.sentryEnabled && Sentry.captureException(error); + } + + captureMessage(message: string) { + this.sentryEnabled && Sentry.captureMessage(message); + } + + private shouldSkipException(error: Error) { + const errorNames: string[] = [ForbiddenException.name, 'SentryError']; + + return errorNames.includes(error.name); + } + + private async drain(): Promise { + await Sentry.close(this.configService.get('SENTRY_DRAIN_TIMEOUT', 2000)); + } +} diff --git a/apps/decentralized-web-node/test/decentralized-web-node/fixtures/valid-vc.ts b/apps/decentralized-web-node/test/decentralized-web-node/fixtures/valid-vc.ts new file mode 100644 index 00000000..a6aa804c --- /dev/null +++ b/apps/decentralized-web-node/test/decentralized-web-node/fixtures/valid-vc.ts @@ -0,0 +1,88 @@ +// Source: https://github.com/spruceid/ssi/blob/3745b7dfdd18e1b27c6135f8036470efde596f35/did-pkh/tests/vc-eth-eip712sig.jsonld +export const validVC = { + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiableCredential'], + credentialSubject: { + id: 'did:example:foo' + }, + id: 'id:urn:uuid:c3f8b9e0-e8e3-4f9b-b9f0-f9b8b9e0e9e9', + issuer: 'did:pkh:eth:0x2fbf1be19d90a29aea9363f4ef0b6bf1c4ff0758', + issuanceDate: '2021-03-18T16:38:25Z', + proof: { + '@context': 'https://demo.spruceid.com/ld/eip712sig-2021/v0.1.jsonld', + type: 'EthereumEip712Signature2021', + proofPurpose: 'assertionMethod', + proofValue: + '0x9abee96d684a146aa0b30498d8799ee9a4f8f54488c73d4a4fba3a6fb94eca8764af54f15a24deba0dd9ee2f460d1f6bd174a4ca7504a72d6b1fe9b739d613fe1b', + verificationMethod: 'did:pkh:eth:0x2fbf1be19d90a29aea9363f4ef0b6bf1c4ff0758#Recovery2020', + created: '2021-06-17T17:16:39.791Z', + eip712Domain: { + domain: { + name: 'EthereumEip712Signature2021' + }, + messageSchema: { + CredentialSubject: [ + { + name: 'id', + type: 'string' + } + ], + EIP712Domain: [ + { + name: 'name', + type: 'string' + } + ], + Proof: [ + { + name: '@context', + type: 'string' + }, + { + name: 'verificationMethod', + type: 'string' + }, + { + name: 'created', + type: 'string' + }, + { + name: 'proofPurpose', + type: 'string' + }, + { + name: 'type', + type: 'string' + } + ], + VerifiableCredential: [ + { + name: '@context', + type: 'string[]' + }, + { + name: 'type', + type: 'string[]' + }, + { + name: 'issuer', + type: 'string' + }, + { + name: 'issuanceDate', + type: 'string' + }, + { + name: 'credentialSubject', + type: 'CredentialSubject' + }, + { + name: 'proof', + type: 'Proof' + } + ] + }, + primaryType: 'VerifiableCredential' + } + } +}; diff --git a/apps/decentralized-web-node/test/decentralized-web-node/query-message.e2e-spec.ts b/apps/decentralized-web-node/test/decentralized-web-node/query-message.e2e-spec.ts new file mode 100644 index 00000000..4b6cd058 --- /dev/null +++ b/apps/decentralized-web-node/test/decentralized-web-node/query-message.e2e-spec.ts @@ -0,0 +1,290 @@ +import { Test } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import request from 'supertest'; +import { Connection, EntityManager, QueryRunner } from 'typeorm'; +import { AppModule } from '../../src/app.module'; +import { appConfig } from '../../src/common/test.utils'; +import { randomUser } from '../utils'; +import { validVC } from './fixtures/valid-vc'; +import { createQueryMessage, createRequest, createWriteMessage, generateCid } from './utils'; + +describe('Decentralized web node - Query message (version: 1)', () => { + let app: INestApplication; + let queryRunner: QueryRunner; + + beforeAll(async () => { + const testingModule = await Test.createTestingModule({ + imports: [AppModule] + }).compile(); + app = testingModule.createNestApplication(); + appConfig(app); + await app.listen(3000); + }); + + afterAll(async () => { + await app.close(); + }, 60_000); // 1min + + beforeEach(async () => { + const manager = app.get(EntityManager); + const dbConnection = app.get(Connection); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + queryRunner = manager.queryRunner = dbConnection.createQueryRunner('master'); + await queryRunner.startTransaction(); + }); + + afterEach(async () => { + await queryRunner.rollbackTransaction(); + await queryRunner.release(); + }); + + it('should return only messages related to holder', async () => { + const [holder, user] = await Promise.all([randomUser(), randomUser()]); + const message = await createWriteMessage(validVC); + const message2 = await createWriteMessage(validVC); + + await Promise.all([ + request(app.getHttpServer()) + .post(`/v1/webnode`) + .send(await createRequest([message, message2], holder.did)) + .expect(201), + request(app.getHttpServer()) + .post(`/v1/webnode`) + .send(await createRequest([await createWriteMessage(validVC)], user.did)) + .expect(201) + ]); + + const queryMessage = await createQueryMessage({}); + const requestQueryObj = await createRequest([queryMessage], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestQueryObj).expect(201); + + expect(body).toEqual({ + requestId: requestQueryObj.requestId, + replies: [ + { + messageId: await generateCid(queryMessage), + status: { + code: 200, + message: 'OK' + }, + entries: [message, message2] + } + ] + }); + }); + + it('should find a message by object id', async () => { + const holder = await randomUser(); + const message = await createWriteMessage(validVC); + const message2 = await createWriteMessage(validVC); + const requestObject = await createRequest([message, message2], holder.did); + + await Promise.all([request(app.getHttpServer()).post(`/v1/webnode`).send(requestObject).expect(201)]); + + const queryMessage = await createQueryMessage({ + objectId: message.descriptor.objectId + }); + const requestQueryObj = await createRequest([queryMessage], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestQueryObj).expect(201); + + expect(body).toEqual({ + requestId: requestQueryObj.requestId, + replies: [ + { + messageId: await generateCid(queryMessage), + status: { + code: 200, + message: 'OK' + }, + entries: [message] + } + ] + }); + }); + + it('should find a messages by schema', async () => { + const holder = await randomUser(); + const message = await createWriteMessage(validVC); + const message2 = await createWriteMessage(validVC); + const message3 = await createWriteMessage(validVC, { + schema: 'https://schema.org/Person' + }); + const requestObject = await createRequest([message, message2, message3], holder.did); + + await Promise.all([request(app.getHttpServer()).post(`/v1/webnode`).send(requestObject).expect(201)]); + + const queryMessage = await createQueryMessage({ + schema: 'https://www.w3.org/2018/credentials#VerifiableCredential' + }); + const requestQueryObj = await createRequest([queryMessage], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestQueryObj).expect(201); + + expect(body).toEqual({ + requestId: requestQueryObj.requestId, + replies: [ + { + messageId: await generateCid(queryMessage), + status: { + code: 200, + message: 'OK' + }, + entries: [message, message2] + } + ] + }); + }); + + it('should find a messages by data format', async () => { + const holder = await randomUser(); + const message = await createWriteMessage(validVC); + const message2 = await createWriteMessage(validVC); + const message3 = await createWriteMessage(validVC, { + dataFormat: 'application/json' + }); + const requestObject = await createRequest([message, message2, message3], holder.did); + + await Promise.all([request(app.getHttpServer()).post(`/v1/webnode`).send(requestObject).expect(201)]); + + const queryMessage = await createQueryMessage({ + dataFormat: 'application/json' + }); + const requestQueryObj = await createRequest([queryMessage], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestQueryObj).expect(201); + + expect(body).toEqual({ + requestId: requestQueryObj.requestId, + replies: [ + { + messageId: await generateCid(queryMessage), + status: { + code: 200, + message: 'OK' + }, + entries: [message3] + } + ] + }); + }); + + it('should sort by date of creation', async () => { + const holder = await randomUser(); + const message = await createWriteMessage(validVC, { + dateCreated: Date.now() + }); + const message2 = await createWriteMessage(validVC, { + dateCreated: Date.now() - 10000 + }); + const requestObject = await createRequest([message, message2], holder.did); + + await Promise.all([request(app.getHttpServer()).post(`/v1/webnode`).send(requestObject).expect(201)]); + + const queryMessage1 = await createQueryMessage({ + dateSort: 'createdAscending' + }); + const requestQueryObj = await createRequest([queryMessage1], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestQueryObj).expect(201); + + expect(body).toEqual({ + requestId: requestQueryObj.requestId, + replies: [ + { + messageId: await generateCid(queryMessage1), + status: { + code: 200, + message: 'OK' + }, + entries: [message2, message] + } + ] + }); + + const queryMessage2 = await createQueryMessage({ + dateSort: 'createdDescending' + }); + const requestQueryOb2 = await createRequest([queryMessage2], holder.did); + + const { body: body2 } = await request(app.getHttpServer()) + .post(`/v1/webnode`) + .send(requestQueryOb2) + .expect(201); + + expect(body2).toEqual({ + requestId: requestQueryOb2.requestId, + replies: [ + { + messageId: await generateCid(queryMessage2), + status: { + code: 200, + message: 'OK' + }, + entries: [message, message2] + } + ] + }); + }); + + it('should sort by date of publishing', async () => { + const holder = await randomUser(); + const message = await createWriteMessage(validVC, { + datePublished: Date.now() + }); + const message2 = await createWriteMessage(validVC, { + datePublished: Date.now() - 10000 + }); + const requestObject = await createRequest([message, message2], holder.did); + + await Promise.all([request(app.getHttpServer()).post(`/v1/webnode`).send(requestObject).expect(201)]); + + const queryMessage1 = await createQueryMessage({ + dateSort: 'publishedAscending' + }); + const requestQueryObj = await createRequest([queryMessage1], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestQueryObj).expect(201); + + expect(body).toEqual({ + requestId: requestQueryObj.requestId, + replies: [ + { + messageId: await generateCid(queryMessage1), + status: { + code: 200, + message: 'OK' + }, + entries: [message2, message] + } + ] + }); + + const queryMessage2 = await createQueryMessage({ + dateSort: 'publishedDescending' + }); + const requestQueryOb2 = await createRequest([queryMessage2], holder.did); + + const { body: body2 } = await request(app.getHttpServer()) + .post(`/v1/webnode`) + .send(requestQueryOb2) + .expect(201); + + expect(body2).toEqual({ + requestId: requestQueryOb2.requestId, + replies: [ + { + messageId: await generateCid(queryMessage2), + status: { + code: 200, + message: 'OK' + }, + entries: [message, message2] + } + ] + }); + }); +}); diff --git a/apps/decentralized-web-node/test/decentralized-web-node/utils.ts b/apps/decentralized-web-node/test/decentralized-web-node/utils.ts new file mode 100644 index 00000000..836040be --- /dev/null +++ b/apps/decentralized-web-node/test/decentralized-web-node/utils.ts @@ -0,0 +1,67 @@ +import { v4 } from 'uuid'; +import { CID } from 'multiformats/cid'; +import * as json from 'multiformats/codecs/json'; +import { sha256 } from 'multiformats/hashes/sha2'; +import { DataSort } from '../../src/modules/decentralized-web-node/dtos/collections-query-descriptor.dto'; + +type UnPromisify = T extends Promise ? U : T; + +export const generateCid = async (data: Record) => { + const bytes = json.encode(data); + const hash = await sha256.digest(bytes); + const cid = CID.create(1, json.code, hash); + return cid.toString(); +}; + +export const createRequest = async ( + messages: ( + | UnPromisify> + | UnPromisify> + )[], + target: string +) => { + return { + requestId: v4(), + target, + messages + }; +}; + +export const createWriteMessage = async ( + dataObj: Record, + options?: { + schema?: string; + dateCreated?: number; + datePublished?: number; + dataFormat?: string; + } +) => { + const data = Buffer.from(JSON.stringify(dataObj)).toString('base64'); + return { + data, + descriptor: { + method: 'CollectionsWrite', + objectId: v4(), + schema: options?.schema || 'https://www.w3.org/2018/credentials#VerifiableCredential', + dateCreated: options?.dateCreated || Date.now(), + datePublished: options?.datePublished || Date.now(), + dataFormat: options?.dataFormat || 'application/ld+json', + cid: await generateCid(dataObj) + } + }; +}; + +export const createQueryMessage = async (options: { + objectId?: string; + schema?: string; + dataFormat?: string; + dateSort?: DataSort; + cid?: string; +}) => { + return { + descriptor: { + method: 'CollectionsQuery', + ...options + } + }; +}; diff --git a/apps/decentralized-web-node/test/decentralized-web-node/write-message.e2e-spec.ts b/apps/decentralized-web-node/test/decentralized-web-node/write-message.e2e-spec.ts new file mode 100644 index 00000000..21ade2c7 --- /dev/null +++ b/apps/decentralized-web-node/test/decentralized-web-node/write-message.e2e-spec.ts @@ -0,0 +1,214 @@ +import { Test } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import request from 'supertest'; +import { Connection, EntityManager, QueryRunner } from 'typeorm'; +import { AppModule } from '../../src/app.module'; +import { appConfig } from '../../src/common/test.utils'; +import { randomUser } from '../utils'; +import { validVC } from './fixtures/valid-vc'; +import { createQueryMessage, createRequest, createWriteMessage, generateCid } from './utils'; + +describe('Decentralized web node - Write message (version: 1)', () => { + let app: INestApplication; + let queryRunner: QueryRunner; + + beforeAll(async () => { + const testingModule = await Test.createTestingModule({ + imports: [AppModule] + }).compile(); + app = testingModule.createNestApplication(); + appConfig(app); + await app.listen(3000); + }); + + afterAll(async () => { + await app.close(); + }, 60_000); // 1min + + beforeEach(async () => { + const manager = app.get(EntityManager); + const dbConnection = app.get(Connection); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + queryRunner = manager.queryRunner = dbConnection.createQueryRunner('master'); + await queryRunner.startTransaction(); + }); + + afterEach(async () => { + await queryRunner.rollbackTransaction(); + await queryRunner.release(); + }); + + it('should result in error status when request object is invalid', async () => { + const holder = await randomUser(); + const requestObj = await createRequest([], holder.did); + + delete requestObj.messages; + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestObj).expect(400); + + expect(body).toEqual({ + requestId: requestObj.requestId, + status: { + code: 400, + message: 'The request object was malformed or improperly constructed' + } + }); + }); + + it('should write a valid message', async () => { + const holder = await randomUser(); + const message = await createWriteMessage(validVC); + const requestObj = await createRequest([message], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestObj).expect(201); + + expect(body).toEqual({ + requestId: requestObj.requestId, + replies: [ + { + messageId: await generateCid(message), + status: { + code: 201, + message: 'OK' + }, + entries: [message] + } + ] + }); + }); + + it('should result in error status when message in request object is invalid', async () => { + const holder = await randomUser(); + const requestObj = await createRequest([{ ...validVC } as never], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestObj).expect(201); + + expect(body).toEqual({ + requestId: requestObj.requestId, + replies: [ + { + messageId: await generateCid(validVC), + status: { + code: 400, + message: 'The message was malformed or improperly constructed' + } + } + ] + }); + }); + + it('should not affect message if another is invalid', async () => { + const holder = await randomUser(); + const message = await createWriteMessage(validVC); + const requestObj = await createRequest([message, validVC as never], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestObj).expect(201); + + expect(body).toEqual({ + requestId: requestObj.requestId, + replies: [ + { + messageId: await generateCid(message), + status: { + code: 201, + message: 'OK' + }, + entries: [message] + }, + { + messageId: await generateCid(validVC), + status: { + code: 400, + message: 'The message was malformed or improperly constructed' + } + } + ] + }); + + const queryMessage = await createQueryMessage({}); + const requestObjQuery = await createRequest([queryMessage], holder.did); + + const { body: queryBody } = await request(app.getHttpServer()) + .post(`/v1/webnode`) + .send(requestObjQuery) + .expect(201); + + expect(queryBody).toEqual({ + requestId: requestObjQuery.requestId, + replies: [ + { + entries: [message], + messageId: await generateCid(queryMessage), + status: { + code: 200, + message: 'OK' + } + } + ] + }); + }); + + it("should invalid message shouldn't be saved", async () => { + const holder = await randomUser(); + const requestObjWrite = await createRequest([validVC as never], holder.did); + + await request(app.getHttpServer()).post(`/v1/webnode`).send(requestObjWrite).expect(201); + + const queryMessage = await createQueryMessage({}); + const requestObjQuery = await createRequest([queryMessage], holder.did); + + const { body } = await request(app.getHttpServer()).post(`/v1/webnode`).send(requestObjQuery).expect(201); + + expect(body).toEqual({ + requestId: requestObjQuery.requestId, + replies: [ + { + entries: [], + messageId: await generateCid(queryMessage), + status: { + code: 200, + message: 'OK' + } + } + ] + }); + }); + + it('should be able to save the same message by two different holders', async () => { + const [holder1, holder2] = await Promise.all([randomUser(), randomUser()]); + const message = await createWriteMessage(validVC); + const requestObj1 = await createRequest([message], holder1.did); + const requestObj2 = await createRequest([message], holder2.did); + + const reply = { + messageId: await generateCid(message), + status: { + code: 201, + message: 'OK' + }, + entries: [message] + }; + + const { body: body1 } = await request(app.getHttpServer()) + .post(`/v1/webnode`) + .send(requestObj1) + .expect(201); + + expect(body1).toEqual({ + requestId: requestObj1.requestId, + replies: [reply] + }); + + const { body: body2 } = await request(app.getHttpServer()) + .post(`/v1/webnode`) + .send(requestObj2) + .expect(201); + + expect(body2).toEqual({ + requestId: requestObj2.requestId, + replies: [reply] + }); + }); +}); diff --git a/apps/decentralized-web-node/test/jest-e2e.json b/apps/decentralized-web-node/test/jest-e2e.json new file mode 100644 index 00000000..e9d912f3 --- /dev/null +++ b/apps/decentralized-web-node/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/decentralized-web-node/test/presentation-exchange/utils/add-credential.ts b/apps/decentralized-web-node/test/presentation-exchange/utils/add-credential.ts new file mode 100644 index 00000000..a67d7a03 --- /dev/null +++ b/apps/decentralized-web-node/test/presentation-exchange/utils/add-credential.ts @@ -0,0 +1,24 @@ +import { INestApplication } from '@nestjs/common'; +import request from 'supertest'; +import { createRequest, createWriteMessage } from '../../decentralized-web-node/utils'; +import { TestUser } from '../../utils'; + +/** + * @description add credential to storage + */ +export const addCredential = async ( + credentials: Record[], + holder: TestUser, + app: INestApplication +): Promise => { + const messages = await Promise.all([ + ...credentials.map(async (credential) => await createWriteMessage(credential)) + ]); + const requestObj = await createRequest(messages, holder.did); + + return await request(app.getHttpServer()) + .post(`/v1/webnode`) + .set('Cookie', holder.cookies) + .send(requestObj) + .expect(201); +}; diff --git a/apps/decentralized-web-node/test/presentation-exchange/utils/get-credential.ts b/apps/decentralized-web-node/test/presentation-exchange/utils/get-credential.ts new file mode 100644 index 00000000..7b4f68e3 --- /dev/null +++ b/apps/decentralized-web-node/test/presentation-exchange/utils/get-credential.ts @@ -0,0 +1,36 @@ +export const getCredential = (options: { + subject: string; + issuerFields: { key: string; value: string }[]; + namespace: string; + version: string; +}) => ({ + '@context': ['https://www.w3.org/2018/credentials/v1'], + id: 'urn:uuid:7f94d397-3e70-4a43-945e-1a13069e636f', + type: ['VerifiableCredential', 'EWFRole'], + credentialSubject: { + id: options.subject, + issuerFields: options.issuerFields, + role: { + namespace: options.namespace, + version: options.version + } + }, + issuer: 'did:example:123456789af312312i', + issuanceDate: '2022-03-18T08:57:32.477Z', + proof: { + '@context': 'https://demo.spruceid.com/ld/eip712sig-2021/v0.1.jsonld', + type: 'EthereumEip712Signature2021', + proofPurpose: 'assertionMethod', + proofValue: + '0x9abee96d684a146aa0b30498d8799ee9a4f8f54488c73d4a4fba3a6fb94eca8764af54f15a24deba0dd9ee2f460d1f6bd174a4ca7504a72d6b1fe9b739d613fe1b', + verificationMethod: 'did:pkh:eth:0x2fbf1be19d90a29aea9363f4ef0b6bf1c4ff0758#Recovery2020', + created: '2021-06-17T17:16:39.791Z', + eip712Domain: { + domain: { + name: 'EthereumEip712Signature2021' + }, + messageSchema: {}, + primaryType: 'VerifiableCredential' + } + } +}); diff --git a/apps/decentralized-web-node/test/presentation-exchange/vc-match.e2e-spec.ts b/apps/decentralized-web-node/test/presentation-exchange/vc-match.e2e-spec.ts new file mode 100644 index 00000000..51198396 --- /dev/null +++ b/apps/decentralized-web-node/test/presentation-exchange/vc-match.e2e-spec.ts @@ -0,0 +1,319 @@ +import { Test } from '@nestjs/testing'; +import { appConfig } from '../../src/common/test.utils'; +import { AppModule } from '../../src/app.module'; +import { Connection, EntityManager, QueryRunner } from 'typeorm'; +import { v4 } from 'uuid'; +import request from 'supertest'; +import { randomUser } from '../utils'; +import { addCredential } from './utils/add-credential'; +import { getCredential } from './utils/get-credential'; +import { INestApplication } from '@nestjs/common'; + +describe('Verifiable Presentation (version: 1)', () => { + let app: INestApplication; + let queryRunner: QueryRunner; + + beforeAll(async () => { + const testingModule = await Test.createTestingModule({ + imports: [AppModule] + }).compile(); + app = testingModule.createNestApplication(); + appConfig(app); + await app.listen(3000); + }); + + afterAll(async () => { + await app.close(); + }, 60_000); // 1min + + beforeEach(async () => { + const manager = app.get(EntityManager); + const dbConnection = app.get(Connection); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + queryRunner = manager.queryRunner = dbConnection.createQueryRunner('master'); + await queryRunner.startTransaction(); + }); + + afterEach(async () => { + await queryRunner.rollbackTransaction(); + await queryRunner.release(); + }); + + it(`should match one credential`, async () => { + const holder = await randomUser(); + const credentials = [ + getCredential({ + subject: holder.did, + issuerFields: [], + namespace: 'valid.iam.ewc', + version: '2' + }), + getCredential({ + subject: holder.did, + issuerFields: [], + namespace: 'valid.iam.ewc', + version: '1' + }), + getCredential({ + subject: holder.did, + issuerFields: [], + namespace: 'another.wrong.iam.ewc', + version: '1' + }) + ]; + + await addCredential(credentials, holder, app); + + const presentationDefinition = { + id: v4(), + input_descriptors: [ + { + id: 'valid_credential', + name: 'Required valid credential', + constraints: { + fields: [ + { + path: ['$.credentialSubject.role.namespace'], + filter: { + type: 'string', + const: 'valid.iam.ewc' + } + }, + { + path: ['$.credentialSubject.role.version'], + filter: { + type: 'string', + const: '1' + } + } + ] + } + } + ] + }; + + const { body } = await request(app.getHttpServer()) + .post(`/v1/vp/match/${holder.did}`) + .send(presentationDefinition) + .expect(201); + + expect(body).toEqual({ + errors: expect.any(Array), + matches: [ + { + name: 'Required valid credential', + rule: 'all', + vc_path: expect.any(Array) + } + ], + areRequiredCredentialsPresent: 'info', + verifiableCredential: [credentials[1]], + warnings: expect.any(Array) + }); + }); + + it(`should match two credential by issuer fields`, async () => { + const holder = await randomUser(); + const credentials = [ + getCredential({ + subject: holder.did, + issuerFields: [{ key: 'foo', value: 'valid' }], + namespace: 'org.iam.ewc', + version: '1' + }), + getCredential({ + subject: holder.did, + issuerFields: [{ key: 'foo', value: 'valid' }], + namespace: 'app.iam.ewc', + version: '1' + }), + getCredential({ + subject: holder.did, + issuerFields: [{ key: 'foo', value: 'wrong' }], + namespace: 'role.iam.ewc', + version: '1' + }) + ]; + + await addCredential(credentials, holder, app); + + const presentationDefinition = { + id: v4(), + input_descriptors: [ + { + id: 'valid_credential', + name: 'Required valid credential', + constraints: { + fields: [ + { + path: ['$.credentialSubject.issuerFields[*].value'], + filter: { + type: 'string', + const: 'valid' + } + } + ] + } + } + ] + }; + + const { body } = await request(app.getHttpServer()) + .post(`/v1/vp/match/${holder.did}`) + .send(presentationDefinition) + .expect(201); + + expect(body).toEqual({ + errors: expect.any(Array), + matches: [ + { + name: 'Required valid credential', + rule: 'all', + vc_path: expect.any(Array) + } + ], + areRequiredCredentialsPresent: 'info', + verifiableCredential: [credentials[0], credentials[1]], + warnings: expect.any(Array) + }); + }); + + it(`should not match any credential`, async () => { + const holder = await randomUser(); + const credentials = [ + getCredential({ + subject: holder.did, + issuerFields: [], + namespace: 'org.iam.ewc', + version: '1' + }) + ]; + + await addCredential(credentials, holder, app); + + const presentationDefinition = { + id: v4(), + input_descriptors: [ + { + id: 'valid_credential', + name: 'Required valid credential', + constraints: { + fields: [ + { + path: ['$.credentialSubject.issuerFields[*].value'], + filter: { + type: 'string', + const: 'valid' + } + } + ] + } + } + ] + }; + + const { body } = await request(app.getHttpServer()) + .post(`/v1/vp/match/${holder.did}`) + .send(presentationDefinition) + .expect(201); + + expect(body).toEqual({ + errors: expect.any(Array), + matches: [], + areRequiredCredentialsPresent: 'error', + verifiableCredential: [], + warnings: expect.any(Array) + }); + }); + + it(`should result with error when holder doesn't have credential`, async () => { + const holder = await randomUser(); + + const presentationDefinition = { + id: v4(), + input_descriptors: [ + { + id: 'valid_credential', + name: 'Required valid credential', + constraints: { + fields: [ + { + path: ['$.credentialSubject.issuerFields[*].value'], + filter: { + type: 'string', + const: 'valid' + } + } + ] + } + } + ] + }; + + const { body } = await request(app.getHttpServer()) + .post(`/v1/vp/match/${holder.did}`) + .send(presentationDefinition) + .expect(201); + + expect(body).toEqual({ + errors: expect.any(Array), + matches: [], + areRequiredCredentialsPresent: 'error', + verifiableCredential: [], + warnings: expect.any(Array) + }); + }); + + it(`should result with error when holder doesn't have credential and presentation definition is empty`, async () => { + const holder = await randomUser(); + + const presentationDefinition = { + id: v4(), + input_descriptors: [] + }; + + const { body } = await request(app.getHttpServer()) + .post(`/v1/vp/match/${holder.did}`) + .send(presentationDefinition) + .expect(201); + + expect(body).toEqual({ + errors: expect.any(Array), + matches: [], + areRequiredCredentialsPresent: 'error', + verifiableCredential: [], + warnings: expect.any(Array) + }); + }); + + it(`should result with error when presentation definition object is malformed`, async () => { + const holder = await randomUser(); + + const presentationDefinition = { + id: v4(), + input_descriptors: [ + { + id: 'valid_credential', + name: 'Required valid credential', + constraints: { + fields: [ + { + filter: { + type: 'string', + const: 'valid' + } + } + ] + } + } + ] + }; + + await request(app.getHttpServer()) + .post(`/v1/vp/match/${holder.did}`) + .send(presentationDefinition) + .expect(400); + }); +}); diff --git a/apps/decentralized-web-node/test/utils.ts b/apps/decentralized-web-node/test/utils.ts new file mode 100644 index 00000000..c068c7e5 --- /dev/null +++ b/apps/decentralized-web-node/test/utils.ts @@ -0,0 +1,14 @@ +import { Wallet } from 'ethers'; + +export interface TestUser { + did: string; +} + +export const randomUser = async (): Promise => { + const wallet = Wallet.createRandom(); + const did = `did:ethr:volta:${wallet.address}`; + + return { + did + }; +}; diff --git a/apps/decentralized-web-node/tsconfig.build.json b/apps/decentralized-web-node/tsconfig.build.json new file mode 100644 index 00000000..c9c97fb6 --- /dev/null +++ b/apps/decentralized-web-node/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "sourceMap": true, + "inlineSources": true, + "sourceRoot": "/" + }, + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/apps/decentralized-web-node/tsconfig.json b/apps/decentralized-web-node/tsconfig.json new file mode 100644 index 00000000..f13cb716 --- /dev/null +++ b/apps/decentralized-web-node/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2019", + "outDir": "dist", + "incremental": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "esModuleInterop": true, + "lib": ["ES2020"], + "noUnusedLocals": true, + "skipLibCheck": true + } +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 55bb1201..37684e77 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1,109 +1,141 @@ lockfileVersion: 5.3 specifiers: - '@nestjs/axios': ~0.0.7 - '@nestjs/cli': ^8.0.0 - '@nestjs/common': ^8.0.0 - '@nestjs/config': ~1.1.0 - '@nestjs/core': ^8.0.0 - '@nestjs/platform-express': ^8.0.0 - '@nestjs/schematics': ^8.0.0 - '@nestjs/swagger': ~5.1.5 - '@nestjs/testing': ^8.0.0 + '@energyweb/eslint-config': ^0.0.2 + '@energyweb/prettier-config': ^0.0.1 + '@ew-did-registry/credentials-interface': ^0.6.3-alpha.531.0 + '@nestjs/jwt': ^8.0.0 + '@nestjs/passport': ^8.1.0 + '@nestjs/terminus': ^8.0.1 '@nestjs/typeorm': ^8.0.2 '@rush-temp/ssi-did': file:./projects/ssi-did.tgz + '@rush-temp/ssi-dwn': file:./projects/ssi-dwn.tgz '@rush-temp/ssi-vc-api': file:./projects/ssi-vc-api.tgz '@rush-temp/w3c-ccg-webkms': file:./projects/w3c-ccg-webkms.tgz '@rushstack/eslint-config': ~2.3.2 - '@sphereon/pex': ~1.0.2 + '@sentry/integrations': ^6.2.2 + '@sentry/node': ^6.16.1 + '@sentry/tracing': ^6.16.1 + '@sentry/types': ^6.2.2 '@spruceid/didkit-wasm-node': ~0.1.6 '@trust/keyto': ^1.0.1 - '@types/express': ^4.17.13 - '@types/jest': ^26.0.24 - '@types/node': ^16.0.0 - '@types/supertest': ^2.0.11 - '@typescript-eslint/eslint-plugin': ^4.28.2 - '@typescript-eslint/parser': ^4.28.2 + '@types/compression': ^1.7.0 + '@types/cookie-parser': ^1.4.2 + '@types/jsonwebtoken': ^8.5.8 + '@types/passport': ^1.0.7 + '@types/passport-jwt': ^3.0.3 + '@types/uuid': ^8.3.0 babel-jest: 26.6.3 + base64url: ^3.0.1 better-sqlite3: ~7.5.0 - class-transformer: ~0.4.0 - class-validator: ~0.13.1 + compression: ^1.7.4 + cookie-parser: ^1.4.5 did-resolver: ~3.1.3 - eslint: ^7.30.0 + dotenv: ^10.0.0 eslint-config-prettier: ^8.3.0 + eslint-plugin-import: ^2.25.4 eslint-plugin-prettier: ^3.4.0 - ethers: 5.5.1 ethr-did-resolver: ~5.0.2 - jest: 27.0.6 + express: ^4.18.0 + helmet: ^4.4.1 jose: ^4.1.5 + jsonwebtoken: ^8.5.1 + multiformats: ^9.6.4 nock: ~13.2.4 - prettier: ^2.3.2 + npm-run-all: ^4.1.5 + passport: ^0.5.2 + passport-jwt: ^4.0.0 + pg: ^8.5.1 + redact-pii: ^3.2.3 reflect-metadata: ^0.1.13 rimraf: ^3.0.2 - rxjs: ^7.2.0 - supertest: ^6.1.3 - swagger-ui-express: ~4.1.6 - ts-jest: ^27.0.3 - ts-loader: ^9.2.3 - ts-node: ^10.7.0 tsconfig-paths: ^3.10.1 - typeorm: ^0.2.38 + typedoc: ^0.22.0 + typedoc-plugin-markdown: ^3.11.0 typescript: ^4.3.5 - uuid: ~8.3.2 + winston: ^3.3.3 + winston-daily-rotate-file: ^4.5.0 dependencies: - '@nestjs/axios': 0.0.7_b3e6921aee41404e2866237bfdfd83a3 - '@nestjs/cli': 8.1.4_eslint@7.32.0 - '@nestjs/common': 8.1.2_43f93dd897e68fe834a23ddd32fb54cc - '@nestjs/config': 1.1.0_b3e6921aee41404e2866237bfdfd83a3 - '@nestjs/core': 8.1.2_3d1cfdac3af6acf6d20b789f19aaf219 - '@nestjs/platform-express': 8.1.2_bbf59b1cbf49bba2b2f47e404ee3cb27 - '@nestjs/schematics': 8.0.4_typescript@4.4.4 - '@nestjs/swagger': 5.1.5_ea14560b646b9e6de5a63f20f1277708 - '@nestjs/testing': 8.1.2_830699a7a1bc4b367722dd63c0377123 - '@nestjs/typeorm': 8.0.2_12346420c5d0822584d78b786936ea28 - '@rush-temp/ssi-did': file:projects/ssi-did.tgz_ts-node@10.7.0 - '@rush-temp/ssi-vc-api': file:projects/ssi-vc-api.tgz_babel-jest@26.6.3 + '@energyweb/eslint-config': 0.0.2_eslint-config-prettier@8.3.0 + '@energyweb/prettier-config': 0.0.1 + '@ew-did-registry/credentials-interface': 0.6.3-alpha.544.0 + '@nestjs/jwt': 8.0.0 + '@nestjs/passport': 8.2.1_passport@0.5.2 + '@nestjs/terminus': 8.0.6_reflect-metadata@0.1.13 + '@nestjs/typeorm': 8.0.2_reflect-metadata@0.1.13 + '@rush-temp/ssi-did': file:projects/ssi-did.tgz + '@rush-temp/ssi-dwn': file:projects/ssi-dwn.tgz_3531d2b0a9f1221b1fd25b1e07e67c0c + '@rush-temp/ssi-vc-api': file:projects/ssi-vc-api.tgz_d5cea2b3b7dbbc9c57a422dfbe2b3170 '@rush-temp/w3c-ccg-webkms': file:projects/w3c-ccg-webkms.tgz - '@rushstack/eslint-config': 2.3.4_eslint@7.32.0+typescript@4.4.4 - '@sphereon/pex': 1.0.2 + '@rushstack/eslint-config': 2.3.4_typescript@4.4.4 + '@sentry/integrations': 6.19.6 + '@sentry/node': 6.19.6 + '@sentry/tracing': 6.19.6 + '@sentry/types': 6.19.6 '@spruceid/didkit-wasm-node': 0.1.6 '@trust/keyto': 1.0.1 - '@types/express': 4.17.13 - '@types/jest': 26.0.24 - '@types/node': 16.11.6 - '@types/supertest': 2.0.11 - '@typescript-eslint/eslint-plugin': 4.33.0_cc617358c89d3f38c52462f6d809db4c - '@typescript-eslint/parser': 4.33.0_eslint@7.32.0+typescript@4.4.4 + '@types/compression': 1.7.2 + '@types/cookie-parser': 1.4.2 + '@types/jsonwebtoken': 8.5.8 + '@types/passport': 1.0.7 + '@types/passport-jwt': 3.0.6 + '@types/uuid': 8.3.4 babel-jest: 26.6.3 + base64url: 3.0.1 better-sqlite3: 7.5.0 - class-transformer: 0.4.0 - class-validator: 0.13.1 + compression: 1.7.4 + cookie-parser: 1.4.6 did-resolver: 3.1.3 - eslint: 7.32.0 - eslint-config-prettier: 8.3.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_6e975bd57c7acf028c1a9ddbbf60c898 - ethers: 5.5.1 + dotenv: 10.0.0 + eslint-config-prettier: 8.3.0 + eslint-plugin-import: 2.26.0 + eslint-plugin-prettier: 3.4.1_eslint-config-prettier@8.3.0 ethr-did-resolver: 5.0.2 - jest: 27.0.6_ts-node@10.7.0 + express: 4.18.0 + helmet: 4.6.0 jose: 4.1.5 + jsonwebtoken: 8.5.1 + multiformats: 9.6.4 nock: 13.2.4 - prettier: 2.4.1 + npm-run-all: 4.1.5 + passport: 0.5.2 + passport-jwt: 4.0.0 + pg: 8.7.3 + redact-pii: 3.2.3 reflect-metadata: 0.1.13 rimraf: 3.0.2 - rxjs: 7.4.0 - supertest: 6.1.6 - swagger-ui-express: 4.1.6 - ts-jest: 27.0.7_ec3222e78695a6b5e6d9aa95aceec9d7 - ts-loader: 9.2.6_typescript@4.4.4 - ts-node: 10.7.0_0cb88d80cb04d25b21fa3ec194608c65 tsconfig-paths: 3.11.0 - typeorm: 0.2.38_better-sqlite3@7.5.0 + typedoc: 0.22.15_typescript@4.4.4 + typedoc-plugin-markdown: 3.12.1_typedoc@0.22.15 typescript: 4.4.4 - uuid: 8.3.2 + winston: 3.7.2 + winston-daily-rotate-file: 4.6.1_winston@3.7.2 packages: + /@angular-devkit/core/11.2.4: + resolution: {integrity: sha512-98mGDV4XtKWiQ/2D6yzvOHrnJovXchaAN9AjscAHd2an8Fkiq72d9m2wREpk+2J40NWTDB6J5iesTh3qbi8+CA==} + engines: {node: '>= 10.13.0', npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} + dependencies: + ajv: 6.12.6 + fast-json-stable-stringify: 2.1.0 + magic-string: 0.25.7 + rxjs: 6.6.3 + source-map: 0.7.3 + dev: false + + /@angular-devkit/core/11.2.6: + resolution: {integrity: sha512-3dA0Z6sIIxCDjZS/DucgmIKti7EZ/LgHoHgCO72Q50H5ZXbUSNBz5wGl5hVq2+gzrnFgU/0u40MIs6eptk30ZA==} + engines: {node: '>= 10.13.0', npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} + dependencies: + ajv: 6.12.6 + fast-json-stable-stringify: 2.1.0 + magic-string: 0.25.7 + rxjs: 6.6.3 + source-map: 0.7.3 + dev: false + /@angular-devkit/core/12.2.10: resolution: {integrity: sha512-0qhmS7Qvl0hiRVTHxEC/ipFAfzYofPstw0ZITDpEMw+pgHlOZolOlnFrv8LyOXWNqlSIH5fS9D3WF7Hpm7ApYA==} engines: {node: ^12.14.1 || >=14.0.0, npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} @@ -116,6 +148,20 @@ packages: source-map: 0.7.3 dev: false + /@angular-devkit/schematics-cli/0.1102.6: + resolution: {integrity: sha512-86PmafA9mYDeM08cNWHcJCEY1Yqo5aq/YaBzCak93luByDQ4Ao4Jqts9l/xBCZBGUdVrczCNzcdwr/Y/6JPPzA==} + engines: {node: '>= 10.13.0', npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} + hasBin: true + dependencies: + '@angular-devkit/core': 11.2.6 + '@angular-devkit/schematics': 11.2.6 + '@schematics/schematics': 0.1102.6 + ansi-colors: 4.1.1 + inquirer: 7.3.3 + minimist: 1.2.5 + symbol-observable: 3.0.0 + dev: false + /@angular-devkit/schematics-cli/12.2.10: resolution: {integrity: sha512-eXzsQ4nM+g4EB0Ixh8rdN1hhm1KEnjychhITvzHgIFSLu0n6o8g36PrZgvshzvHlJViViNztm9uKjX54eaJ/Dw==} engines: {node: ^12.14.1 || >=14.0.0, npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} @@ -129,6 +175,24 @@ packages: symbol-observable: 4.0.0 dev: false + /@angular-devkit/schematics/11.2.4: + resolution: {integrity: sha512-M9Ike1TYawOIHzenlZS1ufQbsS+Z11/doj5w/UrU0q2OEKc6U375t5qVGgKo3PLHHS8osb9aW9xYwBfVlKrryQ==} + engines: {node: '>= 10.13.0', npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 11.2.4 + ora: 5.3.0 + rxjs: 6.6.3 + dev: false + + /@angular-devkit/schematics/11.2.6: + resolution: {integrity: sha512-bhi2+5xtVAjtr3bsXKT8pnoBamQrArd/Y20ueA4Od7cd38YT97nzTA1wyHBFG0vWd0HMyg42ZS0aycNBuOebaA==} + engines: {node: '>= 10.13.0', npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 11.2.6 + ora: 5.3.0 + rxjs: 6.6.3 + dev: false + /@angular-devkit/schematics/12.2.10: resolution: {integrity: sha512-oQ2EWdkEDE+eAttHeviXsvBi85PsntQT+IffjKUZdbQU+Leuk/pKUpTeea1YosU1p4Cz3PKYF+P/Nl5Jy3B7IQ==} engines: {node: ^12.14.1 || >=14.0.0, npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} @@ -588,7 +652,12 @@ packages: hasBin: true dependencies: exec-sh: 0.3.6 - minimist: 1.2.5 + minimist: 1.2.6 + dev: false + + /@colors/colors/1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} dev: false /@cspotcode/source-map-consumer/0.8.0: @@ -603,6 +672,53 @@ packages: '@cspotcode/source-map-consumer': 0.8.0 dev: false + /@dabh/diagnostics/2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: false + + /@energyweb/eslint-config/0.0.2_d41a4af51b1c03c3d063f54fbed72fd6: + resolution: {integrity: sha512-BZCl84xWpXTq6hkT5aD2Q/U691FW+IDNn7HYOVej5/8QgOx+uEjOj2GimdlvXUivJViMz6XDVzzwv9yWvCwbVQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': '>= 5' + '@typescript-eslint/parser': '>= 5' + eslint: '>= 8' + eslint-config-prettier: '>= 8' + dependencies: + '@typescript-eslint/eslint-plugin': 5.20.0_3edef4978842152df7a6e247a241934b + '@typescript-eslint/parser': 5.20.0_eslint@8.14.0+typescript@4.4.4 + eslint: 8.14.0 + eslint-config-prettier: 8.3.0_eslint@8.14.0 + dev: false + + /@energyweb/eslint-config/0.0.2_eslint-config-prettier@8.3.0: + resolution: {integrity: sha512-BZCl84xWpXTq6hkT5aD2Q/U691FW+IDNn7HYOVej5/8QgOx+uEjOj2GimdlvXUivJViMz6XDVzzwv9yWvCwbVQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': '>= 5' + '@typescript-eslint/parser': '>= 5' + eslint: '>= 8' + eslint-config-prettier: '>= 8' + dependencies: + eslint-config-prettier: 8.3.0 + dev: false + + /@energyweb/prettier-config/0.0.1: + resolution: {integrity: sha512-4Bh2nbDO1JkGRVZ2Ub0fdgmRTLMQa2eoB2U5jo7o8M/ivqFxyZbPRWSgwfahyHvxjev1bUi25FayWee5zMRrkg==} + peerDependencies: + prettier: '>= 2' + dev: false + + /@energyweb/prettier-config/0.0.1_prettier@2.6.2: + resolution: {integrity: sha512-4Bh2nbDO1JkGRVZ2Ub0fdgmRTLMQa2eoB2U5jo7o8M/ivqFxyZbPRWSgwfahyHvxjev1bUi25FayWee5zMRrkg==} + peerDependencies: + prettier: '>= 2' + dependencies: + prettier: 2.6.2 + dev: false + /@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -614,7 +730,24 @@ packages: ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 - minimatch: 3.0.4 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@eslint/eslintrc/1.2.2: + resolution: {integrity: sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.2 + espree: 9.3.1 + globals: 13.12.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -634,16 +767,42 @@ packages: '@ethersproject/strings': 5.5.0 dev: false + /@ethersproject/abi/5.6.1: + resolution: {integrity: sha512-0cqssYh6FXjlwKWBmLm3+zH2BNARoS5u/hxbz+LpQmcDB3w0W553h2btWui1/uZp2GBM/SI3KniTuMcYyHpA5w==} + dependencies: + '@ethersproject/address': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/constants': 5.6.0 + '@ethersproject/hash': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 + dev: false + /@ethersproject/abstract-provider/5.5.1: resolution: {integrity: sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==} dependencies: - '@ethersproject/bignumber': 5.5.0 - '@ethersproject/bytes': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/networks': 5.5.0 - '@ethersproject/properties': 5.5.0 - '@ethersproject/transactions': 5.5.0 - '@ethersproject/web': 5.5.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/networks': 5.6.2 + '@ethersproject/properties': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/web': 5.6.0 + dev: false + + /@ethersproject/abstract-provider/5.6.0: + resolution: {integrity: sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw==} + dependencies: + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/networks': 5.6.2 + '@ethersproject/properties': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/web': 5.6.0 dev: false /@ethersproject/abstract-signer/5.5.0: @@ -656,6 +815,16 @@ packages: '@ethersproject/properties': 5.5.0 dev: false + /@ethersproject/abstract-signer/5.6.0: + resolution: {integrity: sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ==} + dependencies: + '@ethersproject/abstract-provider': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + dev: false + /@ethersproject/address/5.5.0: resolution: {integrity: sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==} dependencies: @@ -666,10 +835,26 @@ packages: '@ethersproject/rlp': 5.5.0 dev: false + /@ethersproject/address/5.6.0: + resolution: {integrity: sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ==} + dependencies: + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/rlp': 5.6.0 + dev: false + /@ethersproject/base64/5.5.0: resolution: {integrity: sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==} dependencies: - '@ethersproject/bytes': 5.5.0 + '@ethersproject/bytes': 5.6.1 + dev: false + + /@ethersproject/base64/5.6.0: + resolution: {integrity: sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw==} + dependencies: + '@ethersproject/bytes': 5.6.1 dev: false /@ethersproject/basex/5.5.0: @@ -679,6 +864,13 @@ packages: '@ethersproject/properties': 5.5.0 dev: false + /@ethersproject/basex/5.6.0: + resolution: {integrity: sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/properties': 5.6.0 + dev: false + /@ethersproject/bignumber/5.5.0: resolution: {integrity: sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==} dependencies: @@ -687,16 +879,36 @@ packages: bn.js: 4.12.0 dev: false + /@ethersproject/bignumber/5.6.0: + resolution: {integrity: sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + bn.js: 4.12.0 + dev: false + /@ethersproject/bytes/5.5.0: resolution: {integrity: sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==} dependencies: - '@ethersproject/logger': 5.5.0 + '@ethersproject/logger': 5.6.0 + dev: false + + /@ethersproject/bytes/5.6.1: + resolution: {integrity: sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==} + dependencies: + '@ethersproject/logger': 5.6.0 dev: false /@ethersproject/constants/5.5.0: resolution: {integrity: sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==} dependencies: - '@ethersproject/bignumber': 5.5.0 + '@ethersproject/bignumber': 5.6.0 + dev: false + + /@ethersproject/constants/5.6.0: + resolution: {integrity: sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA==} + dependencies: + '@ethersproject/bignumber': 5.6.0 dev: false /@ethersproject/contracts/5.5.0: @@ -714,50 +926,113 @@ packages: '@ethersproject/transactions': 5.5.0 dev: false + /@ethersproject/contracts/5.6.0: + resolution: {integrity: sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw==} + dependencies: + '@ethersproject/abi': 5.6.1 + '@ethersproject/abstract-provider': 5.6.0 + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/constants': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/transactions': 5.6.0 + dev: false + /@ethersproject/hash/5.5.0: resolution: {integrity: sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==} dependencies: - '@ethersproject/abstract-signer': 5.5.0 - '@ethersproject/address': 5.5.0 - '@ethersproject/bignumber': 5.5.0 - '@ethersproject/bytes': 5.5.0 - '@ethersproject/keccak256': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/properties': 5.5.0 - '@ethersproject/strings': 5.5.0 + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 + dev: false + + /@ethersproject/hash/5.6.0: + resolution: {integrity: sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA==} + dependencies: + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 dev: false /@ethersproject/hdnode/5.5.0: resolution: {integrity: sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q==} dependencies: - '@ethersproject/abstract-signer': 5.5.0 - '@ethersproject/basex': 5.5.0 - '@ethersproject/bignumber': 5.5.0 - '@ethersproject/bytes': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/pbkdf2': 5.5.0 - '@ethersproject/properties': 5.5.0 - '@ethersproject/sha2': 5.5.0 - '@ethersproject/signing-key': 5.5.0 - '@ethersproject/strings': 5.5.0 - '@ethersproject/transactions': 5.5.0 - '@ethersproject/wordlists': 5.5.0 + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/basex': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/pbkdf2': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/signing-key': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/wordlists': 5.6.0 + dev: false + + /@ethersproject/hdnode/5.6.0: + resolution: {integrity: sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw==} + dependencies: + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/basex': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/pbkdf2': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/signing-key': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/wordlists': 5.6.0 dev: false /@ethersproject/json-wallets/5.5.0: resolution: {integrity: sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ==} dependencies: - '@ethersproject/abstract-signer': 5.5.0 - '@ethersproject/address': 5.5.0 - '@ethersproject/bytes': 5.5.0 - '@ethersproject/hdnode': 5.5.0 - '@ethersproject/keccak256': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/pbkdf2': 5.5.0 - '@ethersproject/properties': 5.5.0 - '@ethersproject/random': 5.5.0 - '@ethersproject/strings': 5.5.0 - '@ethersproject/transactions': 5.5.0 + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/hdnode': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/pbkdf2': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/random': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: false + + /@ethersproject/json-wallets/5.6.0: + resolution: {integrity: sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ==} + dependencies: + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/hdnode': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/pbkdf2': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/random': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 aes-js: 3.0.0 scrypt-js: 3.0.1 dev: false @@ -765,7 +1040,14 @@ packages: /@ethersproject/keccak256/5.5.0: resolution: {integrity: sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==} dependencies: - '@ethersproject/bytes': 5.5.0 + '@ethersproject/bytes': 5.6.1 + js-sha3: 0.8.0 + dev: false + + /@ethersproject/keccak256/5.6.0: + resolution: {integrity: sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w==} + dependencies: + '@ethersproject/bytes': 5.6.1 js-sha3: 0.8.0 dev: false @@ -773,23 +1055,46 @@ packages: resolution: {integrity: sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==} dev: false + /@ethersproject/logger/5.6.0: + resolution: {integrity: sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==} + dev: false + /@ethersproject/networks/5.5.0: resolution: {integrity: sha512-KWfP3xOnJeF89Uf/FCJdV1a2aDJe5XTN2N52p4fcQ34QhDqQFkgQKZ39VGtiqUgHcLI8DfT0l9azC3KFTunqtA==} dependencies: - '@ethersproject/logger': 5.5.0 + '@ethersproject/logger': 5.6.0 + dev: false + + /@ethersproject/networks/5.6.2: + resolution: {integrity: sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA==} + dependencies: + '@ethersproject/logger': 5.6.0 dev: false /@ethersproject/pbkdf2/5.5.0: resolution: {integrity: sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg==} dependencies: - '@ethersproject/bytes': 5.5.0 - '@ethersproject/sha2': 5.5.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/sha2': 5.6.0 + dev: false + + /@ethersproject/pbkdf2/5.6.0: + resolution: {integrity: sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/sha2': 5.6.0 dev: false /@ethersproject/properties/5.5.0: resolution: {integrity: sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==} dependencies: - '@ethersproject/logger': 5.5.0 + '@ethersproject/logger': 5.6.0 + dev: false + + /@ethersproject/properties/5.6.0: + resolution: {integrity: sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg==} + dependencies: + '@ethersproject/logger': 5.6.0 dev: false /@ethersproject/providers/5.5.0: @@ -819,34 +1124,94 @@ packages: - utf-8-validate dev: false + /@ethersproject/providers/5.6.4: + resolution: {integrity: sha512-WAdknnaZ52hpHV3qPiJmKx401BLpup47h36Axxgre9zT+doa/4GC/Ne48ICPxTm0BqndpToHjpLP1ZnaxyE+vw==} + dependencies: + '@ethersproject/abstract-provider': 5.6.0 + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/basex': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/constants': 5.6.0 + '@ethersproject/hash': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/networks': 5.6.2 + '@ethersproject/properties': 5.6.0 + '@ethersproject/random': 5.6.0 + '@ethersproject/rlp': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/web': 5.6.0 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@ethersproject/random/5.5.0: resolution: {integrity: sha512-egGYZwZ/YIFKMHcoBUo8t3a8Hb/TKYX8BCBoLjudVCZh892welR3jOxgOmb48xznc9bTcMm7Tpwc1gHC1PFNFQ==} dependencies: - '@ethersproject/bytes': 5.5.0 - '@ethersproject/logger': 5.5.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + dev: false + + /@ethersproject/random/5.6.0: + resolution: {integrity: sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 dev: false /@ethersproject/rlp/5.5.0: resolution: {integrity: sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==} dependencies: - '@ethersproject/bytes': 5.5.0 - '@ethersproject/logger': 5.5.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + dev: false + + /@ethersproject/rlp/5.6.0: + resolution: {integrity: sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 dev: false /@ethersproject/sha2/5.5.0: resolution: {integrity: sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==} dependencies: - '@ethersproject/bytes': 5.5.0 - '@ethersproject/logger': 5.5.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + hash.js: 1.1.7 + dev: false + + /@ethersproject/sha2/5.6.0: + resolution: {integrity: sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 hash.js: 1.1.7 dev: false /@ethersproject/signing-key/5.5.0: resolution: {integrity: sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==} dependencies: - '@ethersproject/bytes': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/properties': 5.5.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + bn.js: 4.12.0 + elliptic: 6.5.4 + hash.js: 1.1.7 + dev: false + + /@ethersproject/signing-key/5.6.0: + resolution: {integrity: sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 bn.js: 4.12.0 elliptic: 6.5.4 hash.js: 1.1.7 @@ -855,20 +1220,39 @@ packages: /@ethersproject/solidity/5.5.0: resolution: {integrity: sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw==} dependencies: - '@ethersproject/bignumber': 5.5.0 - '@ethersproject/bytes': 5.5.0 - '@ethersproject/keccak256': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/sha2': 5.5.0 - '@ethersproject/strings': 5.5.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/strings': 5.6.0 + dev: false + + /@ethersproject/solidity/5.6.0: + resolution: {integrity: sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww==} + dependencies: + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/strings': 5.6.0 dev: false /@ethersproject/strings/5.5.0: resolution: {integrity: sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==} dependencies: - '@ethersproject/bytes': 5.5.0 - '@ethersproject/constants': 5.5.0 - '@ethersproject/logger': 5.5.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/constants': 5.6.0 + '@ethersproject/logger': 5.6.0 + dev: false + + /@ethersproject/strings/5.6.0: + resolution: {integrity: sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/constants': 5.6.0 + '@ethersproject/logger': 5.6.0 dev: false /@ethersproject/transactions/5.5.0: @@ -885,70 +1269,179 @@ packages: '@ethersproject/signing-key': 5.5.0 dev: false + /@ethersproject/transactions/5.6.0: + resolution: {integrity: sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg==} + dependencies: + '@ethersproject/address': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/constants': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/rlp': 5.6.0 + '@ethersproject/signing-key': 5.6.0 + dev: false + /@ethersproject/units/5.5.0: resolution: {integrity: sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag==} dependencies: - '@ethersproject/bignumber': 5.5.0 - '@ethersproject/constants': 5.5.0 - '@ethersproject/logger': 5.5.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/constants': 5.6.0 + '@ethersproject/logger': 5.6.0 + dev: false + + /@ethersproject/units/5.6.0: + resolution: {integrity: sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw==} + dependencies: + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/constants': 5.6.0 + '@ethersproject/logger': 5.6.0 dev: false /@ethersproject/wallet/5.5.0: resolution: {integrity: sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q==} dependencies: - '@ethersproject/abstract-provider': 5.5.1 - '@ethersproject/abstract-signer': 5.5.0 - '@ethersproject/address': 5.5.0 - '@ethersproject/bignumber': 5.5.0 - '@ethersproject/bytes': 5.5.0 - '@ethersproject/hash': 5.5.0 - '@ethersproject/hdnode': 5.5.0 - '@ethersproject/json-wallets': 5.5.0 - '@ethersproject/keccak256': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/properties': 5.5.0 - '@ethersproject/random': 5.5.0 - '@ethersproject/signing-key': 5.5.0 - '@ethersproject/transactions': 5.5.0 - '@ethersproject/wordlists': 5.5.0 + '@ethersproject/abstract-provider': 5.6.0 + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/hash': 5.6.0 + '@ethersproject/hdnode': 5.6.0 + '@ethersproject/json-wallets': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/random': 5.6.0 + '@ethersproject/signing-key': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/wordlists': 5.6.0 + dev: false + + /@ethersproject/wallet/5.6.0: + resolution: {integrity: sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg==} + dependencies: + '@ethersproject/abstract-provider': 5.6.0 + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/hash': 5.6.0 + '@ethersproject/hdnode': 5.6.0 + '@ethersproject/json-wallets': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/random': 5.6.0 + '@ethersproject/signing-key': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/wordlists': 5.6.0 dev: false /@ethersproject/web/5.5.0: resolution: {integrity: sha512-BEgY0eL5oH4mAo37TNYVrFeHsIXLRxggCRG/ksRIxI2X5uj5IsjGmcNiRN/VirQOlBxcUhCgHhaDLG4m6XAVoA==} dependencies: - '@ethersproject/base64': 5.5.0 - '@ethersproject/bytes': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/properties': 5.5.0 - '@ethersproject/strings': 5.5.0 + '@ethersproject/base64': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 + dev: false + + /@ethersproject/web/5.6.0: + resolution: {integrity: sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg==} + dependencies: + '@ethersproject/base64': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 dev: false /@ethersproject/wordlists/5.5.0: resolution: {integrity: sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q==} dependencies: - '@ethersproject/bytes': 5.5.0 - '@ethersproject/hash': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/properties': 5.5.0 - '@ethersproject/strings': 5.5.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/hash': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 dev: false - /@ew-did-registry/did/0.6.0: - resolution: {integrity: sha512-GOvIDdu5giS3I8E+mhOMzHXNu1mq1VXAT3NPchOHslVcI1LVLgtgXIfudoAMleL/XjVhSb18JoPKboGGGzRG8A==} + /@ethersproject/wordlists/5.6.0: + resolution: {integrity: sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q==} + dependencies: + '@ethersproject/bytes': 5.6.1 + '@ethersproject/hash': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/strings': 5.6.0 dev: false - /@humanwhocodes/config-array/0.5.0: - resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} - engines: {node: '>=10.10.0'} + /@ew-did-registry/credentials-interface/0.6.3-alpha.544.0: + resolution: {integrity: sha512-ZSf6MDG5kJwq5XVrwBl5ChN63KPMqiLUJb3IOmlcd2gBLTpRMchYfo79XLtJd23ABzT7TULbdivnQMuUxcqLPA==} dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.2 - minimatch: 3.0.4 - transitivePeerDependencies: - - supports-color + '@ethersproject/abstract-signer': 5.6.0 + '@sphereon/pex': 1.0.2 + '@types/lodash': 4.14.182 + lodash: 4.17.21 dev: false - /@humanwhocodes/object-schema/1.2.1: + /@google-cloud/dlp/0.12.0: + resolution: {integrity: sha512-yaVK6JXAZc9c85dNX0V+TZA0l4O15JhmpNwox+AuK9ghifzhd1b6vwq9fOoX8uK9lBhpG59xkLz4pMrR9ESBsw==} + engines: {node: '>=6.0.0'} + dependencies: + google-gax: 0.25.6 + lodash.merge: 4.6.2 + protobufjs: 6.11.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@google-cloud/promisify/0.4.0: + resolution: {integrity: sha512-4yAHDC52TEMCNcMzVC8WlqnKKKq+Ssi2lXoUg9zWWkZ6U6tq9ZBRYLHHCRdfU+EU9YJsVmivwGcKYCjRGjnf4Q==} + dev: false + + /@grpc/grpc-js/0.3.6: + resolution: {integrity: sha512-SmLNuPGlUur64bNS9aHZguqWDVQ8+Df1CGn+xsh7l6T2wiP5ArOMlywZ3TZo6z/rwKtGQgUJY9ZrPYUmHEXd/Q==} + engines: {node: ^8.11.2 || >=9.4} + dependencies: + semver: 5.7.1 + dev: false + + /@grpc/proto-loader/0.4.0: + resolution: {integrity: sha512-Jm6o+75uWT7E6+lt8edg4J1F/9+BedOjaMgwE14pxS/AO43/0ZqK+rCLVVrXLoExwSAZvgvOD2B0ivy3Spsspw==} + engines: {node: '>=6'} + dependencies: + lodash.camelcase: 4.3.0 + protobufjs: 6.11.2 + dev: false + + /@humanwhocodes/config-array/0.5.0: + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.2 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@humanwhocodes/config-array/0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.2 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: false @@ -968,20 +1461,20 @@ packages: engines: {node: '>=8'} dev: false - /@jest/console/27.3.1: - resolution: {integrity: sha512-RkFNWmv0iui+qsOr/29q9dyfKTTT5DCuP31kUwg7rmOKPT/ozLeGLKJKVIiOfbiKyleUZKIrHwhmiZWVe8IMdw==} + /@jest/console/27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 '@types/node': 16.11.6 chalk: 4.1.2 - jest-message-util: 27.3.1 - jest-util: 27.3.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 slash: 3.0.0 dev: false - /@jest/core/27.3.1_ts-node@10.7.0: - resolution: {integrity: sha512-DMNE90RR5QKx0EA+wqe3/TNEwiRpOkhshKNxtLxd4rt3IZpCt+RSL+FoJsGeblRZmqdK4upHA/mKKGPPRAifhg==} + /@jest/core/27.5.1: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -989,30 +1482,120 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 27.3.1 - '@jest/reporters': 27.3.1 - '@jest/test-result': 27.3.1 - '@jest/transform': 27.3.1 - '@jest/types': 27.2.5 + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 exit: 0.1.2 - graceful-fs: 4.2.8 - jest-changed-files: 27.3.0 - jest-config: 27.3.1_ts-node@10.7.0 - jest-haste-map: 27.3.1 - jest-message-util: 27.3.1 - jest-regex-util: 27.0.6 - jest-resolve: 27.3.1 - jest-resolve-dependencies: 27.3.1 - jest-runner: 27.3.1 - jest-runtime: 27.3.1 - jest-snapshot: 27.3.1 - jest-util: 27.3.1 - jest-validate: 27.3.1 - jest-watcher: 27.3.1 + graceful-fs: 4.2.10 + jest-changed-files: 27.5.1 + jest-config: 27.5.1 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.4 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + + /@jest/core/27.5.1_ts-node@10.7.0: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.11.6 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 27.5.1 + jest-config: 27.5.1_ts-node@10.7.0 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.4 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + + /@jest/core/27.5.1_ts-node@9.1.1: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.11.6 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 27.5.1 + jest-config: 27.5.1_ts-node@9.1.1 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 micromatch: 4.0.4 rimraf: 3.0.2 slash: 3.0.0 @@ -1025,39 +1608,39 @@ packages: - utf-8-validate dev: false - /@jest/environment/27.3.1: - resolution: {integrity: sha512-BCKCj4mOVLme6Tanoyc9k0ultp3pnmuyHw73UHRPeeZxirsU/7E3HC4le/VDb/SMzE1JcPnto+XBKFOcoiJzVw==} + /@jest/environment/27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/fake-timers': 27.3.1 - '@jest/types': 27.2.5 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 - jest-mock: 27.3.0 + jest-mock: 27.5.1 dev: false - /@jest/fake-timers/27.3.1: - resolution: {integrity: sha512-M3ZFgwwlqJtWZ+QkBG5NmC23A9w+A6ZxNsO5nJxJsKYt4yguBd3i8TpjQz5NfCX91nEve1KqD9RA2Q+Q1uWqoA==} + /@jest/fake-timers/27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 '@types/node': 16.11.6 - jest-message-util: 27.3.1 - jest-mock: 27.3.0 - jest-util: 27.3.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 dev: false - /@jest/globals/27.3.1: - resolution: {integrity: sha512-Q651FWiWQAIFiN+zS51xqhdZ8g9b88nGCobC87argAxA7nMfNQq0Q0i9zTfQYgLa6qFXk2cGANEqfK051CZ8Pg==} + /@jest/globals/27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.3.1 - '@jest/types': 27.2.5 - expect: 27.3.1 + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 dev: false - /@jest/reporters/27.3.1: - resolution: {integrity: sha512-m2YxPmL9Qn1emFVgZGEiMwDntDxRRQ2D58tiDQlwYTg5GvbFOKseYCcHtn0WsI8CG4vzPglo3nqbOiT8ySBT/w==} + /@jest/reporters/27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1066,25 +1649,25 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.3.1 - '@jest/test-result': 27.3.1 - '@jest/transform': 27.3.1 - '@jest/types': 27.2.5 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.0 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 4.0.3 + istanbul-lib-instrument: 5.1.0 istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.0.5 - jest-haste-map: 27.3.1 - jest-resolve: 27.3.1 - jest-util: 27.3.1 - jest-worker: 27.3.1 + istanbul-reports: 3.1.4 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 slash: 3.0.0 source-map: 0.6.1 string-length: 4.0.2 @@ -1094,33 +1677,33 @@ packages: - supports-color dev: false - /@jest/source-map/27.0.6: - resolution: {integrity: sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==} + /@jest/source-map/27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: callsites: 3.1.0 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 source-map: 0.6.1 dev: false - /@jest/test-result/27.3.1: - resolution: {integrity: sha512-mLn6Thm+w2yl0opM8J/QnPTqrfS4FoXsXF2WIWJb2O/GBSyResL71BRuMYbYRsGt7ELwS5JGcEcGb52BNrumgg==} + /@jest/test-result/27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.3.1 - '@jest/types': 27.2.5 + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 '@types/istanbul-lib-coverage': 2.0.3 collect-v8-coverage: 1.0.1 dev: false - /@jest/test-sequencer/27.3.1: - resolution: {integrity: sha512-siySLo07IMEdSjA4fqEnxfIX8lB/lWYsBPwNFtkOvsFQvmBrL3yj3k3uFNZv/JDyApTakRpxbKLJ3CT8UGVCrA==} + /@jest/test-sequencer/27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/test-result': 27.3.1 - graceful-fs: 4.2.8 - jest-haste-map: 27.3.1 - jest-runtime: 27.3.1 + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 transitivePeerDependencies: - supports-color dev: false @@ -1148,22 +1731,22 @@ packages: - supports-color dev: false - /@jest/transform/27.3.1: - resolution: {integrity: sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ==} + /@jest/transform/27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/core': 7.16.0 - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 1.8.0 fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.8 - jest-haste-map: 27.3.1 - jest-regex-util: 27.0.6 - jest-util: 27.3.1 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 micromatch: 4.0.4 - pirates: 4.0.1 + pirates: 4.0.5 slash: 3.0.0 source-map: 0.6.1 write-file-atomic: 3.0.3 @@ -1182,8 +1765,8 @@ packages: chalk: 4.1.2 dev: false - /@jest/types/27.2.5: - resolution: {integrity: sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==} + /@jest/types/27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@types/istanbul-lib-coverage': 2.0.3 @@ -1193,6 +1776,24 @@ packages: chalk: 4.1.2 dev: false + /@mapbox/node-pre-gyp/1.0.9: + resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.0 + make-dir: 3.1.0 + node-fetch: 2.6.7 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.3.5 + tar: 6.1.11 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@microsoft/tsdoc-config/0.15.2: resolution: {integrity: sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==} dependencies: @@ -1213,7 +1814,7 @@ packages: reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 8.1.2_43f93dd897e68fe834a23ddd32fb54cc + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a axios: 0.26.0 reflect-metadata: 0.1.13 rxjs: 7.4.0 @@ -1221,6 +1822,39 @@ packages: - debug dev: false + /@nestjs/cli/7.6.0: + resolution: {integrity: sha512-lW1px2gSHkRoBpKSxzP6IJNQscRKs97OAaVyV46OAP6oUR996E0EPkIslIaa16kKLJ3SFOUeZo5xl5nYbqp43g==} + engines: {node: '>= 10.13.0', npm: '>= 6.11.0'} + hasBin: true + dependencies: + '@angular-devkit/core': 11.2.6 + '@angular-devkit/schematics': 11.2.6 + '@angular-devkit/schematics-cli': 0.1102.6 + '@nestjs/schematics': 7.3.1_typescript@4.2.3 + chalk: 3.0.0 + chokidar: 3.5.1 + cli-table3: 0.5.1 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 6.2.0 + inquirer: 7.3.3 + node-emoji: 1.10.0 + ora: 5.4.0 + os-name: 4.0.0 + rimraf: 3.0.2 + shelljs: 0.8.4 + tree-kill: 1.2.2 + tsconfig-paths: 3.9.0 + tsconfig-paths-webpack-plugin: 3.5.1 + typescript: 4.2.3 + webpack: 5.28.0 + webpack-node-externals: 2.5.2 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: false + /@nestjs/cli/8.1.4_eslint@7.32.0: resolution: {integrity: sha512-QXZ0fkybNEPUeP3wcWuFore8XVicrT76IYToHkc4PJ+kQ7/thQzpy5mqWGTalv83aNM5LKAjl5OTSBBrPiWrlg==} engines: {node: '>= 10.13.0', npm: '>= 6.11.0'} @@ -1285,6 +1919,34 @@ packages: - debug dev: false + /@nestjs/common/8.1.2_f8b67fbbfa59b70aa4035a6089ad771a: + resolution: {integrity: sha512-5k9iFRj0HkAe1gn6Ozx5UWzbRyT8xCgZ663FWsVc5Cf6BJ+OYhQC8Y5cuVx8gsbSnzc0AUpcknPP5rYh2TkLOQ==} + peerDependencies: + cache-manager: '*' + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + axios: 0.23.0 + class-transformer: 0.5.1 + class-validator: 0.13.1 + iterare: 1.2.1 + reflect-metadata: 0.1.13 + rxjs: 7.4.0 + tslib: 2.3.1 + uuid: 8.3.2 + transitivePeerDependencies: + - debug + dev: false + /@nestjs/config/1.1.0_b3e6921aee41404e2866237bfdfd83a3: resolution: {integrity: sha512-/HsxSAxBNDihFqsHata/fTCpibOplw1G8lUc6ow62GKEBWvftNo+XaoAC6UwYHdU+Xo1VG2E8T3uCqFGhInK5w==} peerDependencies: @@ -1292,7 +1954,7 @@ packages: reflect-metadata: ^0.1.13 rxjs: ^6.0.0 || ^7.2.0 dependencies: - '@nestjs/common': 8.1.2_43f93dd897e68fe834a23ddd32fb54cc + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a dotenv: 10.0.0 dotenv-expand: 5.1.0 lodash.get: 4.4.2 @@ -1321,7 +1983,7 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 8.1.2_43f93dd897e68fe834a23ddd32fb54cc + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a '@nestjs/platform-express': 8.1.2_bbf59b1cbf49bba2b2f47e404ee3cb27 '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 @@ -1332,6 +1994,27 @@ packages: rxjs: 7.4.0 tslib: 2.3.1 uuid: 8.3.2 + transitivePeerDependencies: + - encoding + dev: false + + /@nestjs/jwt/8.0.0: + resolution: {integrity: sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ==} + peerDependencies: + '@nestjs/common': ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/jsonwebtoken': 8.5.4 + jsonwebtoken: 8.5.1 + dev: false + + /@nestjs/jwt/8.0.0_@nestjs+common@8.1.2: + resolution: {integrity: sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ==} + peerDependencies: + '@nestjs/common': ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a + '@types/jsonwebtoken': 8.5.4 + jsonwebtoken: 8.5.1 dev: false /@nestjs/mapped-types/1.0.0_6c744dbccfe97401616029b71ee405ff: @@ -1348,13 +2031,46 @@ packages: reflect-metadata: 0.1.13 dev: false + /@nestjs/mapped-types/1.0.0_b1a9b2fa8484015fa05c131bb31edf31: + resolution: {integrity: sha512-26AW5jHadLXtvHs+M+Agd9KZ92dDlBrmD0rORlBlvn2KvsWs4JRaKl2mUsrW7YsdZeAu3Hc4ukqyYyDdyCmMWQ==} + peerDependencies: + '@nestjs/common': ^7.0.8 || ^8.0.0 + class-transformer: ^0.2.0 || ^0.3.0 || ^0.4.0 + class-validator: ^0.11.1 || ^0.12.0 || ^0.13.0 + reflect-metadata: ^0.1.12 + dependencies: + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a + class-transformer: 0.5.1 + class-validator: 0.13.1 + reflect-metadata: 0.1.13 + dev: false + + /@nestjs/passport/8.2.1_5bcb9755554a4dae2a94452779a7c82c: + resolution: {integrity: sha512-HXEKMLX1x865+lsJB4srwKHBciDNAhWY1Ha+xbxYRbk7J5leGDoHJAmeqe+Wb3NDn5nkboggLV87t0q2mbYc8w==} + peerDependencies: + '@nestjs/common': ^6.0.0 || ^7.0.0 || ^8.0.0 + passport: ^0.4.0 || ^0.5.0 + dependencies: + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a + passport: 0.5.2 + dev: false + + /@nestjs/passport/8.2.1_passport@0.5.2: + resolution: {integrity: sha512-HXEKMLX1x865+lsJB4srwKHBciDNAhWY1Ha+xbxYRbk7J5leGDoHJAmeqe+Wb3NDn5nkboggLV87t0q2mbYc8w==} + peerDependencies: + '@nestjs/common': ^6.0.0 || ^7.0.0 || ^8.0.0 + passport: ^0.4.0 || ^0.5.0 + dependencies: + passport: 0.5.2 + dev: false + /@nestjs/platform-express/8.1.2_bbf59b1cbf49bba2b2f47e404ee3cb27: resolution: {integrity: sha512-YjfzDKhHbdBOy8SX/6+cYNPZuBeI8dLwWNsvQ98Jb3RLAa5EZ1v4zAM5QYa9sUwN4ZXxB8nMxHQi/iEEtuwyug==} peerDependencies: '@nestjs/common': ^8.0.0 '@nestjs/core': ^8.0.0 dependencies: - '@nestjs/common': 8.1.2_43f93dd897e68fe834a23ddd32fb54cc + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a '@nestjs/core': 8.1.2_3d1cfdac3af6acf6d20b789f19aaf219 body-parser: 1.19.0 cors: 2.8.5 @@ -1363,6 +2079,32 @@ packages: tslib: 2.3.1 dev: false + /@nestjs/schematics/7.3.1_typescript@4.2.3: + resolution: {integrity: sha512-eyBjJstAjecpdzRuBLiqnwomwXIAEV3+kPkpaphOieRUM6nBhjnXCCl3Qf8Dul2QUQK4NOVPd8FFxWtGP5XNlg==} + peerDependencies: + typescript: ^3.4.5 || ^4.0.0 + dependencies: + '@angular-devkit/core': 11.2.4 + '@angular-devkit/schematics': 11.2.4 + fs-extra: 9.1.0 + jsonc-parser: 3.0.0 + pluralize: 8.0.0 + typescript: 4.2.3 + dev: false + + /@nestjs/schematics/7.3.1_typescript@4.4.4: + resolution: {integrity: sha512-eyBjJstAjecpdzRuBLiqnwomwXIAEV3+kPkpaphOieRUM6nBhjnXCCl3Qf8Dul2QUQK4NOVPd8FFxWtGP5XNlg==} + peerDependencies: + typescript: ^3.4.5 || ^4.0.0 + dependencies: + '@angular-devkit/core': 11.2.4 + '@angular-devkit/schematics': 11.2.4 + fs-extra: 9.1.0 + jsonc-parser: 3.0.0 + pluralize: 8.0.0 + typescript: 4.4.4 + dev: false + /@nestjs/schematics/8.0.4_typescript@4.3.5: resolution: {integrity: sha512-uEmEfuNuIgsNr4m0wEkXIIG6usegehnpwhtOoxXWwvKO0CFO3POAx4pOazPgC4ky6pJ0XROhE/8O55JtmEw0UQ==} peerDependencies: @@ -1389,6 +2131,32 @@ packages: typescript: 4.4.4 dev: false + /@nestjs/swagger/5.1.5_a79683707c1b2de548b1d4db132385ae: + resolution: {integrity: sha512-jvsgciVEFcYVVEuLdNAmgJDpFSQzIoukg+Ovz1vJ97OeCprx0sVhmocn13nCl/dEwIkwoM3eby9OiaccX0A+3A==} + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/core': ^8.0.0 + fastify-swagger: '*' + reflect-metadata: ^0.1.12 + swagger-ui-express: '*' + peerDependenciesMeta: + fastify-swagger: + optional: true + swagger-ui-express: + optional: true + dependencies: + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a + '@nestjs/core': 8.1.2_3d1cfdac3af6acf6d20b789f19aaf219 + '@nestjs/mapped-types': 1.0.0_b1a9b2fa8484015fa05c131bb31edf31 + lodash: 4.17.21 + path-to-regexp: 3.2.0 + reflect-metadata: 0.1.13 + swagger-ui-express: 4.1.6_express@4.18.0 + transitivePeerDependencies: + - class-transformer + - class-validator + dev: false + /@nestjs/swagger/5.1.5_ea14560b646b9e6de5a63f20f1277708: resolution: {integrity: sha512-jvsgciVEFcYVVEuLdNAmgJDpFSQzIoukg+Ovz1vJ97OeCprx0sVhmocn13nCl/dEwIkwoM3eby9OiaccX0A+3A==} peerDependencies: @@ -1409,12 +2177,39 @@ packages: lodash: 4.17.21 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 - swagger-ui-express: 4.1.6 + swagger-ui-express: 4.1.6_express@4.18.0 transitivePeerDependencies: - class-transformer - class-validator dev: false + /@nestjs/terminus/8.0.6_90a4bb632c4b27addd0e86dd197fa862: + resolution: {integrity: sha512-HevQNlJzIkiZ5S1Yb+ll4pwiqg8qB5M6G+2LD0hIkUHzWFvVdCAZDIhLhtwjjRGJ76dwC8BFE/YyUC/4reGAzQ==} + peerDependencies: + '@nestjs/common': 8.x + '@nestjs/core': 8.x + reflect-metadata: 0.1.x + rxjs: 7.x + dependencies: + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a + '@nestjs/core': 8.1.2_3d1cfdac3af6acf6d20b789f19aaf219 + check-disk-space: 3.3.0 + reflect-metadata: 0.1.13 + rxjs: 7.4.0 + dev: false + + /@nestjs/terminus/8.0.6_reflect-metadata@0.1.13: + resolution: {integrity: sha512-HevQNlJzIkiZ5S1Yb+ll4pwiqg8qB5M6G+2LD0hIkUHzWFvVdCAZDIhLhtwjjRGJ76dwC8BFE/YyUC/4reGAzQ==} + peerDependencies: + '@nestjs/common': 8.x + '@nestjs/core': 8.x + reflect-metadata: 0.1.x + rxjs: 7.x + dependencies: + check-disk-space: 3.3.0 + reflect-metadata: 0.1.13 + dev: false + /@nestjs/testing/8.1.2_830699a7a1bc4b367722dd63c0377123: resolution: {integrity: sha512-Iffx79y4Bt3gAJd8n+9Nhbmq9uB0KWZ0KasdQwQsbCNuhTsvgjQ1iD/khFYtf1dGthSndmrAQgvl+jkX7W7KKA==} peerDependencies: @@ -1429,13 +2224,13 @@ packages: optional: true dependencies: optional: 0.1.4 - '@nestjs/common': 8.1.2_43f93dd897e68fe834a23ddd32fb54cc + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a '@nestjs/core': 8.1.2_3d1cfdac3af6acf6d20b789f19aaf219 '@nestjs/platform-express': 8.1.2_bbf59b1cbf49bba2b2f47e404ee3cb27 tslib: 2.3.1 dev: false - /@nestjs/typeorm/8.0.2_12346420c5d0822584d78b786936ea28: + /@nestjs/typeorm/8.0.2_15ce50d73117bf24d38d098c9f955110: resolution: {integrity: sha512-UHn4IsRkzm22eNDir/uI+x8gmgo66EO7SxWfVOiPpeLSdrTfZHKYz6q/P9KRgYbwXs8TrywVdIbJhp+4C0tzjQ==} peerDependencies: '@nestjs/common': ^8.0.0 @@ -1444,11 +2239,24 @@ packages: rxjs: ^7.2.0 typeorm: ^0.2.34 dependencies: - '@nestjs/common': 8.1.2_43f93dd897e68fe834a23ddd32fb54cc + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a '@nestjs/core': 8.1.2_3d1cfdac3af6acf6d20b789f19aaf219 reflect-metadata: 0.1.13 rxjs: 7.4.0 - typeorm: 0.2.38_better-sqlite3@7.5.0 + typeorm: 0.2.45_better-sqlite3@7.5.0+pg@8.7.3 + uuid: 8.3.2 + dev: false + + /@nestjs/typeorm/8.0.2_reflect-metadata@0.1.13: + resolution: {integrity: sha512-UHn4IsRkzm22eNDir/uI+x8gmgo66EO7SxWfVOiPpeLSdrTfZHKYz6q/P9KRgYbwXs8TrywVdIbJhp+4C0tzjQ==} + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/core': ^8.0.0 + reflect-metadata: ^0.1.13 + rxjs: ^7.2.0 + typeorm: ^0.2.34 + dependencies: + reflect-metadata: 0.1.13 uuid: 8.3.2 dev: false @@ -1480,7 +2288,52 @@ packages: dependencies: chalk: 4.1.2 consola: 2.15.3 - node-fetch: 2.6.6 + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + + /@protobufjs/aspromise/1.1.2: + resolution: {integrity: sha1-m4sMxmPWaafY9vXQiToU00jzD78=} + dev: false + + /@protobufjs/base64/1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen/2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter/1.1.0: + resolution: {integrity: sha1-NVy8mLr61ZePntCV85diHx0Ga3A=} + dev: false + + /@protobufjs/fetch/1.1.0: + resolution: {integrity: sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float/1.0.2: + resolution: {integrity: sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=} + dev: false + + /@protobufjs/inquire/1.1.0: + resolution: {integrity: sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=} + dev: false + + /@protobufjs/path/1.1.2: + resolution: {integrity: sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=} + dev: false + + /@protobufjs/pool/1.1.0: + resolution: {integrity: sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=} + dev: false + + /@protobufjs/utf8/1.1.0: + resolution: {integrity: sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=} dev: false /@rushstack/eslint-config/2.3.4_eslint@7.32.0+typescript@4.4.4: @@ -1506,6 +2359,28 @@ packages: - supports-color dev: false + /@rushstack/eslint-config/2.3.4_typescript@4.4.4: + resolution: {integrity: sha512-mwEfj3e260slxM57A2eMtkNpVM9J2iMGoqzWfD4hHtO+dcZT6rEeYG4djwj61ZriNJdAY8QIMMhfuID/xV+cyw==} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 + typescript: '>=3.0.0' + dependencies: + '@rushstack/eslint-patch': 1.0.6 + '@rushstack/eslint-plugin': 0.7.3_typescript@4.4.4 + '@rushstack/eslint-plugin-packlets': 0.2.2_typescript@4.4.4 + '@rushstack/eslint-plugin-security': 0.1.4_typescript@4.4.4 + '@typescript-eslint/eslint-plugin': 3.4.0_a12aa47e9135110907cc1ae891a2c5a8 + '@typescript-eslint/experimental-utils': 3.10.1_typescript@4.4.4 + '@typescript-eslint/parser': 3.4.0_typescript@4.4.4 + '@typescript-eslint/typescript-estree': 3.4.0_typescript@4.4.4 + eslint-plugin-promise: 4.2.1 + eslint-plugin-react: 7.20.6 + eslint-plugin-tsdoc: 0.2.14 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: false + /@rushstack/eslint-patch/1.0.6: resolution: {integrity: sha512-Myxw//kzromB9yWgS8qYGuGVf91oBUUJpNvy5eM50sqvmKLbKjwLxohJnkWGTeeI9v9IBMtPLxz5Gc60FIfvCA==} dev: false @@ -1523,6 +2398,18 @@ packages: - typescript dev: false + /@rushstack/eslint-plugin-packlets/0.2.2_typescript@4.4.4: + resolution: {integrity: sha512-8kKs5fq9Mm9sP4W7ETbp48eH6iECfXDKP1mdg2iBPl8CaZZHMzVYC2vQSSSOOMv+OV23LreRFWV0LlllEDuD3Q==} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 + dependencies: + '@rushstack/tree-pattern': 0.2.1 + '@typescript-eslint/experimental-utils': 3.10.1_typescript@4.4.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@rushstack/eslint-plugin-security/0.1.4_eslint@7.32.0+typescript@4.4.4: resolution: {integrity: sha512-AiNUS5H4/RvyNI9FDKdd4ya3PovjpPVU9Pr7He1JPvqLHOCT8P9n5YpRHjxx0ftD77mDLT5HrcOKjxTW7BZQHg==} peerDependencies: @@ -1536,6 +2423,18 @@ packages: - typescript dev: false + /@rushstack/eslint-plugin-security/0.1.4_typescript@4.4.4: + resolution: {integrity: sha512-AiNUS5H4/RvyNI9FDKdd4ya3PovjpPVU9Pr7He1JPvqLHOCT8P9n5YpRHjxx0ftD77mDLT5HrcOKjxTW7BZQHg==} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 + dependencies: + '@rushstack/tree-pattern': 0.2.1 + '@typescript-eslint/experimental-utils': 3.10.1_typescript@4.4.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@rushstack/eslint-plugin/0.7.3_eslint@7.32.0+typescript@4.4.4: resolution: {integrity: sha512-8+AqxybpcJJuxn0+fsWwMIMj2g2tLfPrbOyhEi+Rozh36eTmgGXF45qh8bHE1gicsX4yGDj2ob1P62oQV6hs3g==} peerDependencies: @@ -1549,10 +2448,109 @@ packages: - typescript dev: false + /@rushstack/eslint-plugin/0.7.3_typescript@4.4.4: + resolution: {integrity: sha512-8+AqxybpcJJuxn0+fsWwMIMj2g2tLfPrbOyhEi+Rozh36eTmgGXF45qh8bHE1gicsX4yGDj2ob1P62oQV6hs3g==} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 + dependencies: + '@rushstack/tree-pattern': 0.2.1 + '@typescript-eslint/experimental-utils': 3.10.1_typescript@4.4.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@rushstack/tree-pattern/0.2.1: resolution: {integrity: sha512-ZRPQdV0LxUY/HRIvVKNz3Sb/qbklSthL2pY0qkNoycXKcXbCgXEP3TxL+i1/tW9g1jqft4o+pl9wx12Q6Uc0Xw==} dev: false + /@schematics/schematics/0.1102.6: + resolution: {integrity: sha512-x77kbJL/HqR4gx0tbt35VCOGLyMvB7jD/x7eB1njhQRF8E/xynEOk3i+7A5VmK67QP5NJxU8BQKlPkJ55tBDmg==} + engines: {node: '>= 10.13.0', npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 11.2.6 + '@angular-devkit/schematics': 11.2.6 + dev: false + + /@sentry/core/6.19.6: + resolution: {integrity: sha512-biEotGRr44/vBCOegkTfC9rwqaqRKIpFljKGyYU6/NtzMRooktqOhjmjmItNCMRknArdeaQwA8lk2jcZDXX3Og==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.6 + '@sentry/minimal': 6.19.6 + '@sentry/types': 6.19.6 + '@sentry/utils': 6.19.6 + tslib: 1.14.1 + dev: false + + /@sentry/hub/6.19.6: + resolution: {integrity: sha512-PuEOBZxvx3bjxcXmWWZfWXG+orojQiWzv9LQXjIgroVMKM/GG4QtZbnWl1hOckUj7WtKNl4hEGO2g/6PyCV/vA==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.6 + '@sentry/utils': 6.19.6 + tslib: 1.14.1 + dev: false + + /@sentry/integrations/6.19.6: + resolution: {integrity: sha512-K2xuA/ByhTh3qfIe0/XIsQSNf1HrRuIgtkC4TbU7T0QosybtXDsh6t/EWK+qzs2RjVE+Iaqldihstpoyew1JgA==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.6 + '@sentry/utils': 6.19.6 + localforage: 1.10.0 + tslib: 1.14.1 + dev: false + + /@sentry/minimal/6.19.6: + resolution: {integrity: sha512-T1NKcv+HTlmd8EbzUgnGPl4ySQGHWMCyZ8a8kXVMZOPDzphN3fVIzkYzWmSftCWp0rpabXPt9aRF2mfBKU+mAQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.6 + '@sentry/types': 6.19.6 + tslib: 1.14.1 + dev: false + + /@sentry/node/6.19.6: + resolution: {integrity: sha512-kHQMfsy40ZxxdS9zMPmXCOOLWOJbQj6/aVSHt/L1QthYcgkAi7NJQNXnQIPWQDe8eP3DfNIWM7dc446coqjXrQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 6.19.6 + '@sentry/hub': 6.19.6 + '@sentry/types': 6.19.6 + '@sentry/utils': 6.19.6 + cookie: 0.4.2 + https-proxy-agent: 5.0.0 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@sentry/tracing/6.19.6: + resolution: {integrity: sha512-STZdlEtTBqRmPw6Vjkzi/1kGkGPgiX0zdHaSOhSeA2HXHwx7Wnfu7veMKxtKWdO+0yW9QZGYOYqp0GVf4Swujg==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.6 + '@sentry/minimal': 6.19.6 + '@sentry/types': 6.19.6 + '@sentry/utils': 6.19.6 + tslib: 1.14.1 + dev: false + + /@sentry/types/6.19.6: + resolution: {integrity: sha512-QH34LMJidEUPZK78l+Frt3AaVFJhEmIi05Zf8WHd9/iTt+OqvCHBgq49DDr1FWFqyYWm/QgW/3bIoikFpfsXyQ==} + engines: {node: '>=6'} + dev: false + + /@sentry/utils/6.19.6: + resolution: {integrity: sha512-fAMWcsguL0632eWrROp/vhPgI7sBj/JROWVPzpabwVkm9z3m1rQm6iLFn4qfkZL8Ozy6NVZPXOQ7EXmeU24byg==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.6 + tslib: 1.14.1 + dev: false + /@sinonjs/commons/1.8.3: resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} dependencies: @@ -1585,10 +2583,6 @@ packages: resolution: {integrity: sha512-8+NDgNCDLvNf142Up7DKZLqG04G6soiFoMw8ZX3U4pVyu2r3GPWP2Dc3sPGMF+8Aegoe6GbVT3gZjCFoKMt4bw==} dev: false - /@spruceid/didkit-wasm/0.1.9: - resolution: {integrity: sha512-VUP7bm7uWrAjSKzqAvgsAmueFLQ6MhaCN2INGxUmWhcZe9x87DeUneaeqJV2QuLsdPrwowmNcKnyZtJeNeWqIQ==} - dev: false - /@sqltools/formatter/1.2.3: resolution: {integrity: sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==} dev: false @@ -1658,12 +2652,31 @@ packages: '@types/node': 16.11.6 dev: false + /@types/bytebuffer/5.0.43: + resolution: {integrity: sha512-vQnTYvy4LpSojHjKdmg4nXFI1BAiYPvZ/k3ouczZAQnbDprk1xqxJiFmFHyy8y6MuUq3slz5erNMtn6n87uVKw==} + dependencies: + '@types/long': 4.0.1 + '@types/node': 16.11.6 + dev: false + + /@types/compression/1.7.2: + resolution: {integrity: sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==} + dependencies: + '@types/express': 4.17.13 + dev: false + /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 16.11.6 dev: false + /@types/cookie-parser/1.4.2: + resolution: {integrity: sha512-uwcY8m6SDQqciHsqcKDGbo10GdasYsPCYkH3hVegj9qAah6pX5HivOnOuI3WYmyQMnOATV39zv/Ybs0bC/6iVg==} + dependencies: + '@types/express': 4.17.13 + dev: false + /@types/cookiejar/2.1.2: resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} dev: false @@ -1686,6 +2699,10 @@ packages: '@types/json-schema': 7.0.9 dev: false + /@types/estree/0.0.46: + resolution: {integrity: sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==} + dev: false + /@types/estree/0.0.50: resolution: {integrity: sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==} dev: false @@ -1736,6 +2753,13 @@ packages: pretty-format: 26.6.2 dev: false + /@types/jest/27.4.1: + resolution: {integrity: sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==} + dependencies: + jest-matcher-utils: 27.5.1 + pretty-format: 27.5.1 + dev: false + /@types/json-schema/7.0.9: resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} dev: false @@ -1744,10 +2768,34 @@ packages: resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=} dev: false + /@types/jsonwebtoken/8.5.4: + resolution: {integrity: sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg==} + dependencies: + '@types/node': 16.11.6 + dev: false + + /@types/jsonwebtoken/8.5.8: + resolution: {integrity: sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==} + dependencies: + '@types/node': 16.11.6 + dev: false + + /@types/lodash/4.14.182: + resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==} + dev: false + + /@types/long/4.0.1: + resolution: {integrity: sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==} + dev: false + /@types/mime/1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} dev: false + /@types/node/13.13.52: + resolution: {integrity: sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==} + dev: false + /@types/node/16.11.6: resolution: {integrity: sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==} dev: false @@ -1756,6 +2804,27 @@ packages: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: false + /@types/passport-jwt/3.0.6: + resolution: {integrity: sha512-cmAAMIRTaEwpqxlrZyiEY9kdibk94gP5KTF8AT1Ra4rWNZYHNMreqhKUEeC5WJtuN5SJZjPQmV+XO2P5PlnvNQ==} + dependencies: + '@types/express': 4.17.13 + '@types/jsonwebtoken': 8.5.8 + '@types/passport-strategy': 0.2.35 + dev: false + + /@types/passport-strategy/0.2.35: + resolution: {integrity: sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==} + dependencies: + '@types/express': 4.17.13 + '@types/passport': 1.0.7 + dev: false + + /@types/passport/1.0.7: + resolution: {integrity: sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw==} + dependencies: + '@types/express': 4.17.13 + dev: false + /@types/prettier/2.4.1: resolution: {integrity: sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==} dev: false @@ -1792,6 +2861,10 @@ packages: '@types/superagent': 4.1.13 dev: false + /@types/uuid/8.3.4: + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + dev: false + /@types/validator/13.6.6: resolution: {integrity: sha512-+qogUELb4gMhrMjSh/seKmGVvN+uQLfyqJAqYRWqVHsvBsUO2xDBCL8CJ/ZSukbd8vXaoYbpIssAmfLEzzBHEw==} dev: false @@ -1816,6 +2889,29 @@ packages: resolution: {integrity: sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==} dev: false + /@typescript-eslint/eslint-plugin/3.4.0_a12aa47e9135110907cc1ae891a2c5a8: + resolution: {integrity: sha512-wfkpiqaEVhZIuQRmudDszc01jC/YR7gMSxa6ulhggAe/Hs0KVIuo9wzvFiDbG3JD5pRFQoqnf4m7REDsUvBnMQ==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + '@typescript-eslint/parser': ^3.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/experimental-utils': 3.4.0_typescript@4.4.4 + '@typescript-eslint/parser': 3.4.0_typescript@4.4.4 + debug: 4.3.2 + functional-red-black-tree: 1.0.1 + regexpp: 3.2.0 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/eslint-plugin/3.4.0_b024b5b9504dad753acf746d3d49d8c8: resolution: {integrity: sha512-wfkpiqaEVhZIuQRmudDszc01jC/YR7gMSxa6ulhggAe/Hs0KVIuo9wzvFiDbG3JD5pRFQoqnf4m7REDsUvBnMQ==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1857,7 +2953,34 @@ packages: debug: 4.3.2 eslint: 7.32.0 functional-red-black-tree: 1.0.1 - ignore: 5.1.9 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/eslint-plugin/5.20.0_3edef4978842152df7a6e247a241934b: + resolution: {integrity: sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.20.0_eslint@8.14.0+typescript@4.4.4 + '@typescript-eslint/scope-manager': 5.20.0 + '@typescript-eslint/type-utils': 5.20.0_eslint@8.14.0+typescript@4.4.4 + '@typescript-eslint/utils': 5.20.0_eslint@8.14.0+typescript@4.4.4 + debug: 4.3.2 + eslint: 8.14.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.5 tsutils: 3.21.0_typescript@4.4.4 @@ -1883,6 +3006,22 @@ packages: - typescript dev: false + /@typescript-eslint/experimental-utils/3.10.1_typescript@4.4.4: + resolution: {integrity: sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/types': 3.10.1 + '@typescript-eslint/typescript-estree': 3.10.1_typescript@4.4.4 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@typescript-eslint/experimental-utils/3.4.0_eslint@7.32.0+typescript@4.4.4: resolution: {integrity: sha512-rHPOjL43lOH1Opte4+dhC0a/+ks+8gOBwxXnyrZ/K4OTAChpSjP76fbI8Cglj7V5GouwVAGaK+xVwzqTyE/TPw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1899,6 +3038,21 @@ packages: - typescript dev: false + /@typescript-eslint/experimental-utils/3.4.0_typescript@4.4.4: + resolution: {integrity: sha512-rHPOjL43lOH1Opte4+dhC0a/+ks+8gOBwxXnyrZ/K4OTAChpSjP76fbI8Cglj7V5GouwVAGaK+xVwzqTyE/TPw==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/typescript-estree': 3.4.0_typescript@4.4.4 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@typescript-eslint/experimental-utils/4.33.0_eslint@7.32.0+typescript@4.4.4: resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1937,6 +3091,25 @@ packages: - supports-color dev: false + /@typescript-eslint/parser/3.4.0_typescript@4.4.4: + resolution: {integrity: sha512-ZUGI/de44L5x87uX5zM14UYcbn79HSXUR+kzcqU42gH0AgpdB/TjuJy3m4ezI7Q/jk3wTQd755mxSDLhQP79KA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@types/eslint-visitor-keys': 1.0.0 + '@typescript-eslint/experimental-utils': 3.4.0_typescript@4.4.4 + '@typescript-eslint/typescript-estree': 3.4.0_typescript@4.4.4 + eslint-visitor-keys: 1.3.0 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/parser/4.33.0_eslint@7.32.0+typescript@4.4.4: resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1957,14 +3130,61 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager/4.33.0: - resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - dependencies: - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/visitor-keys': 4.33.0 - dev: false - + /@typescript-eslint/parser/5.20.0_eslint@8.14.0+typescript@4.4.4: + resolution: {integrity: sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.20.0 + '@typescript-eslint/types': 5.20.0 + '@typescript-eslint/typescript-estree': 5.20.0_typescript@4.4.4 + debug: 4.3.2 + eslint: 8.14.0 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager/4.33.0: + resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dependencies: + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/visitor-keys': 4.33.0 + dev: false + + /@typescript-eslint/scope-manager/5.20.0: + resolution: {integrity: sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.20.0 + '@typescript-eslint/visitor-keys': 5.20.0 + dev: false + + /@typescript-eslint/type-utils/5.20.0_eslint@8.14.0+typescript@4.4.4: + resolution: {integrity: sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.20.0_eslint@8.14.0+typescript@4.4.4 + debug: 4.3.2 + eslint: 8.14.0 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/types/3.10.1: resolution: {integrity: sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -1975,6 +3195,11 @@ packages: engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: false + /@typescript-eslint/types/5.20.0: + resolution: {integrity: sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + /@typescript-eslint/typescript-estree/3.10.1_typescript@4.4.4: resolution: {integrity: sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2039,6 +3264,45 @@ packages: - supports-color dev: false + /@typescript-eslint/typescript-estree/5.20.0_typescript@4.4.4: + resolution: {integrity: sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.20.0 + '@typescript-eslint/visitor-keys': 5.20.0 + debug: 4.3.2 + globby: 11.0.4 + is-glob: 4.0.3 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils/5.20.0_eslint@8.14.0+typescript@4.4.4: + resolution: {integrity: sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/scope-manager': 5.20.0 + '@typescript-eslint/types': 5.20.0 + '@typescript-eslint/typescript-estree': 5.20.0_typescript@4.4.4 + eslint: 8.14.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.14.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@typescript-eslint/visitor-keys/3.10.1: resolution: {integrity: sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -2054,6 +3318,21 @@ packages: eslint-visitor-keys: 2.1.0 dev: false + /@typescript-eslint/visitor-keys/5.20.0: + resolution: {integrity: sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.20.0 + eslint-visitor-keys: 3.3.0 + dev: false + + /@webassemblyjs/ast/1.11.0: + resolution: {integrity: sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.0 + '@webassemblyjs/helper-wasm-bytecode': 1.11.0 + dev: false + /@webassemblyjs/ast/1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: @@ -2061,18 +3340,38 @@ packages: '@webassemblyjs/helper-wasm-bytecode': 1.11.1 dev: false + /@webassemblyjs/floating-point-hex-parser/1.11.0: + resolution: {integrity: sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==} + dev: false + /@webassemblyjs/floating-point-hex-parser/1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} dev: false + /@webassemblyjs/helper-api-error/1.11.0: + resolution: {integrity: sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==} + dev: false + /@webassemblyjs/helper-api-error/1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} dev: false + /@webassemblyjs/helper-buffer/1.11.0: + resolution: {integrity: sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==} + dev: false + /@webassemblyjs/helper-buffer/1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} dev: false + /@webassemblyjs/helper-numbers/1.11.0: + resolution: {integrity: sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.0 + '@webassemblyjs/helper-api-error': 1.11.0 + '@xtuc/long': 4.2.2 + dev: false + /@webassemblyjs/helper-numbers/1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} dependencies: @@ -2081,10 +3380,23 @@ packages: '@xtuc/long': 4.2.2 dev: false + /@webassemblyjs/helper-wasm-bytecode/1.11.0: + resolution: {integrity: sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==} + dev: false + /@webassemblyjs/helper-wasm-bytecode/1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} dev: false + /@webassemblyjs/helper-wasm-section/1.11.0: + resolution: {integrity: sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==} + dependencies: + '@webassemblyjs/ast': 1.11.0 + '@webassemblyjs/helper-buffer': 1.11.0 + '@webassemblyjs/helper-wasm-bytecode': 1.11.0 + '@webassemblyjs/wasm-gen': 1.11.0 + dev: false + /@webassemblyjs/helper-wasm-section/1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} dependencies: @@ -2094,22 +3406,51 @@ packages: '@webassemblyjs/wasm-gen': 1.11.1 dev: false + /@webassemblyjs/ieee754/1.11.0: + resolution: {integrity: sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: false + /@webassemblyjs/ieee754/1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 dev: false + /@webassemblyjs/leb128/1.11.0: + resolution: {integrity: sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==} + dependencies: + '@xtuc/long': 4.2.2 + dev: false + /@webassemblyjs/leb128/1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 dev: false + /@webassemblyjs/utf8/1.11.0: + resolution: {integrity: sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==} + dev: false + /@webassemblyjs/utf8/1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} dev: false + /@webassemblyjs/wasm-edit/1.11.0: + resolution: {integrity: sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==} + dependencies: + '@webassemblyjs/ast': 1.11.0 + '@webassemblyjs/helper-buffer': 1.11.0 + '@webassemblyjs/helper-wasm-bytecode': 1.11.0 + '@webassemblyjs/helper-wasm-section': 1.11.0 + '@webassemblyjs/wasm-gen': 1.11.0 + '@webassemblyjs/wasm-opt': 1.11.0 + '@webassemblyjs/wasm-parser': 1.11.0 + '@webassemblyjs/wast-printer': 1.11.0 + dev: false + /@webassemblyjs/wasm-edit/1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} dependencies: @@ -2123,6 +3464,16 @@ packages: '@webassemblyjs/wast-printer': 1.11.1 dev: false + /@webassemblyjs/wasm-gen/1.11.0: + resolution: {integrity: sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==} + dependencies: + '@webassemblyjs/ast': 1.11.0 + '@webassemblyjs/helper-wasm-bytecode': 1.11.0 + '@webassemblyjs/ieee754': 1.11.0 + '@webassemblyjs/leb128': 1.11.0 + '@webassemblyjs/utf8': 1.11.0 + dev: false + /@webassemblyjs/wasm-gen/1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} dependencies: @@ -2133,6 +3484,15 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: false + /@webassemblyjs/wasm-opt/1.11.0: + resolution: {integrity: sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==} + dependencies: + '@webassemblyjs/ast': 1.11.0 + '@webassemblyjs/helper-buffer': 1.11.0 + '@webassemblyjs/wasm-gen': 1.11.0 + '@webassemblyjs/wasm-parser': 1.11.0 + dev: false + /@webassemblyjs/wasm-opt/1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} dependencies: @@ -2142,6 +3502,17 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 dev: false + /@webassemblyjs/wasm-parser/1.11.0: + resolution: {integrity: sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==} + dependencies: + '@webassemblyjs/ast': 1.11.0 + '@webassemblyjs/helper-api-error': 1.11.0 + '@webassemblyjs/helper-wasm-bytecode': 1.11.0 + '@webassemblyjs/ieee754': 1.11.0 + '@webassemblyjs/leb128': 1.11.0 + '@webassemblyjs/utf8': 1.11.0 + dev: false + /@webassemblyjs/wasm-parser/1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} dependencies: @@ -2153,6 +3524,13 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: false + /@webassemblyjs/wast-printer/1.11.0: + resolution: {integrity: sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==} + dependencies: + '@webassemblyjs/ast': 1.11.0 + '@xtuc/long': 4.2.2 + dev: false + /@webassemblyjs/wast-printer/1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: @@ -2172,6 +3550,17 @@ packages: resolution: {integrity: sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==} dev: false + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /abort-controller/3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /accepts/1.3.7: resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==} engines: {node: '>= 0.6'} @@ -2180,6 +3569,14 @@ packages: negotiator: 0.6.2 dev: false + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + /acorn-globals/6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} dependencies: @@ -2187,12 +3584,12 @@ packages: acorn-walk: 7.2.0 dev: false - /acorn-import-assertions/1.8.0_acorn@8.5.0: + /acorn-import-assertions/1.8.0_acorn@8.7.0: resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.5.0 + acorn: 8.7.0 dev: false /acorn-jsx/5.3.2_acorn@7.4.1: @@ -2203,6 +3600,14 @@ packages: acorn: 7.4.1 dev: false + /acorn-jsx/5.3.2_acorn@8.7.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.7.0 + dev: false + /acorn-walk/7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} @@ -2219,8 +3624,8 @@ packages: hasBin: true dev: false - /acorn/8.5.0: - resolution: {integrity: sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==} + /acorn/8.7.0: + resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} engines: {node: '>=0.4.0'} hasBin: true dev: false @@ -2229,6 +3634,13 @@ packages: resolution: {integrity: sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=} dev: false + /agent-base/4.3.0: + resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} + engines: {node: '>= 4.0.0'} + dependencies: + es6-promisify: 5.0.0 + dev: false + /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -2244,7 +3656,7 @@ packages: ajv: optional: true dependencies: - ajv: 8.6.3 + ajv: 8.10.0 dev: false /ajv-formats/2.1.1: @@ -2291,15 +3703,6 @@ packages: uri-js: 4.4.1 dev: false - /ajv/8.6.3: - resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - /ansi-colors/4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} @@ -2317,16 +3720,16 @@ packages: engines: {node: '>=0.10.0'} dev: false + /ansi-regex/3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: false + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: false - /ansi-styles/2.2.1: - resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} - engines: {node: '>=0.10.0'} - dev: false - /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -2385,6 +3788,14 @@ packages: readable-stream: 2.3.7 dev: false + /are-we-there-yet/2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: false + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: false @@ -2439,6 +3850,16 @@ packages: engines: {node: '>=0.10.0'} dev: false + /array.prototype.flat/1.3.0: + resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + es-shim-unscopables: 1.0.0 + dev: false + /array.prototype.flatmap/1.2.5: resolution: {integrity: sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==} engines: {node: '>= 0.4'} @@ -2448,6 +3869,13 @@ packages: es-abstract: 1.19.1 dev: false + /ascli/1.0.1: + resolution: {integrity: sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=} + dependencies: + colour: 0.7.1 + optjs: 3.2.2 + dev: false + /asn1.js/5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} dependencies: @@ -2467,6 +3895,10 @@ packages: engines: {node: '>=8'} dev: false + /async/3.2.3: + resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} + dev: false + /asynckit/0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} dev: false @@ -2485,7 +3917,7 @@ packages: /axios/0.23.0: resolution: {integrity: sha512-NmvAE4i0YAv5cKq8zlDoPd1VLKAqX5oLuZKs8xkJa4qi6RGn0uhCYFjWtHHC9EM/MwOwYWOs53W+V0aqEXq1sg==} dependencies: - follow-redirects: 1.14.5 + follow-redirects: 1.14.9 transitivePeerDependencies: - debug dev: false @@ -2516,20 +3948,20 @@ packages: - supports-color dev: false - /babel-jest/27.3.1_@babel+core@7.16.0: - resolution: {integrity: sha512-SjIF8hh/ir0peae2D6S6ZKRhUy7q/DnpH7k/V6fT4Bgs/LXXUztOpX4G2tCgq8mLo5HA9mN6NmlFMeYtKmIsTQ==} + /babel-jest/27.5.1_@babel+core@7.16.0: + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: '@babel/core': 7.16.0 - '@jest/transform': 27.3.1 - '@jest/types': 27.2.5 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 '@types/babel__core': 7.1.16 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.2.0_@babel+core@7.16.0 + babel-preset-jest: 27.5.1_@babel+core@7.16.0 chalk: 4.1.2 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 slash: 3.0.0 transitivePeerDependencies: - supports-color @@ -2558,8 +3990,8 @@ packages: '@types/babel__traverse': 7.14.2 dev: false - /babel-plugin-jest-hoist/27.2.0: - resolution: {integrity: sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw==} + /babel-plugin-jest-hoist/27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/template': 7.16.0 @@ -2617,14 +4049,14 @@ packages: babel-preset-current-node-syntax: 1.0.1 dev: false - /babel-preset-jest/27.2.0_@babel+core@7.16.0: - resolution: {integrity: sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg==} + /babel-preset-jest/27.5.1_@babel+core@7.16.0: + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.16.0 - babel-plugin-jest-hoist: 27.2.0 + babel-plugin-jest-hoist: 27.5.1 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.0 dev: false @@ -2666,6 +4098,14 @@ packages: prebuild-install: 7.0.1 dev: false + /big.js/5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: false + + /bignumber.js/9.0.2: + resolution: {integrity: sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==} + dev: false + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -2705,6 +4145,24 @@ packages: type-is: 1.6.18 dev: false + /body-parser/1.20.0: + resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.4 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.10.3 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + dev: false + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -2712,6 +4170,12 @@ packages: concat-map: 0.0.1 dev: false + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + /braces/2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} @@ -2768,10 +4232,19 @@ packages: node-int64: 0.4.0 dev: false + /buffer-equal-constant-time/1.0.1: + resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} + dev: false + /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: false + /buffer-writer/2.0.0: + resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} + engines: {node: '>=4'} + dev: false + /buffer/5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -2794,11 +4267,28 @@ packages: readable-stream: 1.1.14 dev: false + /bytebuffer/5.0.1: + resolution: {integrity: sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=} + engines: {node: '>=0.8'} + dependencies: + long: 3.2.0 + dev: false + + /bytes/3.0.0: + resolution: {integrity: sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=} + engines: {node: '>= 0.8'} + dev: false + /bytes/3.1.0: resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} engines: {node: '>= 0.8'} dev: false + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + /cache-base/1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} @@ -2826,6 +4316,11 @@ packages: engines: {node: '>=6'} dev: false + /camelcase/2.1.1: + resolution: {integrity: sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=} + engines: {node: '>=0.10.0'} + dev: false + /camelcase/5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -2847,17 +4342,6 @@ packages: rsvp: 4.8.5 dev: false - /chalk/1.1.3: - resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: false - /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2892,6 +4376,26 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: false + /check-disk-space/3.3.0: + resolution: {integrity: sha512-Hvr+Nr01xSSvuCpXvJ8oZ2iXjIu4XT3uHbw3g7F/Uiw6O5xk8c/Ot7ZGFDaTRDf2Bz8AdWA4DvpAgCJVKt8arw==} + engines: {node: '>=12'} + dev: false + + /chokidar/3.5.1: + resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.5.0 + optionalDependencies: + fsevents: 2.3.2 + dev: false + /chokidar/3.5.2: resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} engines: {node: '>= 8.10.0'} @@ -2911,6 +4415,11 @@ packages: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + /chrome-trace-event/1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -2932,6 +4441,10 @@ packages: resolution: {integrity: sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==} dev: false + /class-transformer/0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + dev: false + /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -2975,6 +4488,16 @@ packages: engines: {node: '>=6'} dev: false + /cli-table3/0.5.1: + resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: '>=6'} + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + dev: false + /cli-table3/0.6.0: resolution: {integrity: sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==} engines: {node: 10.* || >= 12.*} @@ -2990,6 +4513,14 @@ packages: engines: {node: '>= 10'} dev: false + /cliui/3.2.0: + resolution: {integrity: sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + dev: false + /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -3046,6 +4577,25 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false + + /color/3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: false + /colors/1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -3053,6 +4603,18 @@ packages: dev: false optional: true + /colorspace/1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: false + + /colour/0.7.1: + resolution: {integrity: sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=} + engines: {node: '>=0.8'} + dev: false + /combined-stream/1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -3073,6 +4635,26 @@ packages: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: false + /compressible/2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.50.0 + dev: false + + /compression/1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.7 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + dev: false + /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: false @@ -3102,6 +4684,13 @@ packages: safe-buffer: 5.1.2 dev: false + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + /content-type/1.0.4: resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} engines: {node: '>= 0.6'} @@ -3113,12 +4702,35 @@ packages: safe-buffer: 5.1.2 dev: false + /cookie-parser/1.4.6: + resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} + engines: {node: '>= 0.8.0'} + dependencies: + cookie: 0.4.1 + cookie-signature: 1.0.6 + dev: false + /cookie-signature/1.0.6: resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} dev: false - /cookie/0.4.0: - resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==} + /cookie/0.4.0: + resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==} + engines: {node: '>= 0.6'} + dev: false + + /cookie/0.4.1: + resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie/0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} dev: false @@ -3208,6 +4820,12 @@ packages: ms: 2.0.0 dev: false + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + dependencies: + ms: 2.1.3 + dev: false + /debug/4.3.2: resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} engines: {node: '>=6.0'} @@ -3220,6 +4838,11 @@ packages: ms: 2.1.2 dev: false + /decamelize/1.2.0: + resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} + engines: {node: '>=0.10.0'} + dev: false + /decimal.js/10.3.1: resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} dev: false @@ -3303,10 +4926,20 @@ packages: engines: {node: '>= 0.6'} dev: false + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + /destroy/1.0.4: resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} dev: false + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + /detect-libc/2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} @@ -3334,8 +4967,8 @@ packages: engines: {node: '>= 10.14.2'} dev: false - /diff-sequences/27.0.6: - resolution: {integrity: sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==} + /diff-sequences/27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: false @@ -3386,6 +5019,21 @@ packages: engines: {node: '>=10'} dev: false + /duplexify/3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.7 + stream-shift: 1.0.1 + dev: false + + /ecdsa-sig-formatter/1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /ee-first/1.1.1: resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} dev: false @@ -3415,6 +5063,15 @@ packages: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false + /emojis-list/3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: false + + /enabled/2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: false + /encodeurl/1.0.2: resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} engines: {node: '>= 0.8'} @@ -3426,11 +5083,20 @@ packages: once: 1.4.0 dev: false + /enhanced-resolve/4.5.0: + resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} + engines: {node: '>=6.9.0'} + dependencies: + graceful-fs: 4.2.10 + memory-fs: 0.5.0 + tapable: 1.1.3 + dev: false + /enhanced-resolve/5.8.3: resolution: {integrity: sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==} engines: {node: '>=10.13.0'} dependencies: - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 tapable: 2.2.1 dev: false @@ -3441,6 +5107,13 @@ packages: ansi-colors: 4.1.1 dev: false + /errno/0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + dependencies: + prr: 1.0.1 + dev: false + /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -3465,7 +5138,33 @@ packages: is-shared-array-buffer: 1.0.1 is-string: 1.0.7 is-weakref: 1.0.1 - object-inspect: 1.11.0 + object-inspect: 1.12.0 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: false + + /es-abstract/1.19.5: + resolution: {integrity: sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.0 object-keys: 1.1.1 object.assign: 4.1.2 string.prototype.trimend: 1.0.4 @@ -3473,10 +5172,20 @@ packages: unbox-primitive: 1.0.1 dev: false + /es-module-lexer/0.4.1: + resolution: {integrity: sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==} + dev: false + /es-module-lexer/0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} dev: false + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: false + /es-to-primitive/1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} @@ -3486,6 +5195,16 @@ packages: is-symbol: 1.0.4 dev: false + /es6-promise/4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + + /es6-promisify/5.0.0: + resolution: {integrity: sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=} + dependencies: + es6-promise: 4.2.8 + dev: false + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -3536,6 +5255,13 @@ packages: source-map: 0.6.1 dev: false + /eslint-config-prettier/8.3.0: + resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dev: false + /eslint-config-prettier/8.3.0_eslint@7.32.0: resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true @@ -3545,7 +5271,74 @@ packages: eslint: 7.32.0 dev: false - /eslint-plugin-prettier/3.4.1_6e975bd57c7acf028c1a9ddbbf60c898: + /eslint-config-prettier/8.3.0_eslint@8.14.0: + resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.14.0 + dev: false + + /eslint-import-resolver-node/0.3.6: + resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + dependencies: + debug: 3.2.7 + resolve: 1.22.0 + dev: false + + /eslint-module-utils/2.7.3: + resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} + engines: {node: '>=4'} + dependencies: + debug: 3.2.7 + find-up: 2.1.0 + dev: false + + /eslint-plugin-import/2.26.0: + resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + dependencies: + array-includes: 3.1.4 + array.prototype.flat: 1.3.0 + debug: 2.6.9 + doctrine: 2.1.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.3 + has: 1.0.3 + is-core-module: 2.9.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.5 + resolve: 1.22.0 + tsconfig-paths: 3.14.1 + dev: false + + /eslint-plugin-import/2.26.0_eslint@8.14.0: + resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + dependencies: + array-includes: 3.1.4 + array.prototype.flat: 1.3.0 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.14.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.3 + has: 1.0.3 + is-core-module: 2.9.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.5 + resolve: 1.22.0 + tsconfig-paths: 3.14.1 + dev: false + + /eslint-plugin-prettier/3.4.1_625706418ef443f92ded258e2cca0de0: resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -3558,7 +5351,22 @@ packages: dependencies: eslint: 7.32.0 eslint-config-prettier: 8.3.0_eslint@7.32.0 - prettier: 2.4.1 + prettier: 2.6.2 + prettier-linter-helpers: 1.0.0 + dev: false + + /eslint-plugin-prettier/3.4.1_eslint-config-prettier@8.3.0: + resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=5.0.0' + eslint-config-prettier: '*' + prettier: '>=1.13.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint-config-prettier: 8.3.0 prettier-linter-helpers: 1.0.0 dev: false @@ -3567,6 +5375,25 @@ packages: engines: {node: '>=6'} dev: false + /eslint-plugin-react/7.20.6: + resolution: {integrity: sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 + dependencies: + array-includes: 3.1.4 + array.prototype.flatmap: 1.2.5 + doctrine: 2.1.0 + has: 1.0.3 + jsx-ast-utils: 2.4.1 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.values: 1.1.5 + prop-types: 15.7.2 + resolve: 1.20.0 + string.prototype.matchall: 4.0.6 + dev: false + /eslint-plugin-react/7.20.6_eslint@7.32.0: resolution: {integrity: sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==} engines: {node: '>=4'} @@ -3602,6 +5429,14 @@ packages: estraverse: 4.3.0 dev: false + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: false + /eslint-utils/2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} @@ -3619,6 +5454,16 @@ packages: eslint-visitor-keys: 2.1.0 dev: false + /eslint-utils/3.0.0_eslint@8.14.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.14.0 + eslint-visitor-keys: 2.1.0 + dev: false + /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -3629,6 +5474,11 @@ packages: engines: {node: '>=10'} dev: false + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + /eslint/7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3663,7 +5513,7 @@ packages: json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 - minimatch: 3.0.4 + minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.1 progress: 2.0.3 @@ -3678,6 +5528,50 @@ packages: - supports-color dev: false + /eslint/8.14.0: + resolution: {integrity: sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.2.2 + '@humanwhocodes/config-array': 0.9.5 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + 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@8.14.0 + eslint-visitor-keys: 3.3.0 + espree: 9.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.12.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /espree/7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3687,6 +5581,15 @@ packages: eslint-visitor-keys: 1.3.0 dev: false + /espree/9.3.1: + resolution: {integrity: sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.7.0 + acorn-jsx: 5.3.2_acorn@8.7.0 + eslint-visitor-keys: 3.3.0 + dev: false + /esprima/1.2.2: resolution: {integrity: sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs=} engines: {node: '>=0.4.0'} @@ -3771,6 +5674,44 @@ packages: - utf-8-validate dev: false + /ethers/5.6.4: + resolution: {integrity: sha512-62UIfxAQXdf67TeeOaoOoPctm5hUlYgfd0iW3wxfj7qRYKDcvvy0f+sJ3W2/Pyx77R8dblvejA8jokj+lS+ATQ==} + dependencies: + '@ethersproject/abi': 5.6.1 + '@ethersproject/abstract-provider': 5.6.0 + '@ethersproject/abstract-signer': 5.6.0 + '@ethersproject/address': 5.6.0 + '@ethersproject/base64': 5.6.0 + '@ethersproject/basex': 5.6.0 + '@ethersproject/bignumber': 5.6.0 + '@ethersproject/bytes': 5.6.1 + '@ethersproject/constants': 5.6.0 + '@ethersproject/contracts': 5.6.0 + '@ethersproject/hash': 5.6.0 + '@ethersproject/hdnode': 5.6.0 + '@ethersproject/json-wallets': 5.6.0 + '@ethersproject/keccak256': 5.6.0 + '@ethersproject/logger': 5.6.0 + '@ethersproject/networks': 5.6.2 + '@ethersproject/pbkdf2': 5.6.0 + '@ethersproject/properties': 5.6.0 + '@ethersproject/providers': 5.6.4 + '@ethersproject/random': 5.6.0 + '@ethersproject/rlp': 5.6.0 + '@ethersproject/sha2': 5.6.0 + '@ethersproject/signing-key': 5.6.0 + '@ethersproject/solidity': 5.6.0 + '@ethersproject/strings': 5.6.0 + '@ethersproject/transactions': 5.6.0 + '@ethersproject/units': 5.6.0 + '@ethersproject/wallet': 5.6.0 + '@ethersproject/web': 5.6.0 + '@ethersproject/wordlists': 5.6.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /ethr-did-registry/0.0.3: resolution: {integrity: sha512-4BPvMGkxAK9vTduCq6D5b8ZqjteD2cvDIPPriXP6nnmPhWKFSxypo+AFvyQ0omJGa0cGTR+dkdI/8jiF7U/qaw==} dev: false @@ -3794,6 +5735,11 @@ packages: - utf-8-validate dev: false + /event-target-shim/5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + /events/3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -3869,23 +5815,21 @@ packages: engines: {node: '>=6'} dev: false - /expect/27.3.1: - resolution: {integrity: sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg==} + /expect/27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 - ansi-styles: 5.2.0 - jest-get-type: 27.3.1 - jest-matcher-utils: 27.3.1 - jest-message-util: 27.3.1 - jest-regex-util: 27.0.6 + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 dev: false /express/4.17.1: resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==} engines: {node: '>= 0.10.0'} dependencies: - accepts: 1.3.7 + accepts: 1.3.8 array-flatten: 1.1.1 body-parser: 1.19.0 content-disposition: 0.5.3 @@ -3917,6 +5861,43 @@ packages: vary: 1.1.2 dev: false + /express/4.18.0: + resolution: {integrity: sha512-EJEXxiTQJS3lIPrU1AE2vRuT7X7E+0KBbpm5GSoK524yl0K8X+er8zS2P14E64eqsVNoWbMCT7MpmQ+ErAhgRg==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.0 + content-disposition: 0.5.4 + content-type: 1.0.4 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.10.3 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: false + /extend-shallow/2.0.1: resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} engines: {node: '>=0.10.0'} @@ -3932,6 +5913,10 @@ packages: is-extendable: 1.0.1 dev: false + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + /external-editor/3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -3986,6 +5971,10 @@ packages: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: false + /fast-text-encoding/1.0.3: + resolution: {integrity: sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==} + dev: false + /fastq/1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: @@ -3998,9 +5987,8 @@ packages: bser: 2.1.1 dev: false - /figlet/1.5.2: - resolution: {integrity: sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==} - engines: {node: '>= 0.4.0'} + /fecha/4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} dev: false /figures/3.2.0: @@ -4017,6 +6005,12 @@ packages: flat-cache: 3.0.4 dev: false + /file-stream-rotator/0.6.1: + resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} + dependencies: + moment: 2.29.3 + dev: false + /file-uri-to-path/1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} dev: false @@ -4051,6 +6045,26 @@ packages: unpipe: 1.0.0 dev: false + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + dev: false + + /find-up/2.1.0: + resolution: {integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: false + /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -4071,14 +6085,8 @@ packages: resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} dev: false - /follow-redirects/1.14.5: - resolution: {integrity: sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + /fn.name/1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} dev: false /follow-redirects/1.14.9: @@ -4096,6 +6104,24 @@ packages: engines: {node: '>=0.10.0'} dev: false + /fork-ts-checker-webpack-plugin/6.2.0: + resolution: {integrity: sha512-DTNbOhq6lRdjYprukX54JMeYJgQ0zMow+R5BMLwWxEX2NAXthIkwnV8DBmsWjwNLSUItKZM4TCCJbtgrtKBu2Q==} + engines: {node: '>=10', yarn: '>=1.0.0'} + dependencies: + '@babel/code-frame': 7.16.0 + '@types/json-schema': 7.0.9 + chalk: 4.1.2 + chokidar: 3.5.2 + cosmiconfig: 6.0.0 + deepmerge: 4.2.2 + fs-extra: 9.1.0 + memfs: 3.3.0 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.3.5 + tapable: 1.1.3 + dev: false + /fork-ts-checker-webpack-plugin/6.3.4_1f87f326394b27519d7e15067f373e2e: resolution: {integrity: sha512-z0dns2NXH9NHH0wpW6iuUmyXYRN9BI2Lqnv+RCdL+9GXSW6tKUqYnwf+h3ZaucJsbsrdobdxuOELGgm1xVZITA==} engines: {node: '>=10', yarn: '>=1.0.0'} @@ -4120,7 +6146,7 @@ packages: fs-extra: 9.1.0 glob: 7.2.0 memfs: 3.3.0 - minimatch: 3.0.4 + minimatch: 3.1.2 schema-utils: 2.7.0 semver: 7.3.5 tapable: 1.1.3 @@ -4128,13 +6154,22 @@ packages: webpack: 5.58.2 dev: false + /form-data/2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /form-data/3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.33 + mime-types: 2.1.35 dev: false /formidable/1.2.6: @@ -4167,7 +6202,7 @@ packages: resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} engines: {node: '>=12'} dependencies: - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 jsonfile: 6.1.0 universalify: 2.0.0 dev: false @@ -4177,11 +6212,18 @@ packages: engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 jsonfile: 6.1.0 universalify: 2.0.0 dev: false + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: false + /fs-monkey/1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} dev: false @@ -4219,6 +6261,42 @@ packages: wide-align: 1.1.5 dev: false + /gauge/3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 1.2.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.5 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /gaxios/1.8.4: + resolution: {integrity: sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==} + dependencies: + abort-controller: 3.0.0 + extend: 3.0.2 + https-proxy-agent: 2.2.4 + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + + /gcp-metadata/1.0.0: + resolution: {integrity: sha512-Q6HrgfrCQeEircnNP3rCcEgiDv7eF9+1B+1MMgpE190+/+0mjQR8PxeOaRgxZWmdDAF9EIryHB9g1moPiw1SbQ==} + engines: {node: '>=6'} + dependencies: + gaxios: 1.8.4 + json-bigint: 0.3.1 + transitivePeerDependencies: + - encoding + dev: false + /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -4234,7 +6312,7 @@ packages: dependencies: function-bind: 1.1.1 has: 1.0.3 - has-symbols: 1.0.2 + has-symbols: 1.0.3 dev: false /get-package-type/0.1.0: @@ -4285,6 +6363,13 @@ packages: is-glob: 4.0.3 dev: false + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: false + /glob-to-regexp/0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: false @@ -4319,20 +6404,128 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.2.7 - ignore: 5.1.9 + ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 dev: false + /google-auth-library/3.1.2: + resolution: {integrity: sha512-cDQMzTotwyWMrg5jRO7q0A4TL/3GWBgO7I7q5xGKNiiFf9SmGY/OJ1YsLMgI2MVHHsEGyrqYnbnmV1AE+Z6DnQ==} + engines: {node: '>=6'} + dependencies: + base64-js: 1.5.1 + fast-text-encoding: 1.0.3 + gaxios: 1.8.4 + gcp-metadata: 1.0.0 + gtoken: 2.3.3 + https-proxy-agent: 2.2.4 + jws: 3.2.2 + lru-cache: 5.1.1 + semver: 5.7.1 + transitivePeerDependencies: + - encoding + dev: false + + /google-gax/0.25.6: + resolution: {integrity: sha512-+CVtOSLQt42mwVvJJirhBiAvWsp8zKeb9zW5Wy3wyvb3VG9OugHzZpwvYO9D4yNPPspe7L9CpIs80I5nUJlS8w==} + engines: {node: '>=6.0.0'} + dependencies: + '@grpc/grpc-js': 0.3.6 + '@grpc/proto-loader': 0.4.0 + duplexify: 3.7.1 + google-auth-library: 3.1.2 + google-proto-files: 0.20.0 + grpc: 1.24.11 + grpc-gcp: 0.1.1 + is-stream-ended: 0.1.4 + lodash.at: 4.6.0 + lodash.has: 4.5.2 + protobufjs: 6.11.2 + retry-request: 4.2.2 + semver: 6.3.0 + walkdir: 0.3.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /google-p12-pem/1.0.5: + resolution: {integrity: sha512-50rTrqYPTPPwlu9TNl/HkJbBENEpbRzTOVLFJ4YWM86njZgXHFy+FP+tLRSd9m132Li9Dqi27Z3KIWDEv5y+EA==} + hasBin: true + dependencies: + node-forge: 0.10.0 + pify: 4.0.1 + dev: false + + /google-proto-files/0.20.0: + resolution: {integrity: sha512-ORU+XhOeDv/UPtnCYLkO1ItmfhRCRPR3ZoeVQ7GfVzEs7PVitPIhsYlY5ZzG8XXnsdmtK27ENurfQ1jhAWpZHg==} + engines: {node: '>=6.0.0'} + dependencies: + '@google-cloud/promisify': 0.4.0 + protobufjs: 6.11.2 + walkdir: 0.3.2 + dev: false + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + /graceful-fs/4.2.8: resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} dev: false - /has-ansi/2.0.0: - resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} - engines: {node: '>=0.10.0'} + /grpc-gcp/0.1.1: + resolution: {integrity: sha512-MAt0Ae9QuL2Lbbt2d+kDta5AxqRD1JVXtBcJuQKp9GeFL5TxPw/hxIyDNyivPjKEXjbG3cBGwSE3CXq6a3KHEQ==} + engines: {node: '>=6'} dependencies: - ansi-regex: 2.1.1 + grpc: 1.24.11 + protobufjs: 6.11.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /grpc/1.24.11: + resolution: {integrity: sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==} + engines: {node: '>=4'} + deprecated: This library will not receive further updates other than security fixes. We recommend using @grpc/grpc-js instead. + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.9 + '@types/bytebuffer': 5.0.43 + lodash.camelcase: 4.3.0 + lodash.clone: 4.5.0 + nan: 2.15.0 + protobufjs: 5.0.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /gtoken/2.3.3: + resolution: {integrity: sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==} + engines: {node: '>=6.0.0'} + dependencies: + gaxios: 1.8.4 + google-p12-pem: 1.0.5 + jws: 3.2.2 + mime: 2.6.0 + pify: 4.0.1 + transitivePeerDependencies: + - encoding + dev: false + + /handlebars/4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.5 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.15.4 dev: false /has-bigints/1.0.1: @@ -4354,11 +6547,16 @@ packages: engines: {node: '>= 0.4'} dev: false + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + /has-tostringtag/1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.2 + has-symbols: 1.0.3 dev: false /has-unicode/2.0.1: @@ -4410,6 +6608,11 @@ packages: minimalistic-assert: 1.0.1 dev: false + /helmet/4.6.0: + resolution: {integrity: sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==} + engines: {node: '>=10.0.0'} + dev: false + /highlight.js/10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: false @@ -4422,6 +6625,10 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: false + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: false + /html-encoding-sniffer/2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} @@ -4455,6 +6662,17 @@ packages: toidentifier: 1.0.0 dev: false + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + /http-proxy-agent/4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} @@ -4466,6 +6684,14 @@ packages: - supports-color dev: false + /https-proxy-agent/2.2.4: + resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} + engines: {node: '>= 4.5.0'} + dependencies: + agent-base: 4.3.0 + debug: 3.2.7 + dev: false + /https-proxy-agent/5.0.0: resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} engines: {node: '>= 6'} @@ -4502,11 +6728,15 @@ packages: engines: {node: '>= 4'} dev: false - /ignore/5.1.9: - resolution: {integrity: sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==} + /ignore/5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} dev: false + /immediate/3.0.6: + resolution: {integrity: sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=} + dev: false + /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -4601,6 +6831,11 @@ packages: engines: {node: '>= 0.10'} dev: false + /invert-kv/1.0.0: + resolution: {integrity: sha1-EEqOSqym09jNFXqO+L+rLXo//bY=} + engines: {node: '>=0.10.0'} + dev: false + /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4624,6 +6859,10 @@ packages: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: false + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -4667,6 +6906,12 @@ packages: has: 1.0.3 dev: false + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: false + /is-data-descriptor/0.1.4: resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} engines: {node: '>=0.10.0'} @@ -4730,6 +6975,11 @@ packages: number-is-nan: 1.0.1 dev: false + /is-fullwidth-code-point/2.0.0: + resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} + engines: {node: '>=4'} + dev: false + /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -4757,6 +7007,11 @@ packages: engines: {node: '>= 0.4'} dev: false + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: false + /is-number-object/1.0.6: resolution: {integrity: sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==} engines: {node: '>= 0.4'} @@ -4799,6 +7054,16 @@ packages: resolution: {integrity: sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==} dev: false + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: false + + /is-stream-ended/0.1.4: + resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==} + dev: false + /is-stream/1.1.0: resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} engines: {node: '>=0.10.0'} @@ -4820,7 +7085,7 @@ packages: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.0.2 + has-symbols: 1.0.3 dev: false /is-typedarray/1.0.0: @@ -4838,6 +7103,12 @@ packages: call-bind: 1.0.2 dev: false + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: false + /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -4872,18 +7143,6 @@ packages: engines: {node: '>=8'} dev: false - /istanbul-lib-instrument/4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.16.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /istanbul-lib-instrument/5.1.0: resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} engines: {node: '>=8'} @@ -4917,8 +7176,8 @@ packages: - supports-color dev: false - /istanbul-reports/3.0.5: - resolution: {integrity: sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==} + /istanbul-reports/3.1.4: + resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 @@ -4930,35 +7189,35 @@ packages: engines: {node: '>=6'} dev: false - /jest-changed-files/27.3.0: - resolution: {integrity: sha512-9DJs9garMHv4RhylUMZgbdCJ3+jHSkpL9aaVKp13xtXAD80qLTLrqcDZL1PHA9dYA0bCI86Nv2BhkLpLhrBcPg==} + /jest-changed-files/27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 execa: 5.1.1 throat: 6.0.1 dev: false - /jest-circus/27.3.1: - resolution: {integrity: sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw==} + /jest-circus/27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.3.1 - '@jest/test-result': 27.3.1 - '@jest/types': 27.2.5 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 - expect: 27.3.1 + expect: 27.5.1 is-generator-fn: 2.1.0 - jest-each: 27.3.1 - jest-matcher-utils: 27.3.1 - jest-message-util: 27.3.1 - jest-runtime: 27.3.1 - jest-snapshot: 27.3.1 - jest-util: 27.3.1 - pretty-format: 27.3.1 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 slash: 3.0.0 stack-utils: 2.0.5 throat: 6.0.1 @@ -4966,8 +7225,8 @@ packages: - supports-color dev: false - /jest-cli/27.3.1_ts-node@10.7.0: - resolution: {integrity: sha512-WHnCqpfK+6EvT62me6WVs8NhtbjAS4/6vZJnk7/2+oOr50cwAzG4Wxt6RXX0hu6m1169ZGMlhYYUNeKBXCph/Q==} + /jest-cli/27.5.1: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: @@ -4976,16 +7235,76 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.3.1_ts-node@10.7.0 - '@jest/test-result': 27.3.1 - '@jest/types': 27.2.5 + '@jest/core': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 + import-local: 3.0.3 + jest-config: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + + /jest-cli/27.5.1_ts-node@10.7.0: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1_ts-node@10.7.0 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.0.3 + jest-config: 27.5.1_ts-node@10.7.0 + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + + /jest-cli/27.5.1_ts-node@9.1.1: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1_ts-node@9.1.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 import-local: 3.0.3 - jest-config: 27.3.1_ts-node@10.7.0 - jest-util: 27.3.1 - jest-validate: 27.3.1 + jest-config: 27.5.1_ts-node@9.1.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 prompts: 2.4.2 yargs: 16.2.0 transitivePeerDependencies: @@ -4996,8 +7315,8 @@ packages: - utf-8-validate dev: false - /jest-config/27.3.1_ts-node@10.7.0: - resolution: {integrity: sha512-KY8xOIbIACZ/vdYCKSopL44I0xboxC751IX+DXL2+Wx6DKNycyEfV3rryC3BPm5Uq/BBqDoMrKuqLEUNJmMKKg==} + /jest-config/27.5.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: ts-node: '>=9.0.0' @@ -5006,26 +7325,69 @@ packages: optional: true dependencies: '@babel/core': 7.16.0 - '@jest/test-sequencer': 27.3.1 - '@jest/types': 27.2.5 - babel-jest: 27.3.1_@babel+core@7.16.0 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.16.0 chalk: 4.1.2 ci-info: 3.2.0 deepmerge: 4.2.2 glob: 7.2.0 - graceful-fs: 4.2.8 - jest-circus: 27.3.1 - jest-environment-jsdom: 27.3.1 - jest-environment-node: 27.3.1 - jest-get-type: 27.3.1 - jest-jasmine2: 27.3.1 - jest-regex-util: 27.0.6 - jest-resolve: 27.3.1 - jest-runner: 27.3.1 - jest-util: 27.3.1 - jest-validate: 27.3.1 + graceful-fs: 4.2.10 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.4 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + + /jest-config/27.5.1_ts-node@10.7.0: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.16.0 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.16.0 + chalk: 4.1.2 + ci-info: 3.2.0 + deepmerge: 4.2.2 + glob: 7.2.0 + graceful-fs: 4.2.10 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 micromatch: 4.0.4 - pretty-format: 27.3.1 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 ts-node: 10.7.0_0cb88d80cb04d25b21fa3ec194608c65 transitivePeerDependencies: - bufferutil @@ -5034,6 +7396,47 @@ packages: - utf-8-validate dev: false + /jest-config/27.5.1_ts-node@9.1.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.16.0 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.16.0 + chalk: 4.1.2 + ci-info: 3.2.0 + deepmerge: 4.2.2 + glob: 7.2.0 + graceful-fs: 4.2.10 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.4 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 9.1.1_typescript@4.4.4 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + /jest-diff/26.6.2: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} engines: {node: '>= 10.14.2'} @@ -5044,44 +7447,44 @@ packages: pretty-format: 26.6.2 dev: false - /jest-diff/27.3.1: - resolution: {integrity: sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==} + /jest-diff/27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: chalk: 4.1.2 - diff-sequences: 27.0.6 - jest-get-type: 27.3.1 - pretty-format: 27.3.1 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 dev: false - /jest-docblock/27.0.6: - resolution: {integrity: sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==} + /jest-docblock/27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: detect-newline: 3.1.0 dev: false - /jest-each/27.3.1: - resolution: {integrity: sha512-E4SwfzKJWYcvOYCjOxhZcxwL+AY0uFMvdCOwvzgutJiaiodFjkxQQDxHm8FQBeTqDnSmKsQWn7ldMRzTn2zJaQ==} + /jest-each/27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 chalk: 4.1.2 - jest-get-type: 27.3.1 - jest-util: 27.3.1 - pretty-format: 27.3.1 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 dev: false - /jest-environment-jsdom/27.3.1: - resolution: {integrity: sha512-3MOy8qMzIkQlfb3W1TfrD7uZHj+xx8Olix5vMENkj5djPmRqndMaXtpnaZkxmxM+Qc3lo+yVzJjzuXbCcZjAlg==} + /jest-environment-jsdom/27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.3.1 - '@jest/fake-timers': 27.3.1 - '@jest/types': 27.2.5 + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 - jest-mock: 27.3.0 - jest-util: 27.3.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 jsdom: 16.7.0 transitivePeerDependencies: - bufferutil @@ -5090,16 +7493,16 @@ packages: - utf-8-validate dev: false - /jest-environment-node/27.3.1: - resolution: {integrity: sha512-T89F/FgkE8waqrTSA7/ydMkcc52uYPgZZ6q8OaZgyiZkJb5QNNCF6oPZjH9IfPFfcc9uBWh1574N0kY0pSvTXw==} + /jest-environment-node/27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.3.1 - '@jest/fake-timers': 27.3.1 - '@jest/types': 27.2.5 + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 - jest-mock: 27.3.0 - jest-util: 27.3.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 dev: false /jest-get-type/26.3.0: @@ -5107,8 +7510,8 @@ packages: engines: {node: '>= 10.14.2'} dev: false - /jest-get-type/27.3.1: - resolution: {integrity: sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==} + /jest-get-type/27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: false @@ -5133,94 +7536,93 @@ packages: fsevents: 2.3.2 dev: false - /jest-haste-map/27.3.1: - resolution: {integrity: sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg==} + /jest-haste-map/27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.5 '@types/node': 16.11.6 anymatch: 3.1.2 fb-watchman: 2.0.1 - graceful-fs: 4.2.8 - jest-regex-util: 27.0.6 - jest-serializer: 27.0.6 - jest-util: 27.3.1 - jest-worker: 27.3.1 + graceful-fs: 4.2.10 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 micromatch: 4.0.4 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: false - /jest-jasmine2/27.3.1: - resolution: {integrity: sha512-WK11ZUetDQaC09w4/j7o4FZDUIp+4iYWH/Lik34Pv7ukL+DuXFGdnmmi7dT58J2ZYKFB5r13GyE0z3NPeyJmsg==} + /jest-jasmine2/27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/traverse': 7.16.0 - '@jest/environment': 27.3.1 - '@jest/source-map': 27.0.6 - '@jest/test-result': 27.3.1 - '@jest/types': 27.2.5 + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 chalk: 4.1.2 co: 4.6.0 - expect: 27.3.1 + expect: 27.5.1 is-generator-fn: 2.1.0 - jest-each: 27.3.1 - jest-matcher-utils: 27.3.1 - jest-message-util: 27.3.1 - jest-runtime: 27.3.1 - jest-snapshot: 27.3.1 - jest-util: 27.3.1 - pretty-format: 27.3.1 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 throat: 6.0.1 transitivePeerDependencies: - supports-color dev: false - /jest-leak-detector/27.3.1: - resolution: {integrity: sha512-78QstU9tXbaHzwlRlKmTpjP9k4Pvre5l0r8Spo4SbFFVy/4Abg9I6ZjHwjg2QyKEAMg020XcjP+UgLZIY50yEg==} + /jest-leak-detector/27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - jest-get-type: 27.3.1 - pretty-format: 27.3.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 dev: false - /jest-matcher-utils/27.3.1: - resolution: {integrity: sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==} + /jest-matcher-utils/27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: chalk: 4.1.2 - jest-diff: 27.3.1 - jest-get-type: 27.3.1 - pretty-format: 27.3.1 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 dev: false - /jest-message-util/27.3.1: - resolution: {integrity: sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==} + /jest-message-util/27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/code-frame': 7.16.0 - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 micromatch: 4.0.4 - pretty-format: 27.3.1 + pretty-format: 27.5.1 slash: 3.0.0 stack-utils: 2.0.5 dev: false - /jest-mock/27.3.0: - resolution: {integrity: sha512-ziZiLk0elZOQjD08bLkegBzv5hCABu/c8Ytx45nJKkysQwGaonvmTxwjLqEA4qGdasq9o2I8/HtdGMNnVsMTGw==} + /jest-mock/27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 '@types/node': 16.11.6 dev: false - /jest-pnp-resolver/1.2.2_jest-resolve@27.3.1: + /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} peerDependencies: @@ -5229,7 +7631,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 27.3.1 + jest-resolve: 27.5.1 dev: false /jest-regex-util/26.0.0: @@ -5237,62 +7639,61 @@ packages: engines: {node: '>= 10.14.2'} dev: false - /jest-regex-util/27.0.6: - resolution: {integrity: sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==} + /jest-regex-util/27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: false - /jest-resolve-dependencies/27.3.1: - resolution: {integrity: sha512-X7iLzY8pCiYOnvYo2YrK3P9oSE8/3N2f4pUZMJ8IUcZnT81vlSonya1KTO9ZfKGuC+svE6FHK/XOb8SsoRUV1A==} + /jest-resolve-dependencies/27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 - jest-regex-util: 27.0.6 - jest-snapshot: 27.3.1 + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 transitivePeerDependencies: - supports-color dev: false - /jest-resolve/27.3.1: - resolution: {integrity: sha512-Dfzt25CFSPo3Y3GCbxynRBZzxq9AdyNN+x/v2IqYx6KVT5Z6me2Z/PsSGFSv3cOSUZqJ9pHxilao/I/m9FouLw==} + /jest-resolve/27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 chalk: 4.1.2 - graceful-fs: 4.2.8 - jest-haste-map: 27.3.1 - jest-pnp-resolver: 1.2.2_jest-resolve@27.3.1 - jest-util: 27.3.1 - jest-validate: 27.3.1 - resolve: 1.20.0 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.0 resolve.exports: 1.1.0 slash: 3.0.0 dev: false - /jest-runner/27.3.1: - resolution: {integrity: sha512-r4W6kBn6sPr3TBwQNmqE94mPlYVn7fLBseeJfo4E2uCTmAyDFm2O5DYAQAFP7Q3YfiA/bMwg8TVsciP7k0xOww==} + /jest-runner/27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.3.1 - '@jest/environment': 27.3.1 - '@jest/test-result': 27.3.1 - '@jest/transform': 27.3.1 - '@jest/types': 27.2.5 + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 chalk: 4.1.2 emittery: 0.8.1 - exit: 0.1.2 - graceful-fs: 4.2.8 - jest-docblock: 27.0.6 - jest-environment-jsdom: 27.3.1 - jest-environment-node: 27.3.1 - jest-haste-map: 27.3.1 - jest-leak-detector: 27.3.1 - jest-message-util: 27.3.1 - jest-resolve: 27.3.1 - jest-runtime: 27.3.1 - jest-util: 27.3.1 - jest-worker: 27.3.1 + graceful-fs: 4.2.10 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 source-map-support: 0.5.20 throat: 6.0.1 transitivePeerDependencies: @@ -5302,36 +7703,32 @@ packages: - utf-8-validate dev: false - /jest-runtime/27.3.1: - resolution: {integrity: sha512-qtO6VxPbS8umqhEDpjA4pqTkKQ1Hy4ZSi9mDVeE9Za7LKBo2LdW2jmT+Iod3XFaJqINikZQsn2wEi0j9wPRbLg==} + /jest-runtime/27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.3.1 - '@jest/environment': 27.3.1 - '@jest/globals': 27.3.1 - '@jest/source-map': 27.0.6 - '@jest/test-result': 27.3.1 - '@jest/transform': 27.3.1 - '@jest/types': 27.2.5 - '@types/yargs': 16.0.4 + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 execa: 5.1.1 - exit: 0.1.2 glob: 7.2.0 - graceful-fs: 4.2.8 - jest-haste-map: 27.3.1 - jest-message-util: 27.3.1 - jest-mock: 27.3.0 - jest-regex-util: 27.0.6 - jest-resolve: 27.3.1 - jest-snapshot: 27.3.1 - jest-util: 27.3.1 - jest-validate: 27.3.1 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 slash: 3.0.0 strip-bom: 4.0.0 - yargs: 16.2.0 transitivePeerDependencies: - supports-color dev: false @@ -5341,44 +7738,42 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@types/node': 16.11.6 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 dev: false - /jest-serializer/27.0.6: - resolution: {integrity: sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==} + /jest-serializer/27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@types/node': 16.11.6 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 dev: false - /jest-snapshot/27.3.1: - resolution: {integrity: sha512-APZyBvSgQgOT0XumwfFu7X3G5elj6TGhCBLbBdn3R1IzYustPGPE38F51dBWMQ8hRXa9je0vAdeVDtqHLvB6lg==} + /jest-snapshot/27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/core': 7.16.0 '@babel/generator': 7.16.0 - '@babel/parser': 7.16.2 '@babel/plugin-syntax-typescript': 7.16.0_@babel+core@7.16.0 '@babel/traverse': 7.16.0 '@babel/types': 7.16.0 - '@jest/transform': 27.3.1 - '@jest/types': 27.2.5 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 '@types/babel__traverse': 7.14.2 '@types/prettier': 2.4.1 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.0 chalk: 4.1.2 - expect: 27.3.1 - graceful-fs: 4.2.8 - jest-diff: 27.3.1 - jest-get-type: 27.3.1 - jest-haste-map: 27.3.1 - jest-matcher-utils: 27.3.1 - jest-message-util: 27.3.1 - jest-resolve: 27.3.1 - jest-util: 27.3.1 + expect: 27.5.1 + graceful-fs: 4.2.10 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 natural-compare: 1.4.0 - pretty-format: 27.3.1 + pretty-format: 27.5.1 semver: 7.3.5 transitivePeerDependencies: - supports-color @@ -5396,40 +7791,40 @@ packages: micromatch: 4.0.4 dev: false - /jest-util/27.3.1: - resolution: {integrity: sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw==} + /jest-util/27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 '@types/node': 16.11.6 chalk: 4.1.2 ci-info: 3.2.0 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 picomatch: 2.3.0 dev: false - /jest-validate/27.3.1: - resolution: {integrity: sha512-3H0XCHDFLA9uDII67Bwi1Vy7AqwA5HqEEjyy934lgVhtJ3eisw6ShOF1MDmRPspyikef5MyExvIm0/TuLzZ86Q==} + /jest-validate/27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 + '@jest/types': 27.5.1 camelcase: 6.2.0 chalk: 4.1.2 - jest-get-type: 27.3.1 + jest-get-type: 27.5.1 leven: 3.1.0 - pretty-format: 27.3.1 + pretty-format: 27.5.1 dev: false - /jest-watcher/27.3.1: - resolution: {integrity: sha512-9/xbV6chABsGHWh9yPaAGYVVKurWoP3ZMCv6h+O1v9/+pkOroigs6WzZ0e9gLP/njokUwM7yQhr01LKJVMkaZA==} + /jest-watcher/27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/test-result': 27.3.1 - '@jest/types': 27.2.5 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 16.11.6 ansi-escapes: 4.3.2 chalk: 4.1.2 - jest-util: 27.3.1 + jest-util: 27.5.1 string-length: 4.0.2 dev: false @@ -5442,8 +7837,8 @@ packages: supports-color: 7.2.0 dev: false - /jest-worker/27.3.1: - resolution: {integrity: sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==} + /jest-worker/27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: '@types/node': 16.11.6 @@ -5451,6 +7846,27 @@ packages: supports-color: 8.1.1 dev: false + /jest/27.0.6: + resolution: {integrity: sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1 + import-local: 3.0.3 + jest-cli: 27.5.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + /jest/27.0.6_ts-node@10.7.0: resolution: {integrity: sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -5461,9 +7877,30 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.3.1_ts-node@10.7.0 + '@jest/core': 27.5.1_ts-node@10.7.0 + import-local: 3.0.3 + jest-cli: 27.5.1_ts-node@10.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + + /jest/27.5.1_ts-node@9.1.1: + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1_ts-node@9.1.1 import-local: 3.0.3 - jest-cli: 27.3.1_ts-node@10.7.0 + jest-cli: 27.5.1_ts-node@9.1.1 transitivePeerDependencies: - bufferutil - canvas @@ -5513,7 +7950,7 @@ packages: optional: true dependencies: abab: 2.0.5 - acorn: 8.5.0 + acorn: 8.7.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -5551,6 +7988,12 @@ packages: hasBin: true dev: false + /json-bigint/0.3.1: + resolution: {integrity: sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==} + dependencies: + bignumber.js: 9.0.2 + dev: false + /json-parse-better-errors/1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} dev: false @@ -5587,7 +8030,7 @@ packages: engines: {node: '>=6'} hasBin: true dependencies: - minimist: 1.2.5 + minimist: 1.2.6 dev: false /jsonc-parser/3.0.0: @@ -5599,7 +8042,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 dev: false /jsonpath/1.1.1: @@ -5610,6 +8053,22 @@ packages: underscore: 1.12.1 dev: false + /jsonwebtoken/8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.2 + semver: 5.7.1 + dev: false + /jsx-ast-utils/2.4.1: resolution: {integrity: sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==} engines: {node: '>=4.0'} @@ -5618,6 +8077,21 @@ packages: object.assign: 4.1.2 dev: false + /jwa/1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws/3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + /kind-of/3.2.2: resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} engines: {node: '>=0.10.0'} @@ -5647,6 +8121,17 @@ packages: engines: {node: '>=6'} dev: false + /kuler/2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: false + + /lcid/1.0.0: + resolution: {integrity: sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=} + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: 1.0.0 + dev: false + /leven/3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -5672,15 +8157,54 @@ packages: resolution: {integrity: sha512-UBtU0ylpZPKPT8NLIyQJWj/DToMFxmo3Fm5m6qDc0LATvf0SY0qUhaurCEvukAB9Fo+Ia2Anjzqwoupaa64fXg==} dev: false + /lie/3.1.1: + resolution: {integrity: sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=} + dependencies: + immediate: 3.0.6 + dev: false + /lines-and-columns/1.1.6: resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} dev: false + /load-json-file/4.0.0: + resolution: {integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs=} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: false + /loader-runner/4.2.0: resolution: {integrity: sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==} engines: {node: '>=6.11.5'} dev: false + /loader-utils/1.4.0: + resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.1 + dev: false + + /localforage/1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /locate-path/2.0.0: + resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: false + /locate-path/5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -5688,6 +8212,18 @@ packages: p-locate: 4.1.0 dev: false + /lodash.at/4.6.0: + resolution: {integrity: sha1-k83OZk8KGZTqM9181A4jr9EbD/g=} + dev: false + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=} + dev: false + + /lodash.clone/4.5.0: + resolution: {integrity: sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=} + dev: false + /lodash.get/4.4.2: resolution: {integrity: sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=} dev: false @@ -5696,6 +8232,30 @@ packages: resolution: {integrity: sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=} dev: false + /lodash.includes/4.3.0: + resolution: {integrity: sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=} + dev: false + + /lodash.isboolean/3.0.3: + resolution: {integrity: sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=} + dev: false + + /lodash.isinteger/4.0.4: + resolution: {integrity: sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=} + dev: false + + /lodash.isnumber/3.0.3: + resolution: {integrity: sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=} + dev: false + + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=} + dev: false + + /lodash.isstring/4.0.1: + resolution: {integrity: sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=} + dev: false + /lodash.memoize/4.1.2: resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} dev: false @@ -5704,10 +8264,18 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: false + /lodash.once/4.1.1: + resolution: {integrity: sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=} + dev: false + /lodash.set/4.3.2: resolution: {integrity: sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=} dev: false + /lodash.toarray/4.4.0: + resolution: {integrity: sha1-JMS/zWsvuji/0FlNsRedjptlZWE=} + dev: false + /lodash.truncate/4.4.2: resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} dev: false @@ -5724,6 +8292,25 @@ packages: is-unicode-supported: 0.1.0 dev: false + /logform/2.4.0: + resolution: {integrity: sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==} + dependencies: + '@colors/colors': 1.5.0 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.3.1 + triple-beam: 1.3.0 + dev: false + + /long/3.2.0: + resolution: {integrity: sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=} + engines: {node: '>=0.6'} + dev: false + + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + /loose-envify/1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -5731,6 +8318,12 @@ packages: js-tokens: 4.0.0 dev: false + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -5738,6 +8331,14 @@ packages: yallist: 4.0.0 dev: false + /lru_map/0.3.3: + resolution: {integrity: sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=} + dev: false + + /lunr/2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + dev: false + /macos-release/2.5.0: resolution: {integrity: sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==} engines: {node: '>=6'} @@ -5778,6 +8379,12 @@ packages: object-visit: 1.0.1 dev: false + /marked/4.0.14: + resolution: {integrity: sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==} + engines: {node: '>= 12'} + hasBin: true + dev: false + /media-typer/0.3.0: resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} engines: {node: '>= 0.6'} @@ -5790,6 +8397,19 @@ packages: fs-monkey: 1.0.3 dev: false + /memory-fs/0.5.0: + resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + dependencies: + errno: 0.1.8 + readable-stream: 2.3.7 + dev: false + + /memorystream/0.3.1: + resolution: {integrity: sha1-htcJCzDORV1j+64S3aUaR93K+bI=} + engines: {node: '>= 0.10.0'} + dev: false + /merge-descriptors/1.0.1: resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} dev: false @@ -5840,6 +8460,11 @@ packages: engines: {node: '>= 0.6'} dev: false + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + /mime-types/2.1.33: resolution: {integrity: sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==} engines: {node: '>= 0.6'} @@ -5847,6 +8472,13 @@ packages: mime-db: 1.50.0 dev: false + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + /mime/1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -5883,10 +8515,42 @@ packages: brace-expansion: 1.1.11 dev: false + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimatch/5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimist/1.2.5: resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} dev: false + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: false + + /minipass/3.1.6: + resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + yallist: 4.0.0 + dev: false + /mixin-deep/1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -5903,7 +8567,7 @@ packages: resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} hasBin: true dependencies: - minimist: 1.2.5 + minimist: 1.2.6 dev: false /mkdirp/1.0.4: @@ -5912,6 +8576,10 @@ packages: hasBin: true dev: false + /moment/2.29.3: + resolution: {integrity: sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==} + dev: false + /ms/2.0.0: resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} dev: false @@ -5924,6 +8592,10 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + /multer/1.4.3: resolution: {integrity: sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==} engines: {node: '>= 0.10.0'} @@ -5933,11 +8605,15 @@ packages: concat-stream: 1.6.2 mkdirp: 0.5.5 object-assign: 4.1.1 - on-finished: 2.3.0 + on-finished: 2.4.1 type-is: 1.6.18 xtend: 4.0.2 dev: false + /multiformats/9.6.4: + resolution: {integrity: sha512-fCCB6XMrr6CqJiHNjfFNGT0v//dxOBMrOMqUIzpPc/mmITweLEyhvMpY9bF+jZ9z3vaMAau5E8B68DW77QMXkg==} + dev: false + /mute-stream/0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: false @@ -5950,6 +8626,10 @@ packages: thenify-all: 1.6.0 dev: false + /nan/2.15.0: + resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + dev: false + /nanoid/3.2.0: resolution: {integrity: sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -5986,6 +8666,11 @@ packages: engines: {node: '>= 0.6'} dev: false + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + /neo-async/2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false @@ -6013,19 +8698,35 @@ packages: semver: 7.3.5 dev: false + /node-emoji/1.10.0: + resolution: {integrity: sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==} + dependencies: + lodash.toarray: 4.4.0 + dev: false + /node-emoji/1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 dev: false - /node-fetch/2.6.6: - resolution: {integrity: sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==} + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true dependencies: whatwg-url: 5.0.0 dev: false + /node-forge/0.10.0: + resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} + engines: {node: '>= 6.0.0'} + dev: false + /node-int64/0.4.0: resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} dev: false @@ -6039,6 +8740,23 @@ packages: resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==} dev: false + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.0 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: false + /normalize-path/2.1.1: resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} engines: {node: '>=0.10.0'} @@ -6051,6 +8769,22 @@ packages: engines: {node: '>=0.10.0'} dev: false + /npm-run-all/4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.0.4 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.7.3 + string.prototype.padend: 3.1.3 + dev: false + /npm-run-path/2.0.2: resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=} engines: {node: '>=4'} @@ -6074,6 +8808,15 @@ packages: set-blocking: 2.0.0 dev: false + /npmlog/5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: false + /number-is-nan/1.0.1: resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=} engines: {node: '>=0.10.0'} @@ -6102,8 +8845,8 @@ packages: engines: {node: '>= 6'} dev: false - /object-inspect/1.11.0: - resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==} + /object-inspect/1.12.0: + resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} dev: false /object-keys/1.1.1: @@ -6124,7 +8867,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - has-symbols: 1.0.2 + has-symbols: 1.0.3 object-keys: 1.1.1 dev: false @@ -6169,12 +8912,30 @@ packages: ee-first: 1.1.1 dev: false + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /on-headers/1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: false + /once/1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} dependencies: wrappy: 1.0.2 dev: false + /one-time/1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: false + /onetime/5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -6210,6 +8971,39 @@ packages: word-wrap: 1.2.3 dev: false + /optjs/3.2.2: + resolution: {integrity: sha1-aabOicRCpEQDFBrS+bNwvVu29O4=} + dev: false + + /ora/5.3.0: + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + is-interactive: 1.0.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /ora/5.4.0: + resolution: {integrity: sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + /ora/5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -6225,6 +9019,21 @@ packages: wcwidth: 1.0.1 dev: false + /os-locale/1.4.0: + resolution: {integrity: sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=} + engines: {node: '>=0.10.0'} + dependencies: + lcid: 1.0.0 + dev: false + + /os-name/4.0.0: + resolution: {integrity: sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg==} + engines: {node: '>=10'} + dependencies: + macos-release: 2.5.0 + windows-release: 4.0.0 + dev: false + /os-name/4.0.1: resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} engines: {node: '>=10'} @@ -6243,6 +9052,13 @@ packages: engines: {node: '>=4'} dev: false + /p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: false + /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -6257,6 +9073,13 @@ packages: yocto-queue: 0.1.0 dev: false + /p-locate/2.0.0: + resolution: {integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: false + /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -6264,11 +9087,20 @@ packages: p-limit: 2.3.0 dev: false + /p-try/1.0.0: + resolution: {integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=} + engines: {node: '>=4'} + dev: false + /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: false + /packet-reader/1.0.0: + resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + dev: false + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -6276,9 +9108,12 @@ packages: callsites: 3.1.0 dev: false - /parent-require/1.0.0: - resolution: {integrity: sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=} - engines: {node: '>= 0.4.0'} + /parse-json/4.0.0: + resolution: {integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 dev: false /parse-json/5.2.0: @@ -6315,6 +9150,31 @@ packages: engines: {node: '>=0.10.0'} dev: false + /passport-jwt/4.0.0: + resolution: {integrity: sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==} + dependencies: + jsonwebtoken: 8.5.1 + passport-strategy: 1.0.0 + dev: false + + /passport-strategy/1.0.0: + resolution: {integrity: sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=} + engines: {node: '>= 0.4.0'} + dev: false + + /passport/0.5.2: + resolution: {integrity: sha512-w9n/Ot5I7orGD4y+7V3EFJCQEznE5RxHamUxcqLT2QoJY0f2JdN8GyHonYFvN0Vz+L6lUJfVhrk2aZz2LbuREw==} + engines: {node: '>= 0.4.0'} + dependencies: + passport-strategy: 1.0.0 + pause: 0.0.1 + dev: false + + /path-exists/3.0.0: + resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} + engines: {node: '>=4'} + dev: false + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6347,11 +9207,78 @@ packages: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} dev: false + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: false + /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: false + /pause/0.0.1: + resolution: {integrity: sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=} + dev: false + + /pg-connection-string/2.5.0: + resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==} + dev: false + + /pg-int8/1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + dev: false + + /pg-pool/3.5.1_pg@8.7.3: + resolution: {integrity: sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==} + peerDependencies: + pg: '>=8.0' + dependencies: + pg: 8.7.3 + dev: false + + /pg-protocol/1.5.0: + resolution: {integrity: sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==} + dev: false + + /pg-types/2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + 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 + dev: false + + /pg/8.7.3: + resolution: {integrity: sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=2.0.0' + peerDependenciesMeta: + pg-native: + optional: true + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 2.5.0 + pg-pool: 3.5.1_pg@8.7.3 + pg-protocol: 1.5.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + dev: false + + /pgpass/1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + dependencies: + split2: 4.1.0 + dev: false + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: false @@ -6361,6 +9288,22 @@ packages: engines: {node: '>=8.6'} dev: false + /pidtree/0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /pify/3.0.0: + resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} + engines: {node: '>=4'} + dev: false + + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + /pirates/4.0.1: resolution: {integrity: sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==} engines: {node: '>= 6'} @@ -6368,6 +9311,11 @@ packages: node-modules-regexp: 1.0.0 dev: false + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: false + /pkg-dir/4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -6385,6 +9333,28 @@ packages: engines: {node: '>=0.10.0'} dev: false + /postgres-array/2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + dev: false + + /postgres-bytea/1.0.0: + resolution: {integrity: sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-date/1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-interval/1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + dependencies: + xtend: 4.0.2 + dev: false + /prebuild-install/7.0.1: resolution: {integrity: sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==} engines: {node: '>=10'} @@ -6422,8 +9392,8 @@ packages: fast-diff: 1.2.0 dev: false - /prettier/2.4.1: - resolution: {integrity: sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==} + /prettier/2.6.2: + resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} engines: {node: '>=10.13.0'} hasBin: true dev: false @@ -6438,11 +9408,10 @@ packages: react-is: 17.0.2 dev: false - /pretty-format/27.3.1: - resolution: {integrity: sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==} + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.5 ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 @@ -6478,6 +9447,37 @@ packages: engines: {node: '>= 8'} dev: false + /protobufjs/5.0.3: + resolution: {integrity: sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==} + engines: {node: '>=0.8'} + hasBin: true + dependencies: + ascli: 1.0.1 + bytebuffer: 5.0.1 + glob: 7.2.0 + yargs: 3.32.0 + dev: false + + /protobufjs/6.11.2: + resolution: {integrity: sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==} + hasBin: true + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.1 + '@types/node': 16.11.6 + long: 4.0.0 + dev: false + /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -6486,6 +9486,10 @@ packages: ipaddr.js: 1.9.1 dev: false + /prr/1.0.1: + resolution: {integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY=} + dev: false + /psl/1.8.0: resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} dev: false @@ -6502,8 +9506,8 @@ packages: engines: {node: '>=6'} dev: false - /qs/6.10.1: - resolution: {integrity: sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==} + /qs/6.10.3: + resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 @@ -6545,6 +9549,16 @@ packages: unpipe: 1.0.0 dev: false + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + /rc/1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -6563,6 +9577,15 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: false + /read-pkg/3.0.0: + resolution: {integrity: sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: false + /readable-stream/1.1.14: resolution: {integrity: sha1-fPTFTvZI44EwhMY23SB54WbAgdk=} dependencies: @@ -6593,6 +9616,13 @@ packages: util-deprecate: 1.0.2 dev: false + /readdirp/3.5.0: + resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.0 + dev: false + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -6604,7 +9634,18 @@ packages: resolution: {integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=} engines: {node: '>= 0.10'} dependencies: - resolve: 1.20.0 + resolve: 1.22.0 + dev: false + + /redact-pii/3.2.3: + resolution: {integrity: sha512-gWKxCCMPsaBArF9U7bnnkSSIfFPi1+y4Cv3pzOd3Xajg6fCs1NP4DLkmlIMSFjchNu9PEzLCDVgra8p3A16Cyg==} + engines: {node: '>8.0.0'} + dependencies: + '@google-cloud/dlp': 0.12.0 + lodash: 4.17.21 + transitivePeerDependencies: + - encoding + - supports-color dev: false /reflect-metadata/0.1.13: @@ -6697,6 +9738,15 @@ packages: path-parse: 1.0.7 dev: false + /resolve/1.22.0: + resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + /restore-cursor/3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -6710,6 +9760,16 @@ packages: engines: {node: '>=0.12'} dev: false + /retry-request/4.2.2: + resolution: {integrity: sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==} + engines: {node: '>=8.10.0'} + dependencies: + debug: 4.3.2 + extend: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6738,6 +9798,13 @@ packages: queue-microtask: 1.2.3 dev: false + /rxjs/6.6.3: + resolution: {integrity: sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: false + /rxjs/6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} @@ -6765,6 +9832,11 @@ packages: ret: 0.1.15 dev: false + /safe-stable-stringify/2.3.1: + resolution: {integrity: sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==} + engines: {node: '>=10'} + dev: false + /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false @@ -6782,7 +9854,7 @@ packages: execa: 1.0.0 fb-watchman: 2.0.1 micromatch: 3.1.10 - minimist: 1.2.5 + minimist: 1.2.6 walker: 1.0.8 dev: false @@ -6856,6 +9928,25 @@ packages: statuses: 1.5.0 dev: false + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + dev: false + /serialize-javascript/6.0.0: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} dependencies: @@ -6872,6 +9963,16 @@ packages: send: 0.17.1 dev: false + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + dev: false + /set-blocking/2.0.0: resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} dev: false @@ -6890,6 +9991,10 @@ packages: resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} dev: false + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + /sha.js/2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true @@ -6922,6 +10027,10 @@ packages: engines: {node: '>=8'} dev: false + /shell-quote/1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} + dev: false + /shelljs/0.8.4: resolution: {integrity: sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==} engines: {node: '>=4'} @@ -6932,12 +10041,20 @@ packages: rechoir: 0.6.2 dev: false + /shiki/0.10.1: + resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} + dependencies: + jsonc-parser: 3.0.0 + vscode-oniguruma: 1.6.2 + vscode-textmate: 5.2.0 + dev: false + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.1 - object-inspect: 1.11.0 + object-inspect: 1.12.0 dev: false /signal-exit/3.0.5: @@ -6956,6 +10073,12 @@ packages: simple-concat: 1.0.1 dev: false + /simple-swizzle/0.2.2: + resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} + dependencies: + is-arrayish: 0.3.2 + dev: false + /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: false @@ -7004,6 +10127,10 @@ packages: use: 3.1.1 dev: false + /source-list-map/2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + dev: false + /source-map-resolve/0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} dependencies: @@ -7044,6 +10171,28 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: false + /spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.11 + dev: false + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: false + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.11 + dev: false + + /spdx-license-ids/3.0.11: + resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + dev: false + /split-string/3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} @@ -7051,10 +10200,19 @@ packages: extend-shallow: 3.0.2 dev: false + /split2/4.1.0: + resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} + engines: {node: '>= 10.x'} + dev: false + /sprintf-js/1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} dev: false + /stack-trace/0.0.10: + resolution: {integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=} + dev: false + /stack-utils/2.0.5: resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} engines: {node: '>=10'} @@ -7081,6 +10239,15 @@ packages: engines: {node: '>= 0.6'} dev: false + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /stream-shift/1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: false + /streamsearch/0.1.2: resolution: {integrity: sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=} engines: {node: '>=0.8.0'} @@ -7103,6 +10270,14 @@ packages: strip-ansi: 3.0.1 dev: false + /string-width/2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: false + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -7125,6 +10300,15 @@ packages: side-channel: 1.0.4 dev: false + /string.prototype.padend/3.1.3: + resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.1 + dev: false + /string.prototype.trimend/1.0.4: resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} dependencies: @@ -7162,6 +10346,13 @@ packages: ansi-regex: 2.1.1 dev: false + /strip-ansi/4.0.0: + resolution: {integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8=} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: false + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -7199,9 +10390,27 @@ packages: engines: {node: '>=8'} dev: false + /superagent/3.8.3: + resolution: {integrity: sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==} + engines: {node: '>= 4.0'} + deprecated: Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . + dependencies: + component-emitter: 1.3.0 + cookiejar: 2.1.3 + debug: 3.2.7 + extend: 3.0.2 + form-data: 2.5.1 + formidable: 1.2.6 + methods: 1.1.2 + mime: 1.6.0 + qs: 6.10.3 + readable-stream: 2.3.7 + dev: false + /superagent/6.1.0: resolution: {integrity: sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==} engines: {node: '>= 7.0.0'} + deprecated: Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . dependencies: component-emitter: 1.3.0 cookiejar: 2.1.3 @@ -7211,13 +10420,21 @@ packages: formidable: 1.2.6 methods: 1.1.2 mime: 2.6.0 - qs: 6.10.1 + qs: 6.10.3 readable-stream: 3.6.0 semver: 7.3.5 transitivePeerDependencies: - supports-color dev: false + /supertest/4.0.2: + resolution: {integrity: sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==} + engines: {node: '>=6.0.0'} + dependencies: + methods: 1.1.2 + superagent: 3.8.3 + dev: false + /supertest/6.1.6: resolution: {integrity: sha512-0hACYGNJ8OHRg8CRITeZOdbjur7NLuNs0mBjVhdpxi7hP6t3QIbOzLON5RTUmZcy2I9riuII3+Pr2C7yztrIIg==} engines: {node: '>=6.0.0'} @@ -7228,11 +10445,6 @@ packages: - supports-color dev: false - /supports-color/2.0.0: - resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=} - engines: {node: '>=0.8.0'} - dev: false - /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -7262,19 +10474,30 @@ packages: supports-color: 7.2.0 dev: false + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + /swagger-ui-dist/3.52.5: resolution: {integrity: sha512-8z18eX8G/jbTXYzyNIaobrnD7PSN7yU/YkSasMmajrXtw0FGS64XjrKn5v37d36qmU3o1xLeuYnktshRr7uIFw==} dev: false - /swagger-ui-express/4.1.6: + /swagger-ui-express/4.1.6_express@4.18.0: resolution: {integrity: sha512-Xs2BGGudvDBtL7RXcYtNvHsFtP1DBFPMJFRxHe5ez/VG/rzVOEjazJOOSc/kSCyxreCTKfJrII6MJlL9a6t8vw==} engines: {node: '>= v0.10.32'} peerDependencies: express: '>=4.0.0' dependencies: + express: 4.18.0 swagger-ui-dist: 3.52.5 dev: false + /symbol-observable/3.0.0: + resolution: {integrity: sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==} + engines: {node: '>=0.10'} + dev: false + /symbol-observable/4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} @@ -7288,7 +10511,7 @@ packages: resolution: {integrity: sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==} engines: {node: '>=10.0.0'} dependencies: - ajv: 8.6.3 + ajv: 8.10.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -7325,12 +10548,49 @@ packages: readable-stream: 3.6.0 dev: false + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.1.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + /terminal-link/2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.2.0 + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.2.0 + dev: false + + /terser-webpack-plugin/5.2.4_webpack@5.28.0: + resolution: {integrity: sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + jest-worker: 27.5.1 + p-limit: 3.1.0 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + source-map: 0.6.1 + terser: 5.9.0 + webpack: 5.28.0 dev: false /terser-webpack-plugin/5.2.4_webpack@5.58.2: @@ -7349,7 +10609,7 @@ packages: uglify-js: optional: true dependencies: - jest-worker: 27.3.1 + jest-worker: 27.5.1 p-limit: 3.1.0 schema-utils: 3.1.1 serialize-javascript: 6.0.0 @@ -7374,7 +10634,11 @@ packages: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.0 - minimatch: 3.0.4 + minimatch: 3.1.2 + dev: false + + /text-hex/1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} dev: false /text-table/0.2.0: @@ -7455,6 +10719,11 @@ packages: engines: {node: '>=0.6'} dev: false + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + /tough-cookie/4.0.0: resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} engines: {node: '>=6'} @@ -7480,14 +10749,54 @@ packages: hasBin: true dev: false - /ts-jest/27.0.7_ec3222e78695a6b5e6d9aa95aceec9d7: - resolution: {integrity: sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==} + /triple-beam/1.3.0: + resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} + dev: false + + /ts-jest/27.1.4_963093826ce3ff044bd0400f79dfde23: + resolution: {integrity: sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: '*' + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@types/jest': 27.4.1 + babel-jest: 26.6.3 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1_ts-node@9.1.1 + jest-util: 27.5.1 + json5: 2.2.0 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.5 + typescript: 4.4.4 + yargs-parser: 20.2.9 + dev: false + + /ts-jest/27.1.4_ec3222e78695a6b5e6d9aa95aceec9d7: + resolution: {integrity: sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' '@types/jest': ^27.0.0 babel-jest: '>=27.0.0 <28' + esbuild: '*' jest: ^27.0.0 typescript: '>=3.8 <5.0' peerDependenciesMeta: @@ -7497,13 +10806,15 @@ packages: optional: true babel-jest: optional: true + esbuild: + optional: true dependencies: '@types/jest': 26.0.24 babel-jest: 26.6.3 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 27.0.6_ts-node@10.7.0 - jest-util: 27.3.1 + jest: 27.0.6 + jest-util: 27.5.1 json5: 2.2.0 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -7512,6 +10823,20 @@ packages: yargs-parser: 20.2.9 dev: false + /ts-loader/6.2.2_typescript@4.4.4: + resolution: {integrity: sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==} + engines: {node: '>=8.6'} + peerDependencies: + typescript: '*' + dependencies: + chalk: 2.4.2 + enhanced-resolve: 4.5.0 + loader-utils: 1.4.0 + micromatch: 4.0.4 + semver: 6.3.0 + typescript: 4.4.4 + dev: false + /ts-loader/9.2.6_typescript@4.4.4: resolution: {integrity: sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==} engines: {node: '>=12.0.0'} @@ -7546,7 +10871,7 @@ packages: '@tsconfig/node14': 1.0.1 '@tsconfig/node16': 1.0.2 '@types/node': 16.11.6 - acorn: 8.5.0 + acorn: 8.7.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -7557,12 +10882,28 @@ packages: yn: 3.1.1 dev: false + /ts-node/9.1.1_typescript@4.4.4: + resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} + engines: {node: '>=10.0.0'} + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.20 + typescript: 4.4.4 + yn: 3.1.1 + dev: false + /tsconfig-paths-webpack-plugin/3.5.1: resolution: {integrity: sha512-n5CMlUUj+N5pjBhBACLq4jdr9cPTitySCjIosoQm0zwK99gmrcTGAfY9CwxRFT9+9OleNWXPRUcxsKP4AYExxQ==} dependencies: chalk: 4.1.2 enhanced-resolve: 5.8.3 - tsconfig-paths: 3.11.0 + tsconfig-paths: 3.14.1 dev: false /tsconfig-paths/3.11.0: @@ -7574,6 +10915,24 @@ packages: strip-bom: 3.0.0 dev: false + /tsconfig-paths/3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.6 + strip-bom: 3.0.0 + dev: false + + /tsconfig-paths/3.9.0: + resolution: {integrity: sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.6 + strip-bom: 3.0.0 + dev: false + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: false @@ -7636,7 +10995,7 @@ packages: engines: {node: '>= 0.6'} dependencies: media-typer: 0.3.0 - mime-types: 2.1.33 + mime-types: 2.1.35 dev: false /typedarray-to-buffer/3.1.5: @@ -7649,25 +11008,49 @@ packages: resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} dev: false - /typeorm/0.2.38_better-sqlite3@7.5.0: - resolution: {integrity: sha512-M6Y3KQcAREQcphOVJciywf4mv6+A0I/SeR+lWNjKsjnQ+a3XcMwGYMGL0Jonsx3H0Cqlf/3yYqVki1jIXSK/xg==} + /typedoc-plugin-markdown/3.12.1_typedoc@0.22.15: + resolution: {integrity: sha512-gMntJq7+JlGJZ5sVjrkzO/rG2dsmNBbWk5ZkcKvYu6QOeBwGcK5tzEyS0aqnFTJj9GCHCB+brAnTuKtAyotNwA==} + peerDependencies: + typedoc: '>=0.22.0' + dependencies: + handlebars: 4.7.7 + typedoc: 0.22.15_typescript@4.4.4 + dev: false + + /typedoc/0.22.15_typescript@4.4.4: + resolution: {integrity: sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q==} + engines: {node: '>= 12.10.0'} + hasBin: true + peerDependencies: + typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x + dependencies: + glob: 7.2.0 + lunr: 2.3.9 + marked: 4.0.14 + minimatch: 5.0.1 + shiki: 0.10.1 + typescript: 4.4.4 + dev: false + + /typeorm/0.2.45_better-sqlite3@7.5.0+pg@8.7.3: + resolution: {integrity: sha512-c0rCO8VMJ3ER7JQ73xfk0zDnVv0WDjpsP6Q1m6CVKul7DB9iVdWLRjPzc8v2eaeBuomsbZ2+gTaYr8k1gm3bYA==} hasBin: true peerDependencies: - '@sap/hana-client': '*' - better-sqlite3: '*' - hdb-pool: '*' - ioredis: '*' + '@sap/hana-client': ^2.11.14 + better-sqlite3: ^7.1.2 + hdb-pool: ^0.1.6 + ioredis: ^4.28.3 mongodb: ^3.6.0 - mssql: '*' - mysql2: '*' - oracledb: '*' - pg: '*' - pg-native: '*' - pg-query-stream: '*' - redis: '*' - sql.js: '*' - sqlite3: '*' - typeorm-aurora-data-api-driver: '*' + mssql: ^6.3.1 + mysql2: ^2.2.5 + oracledb: ^5.1.0 + pg: ^8.5.1 + pg-native: ^3.0.0 + pg-query-stream: ^4.0.0 + redis: ^3.1.1 + sql.js: ^1.4.0 + sqlite3: ^5.0.2 + typeorm-aurora-data-api-driver: ^2.0.0 peerDependenciesMeta: '@sap/hana-client': optional: true @@ -7711,17 +11094,24 @@ packages: glob: 7.2.0 js-yaml: 4.1.0 mkdirp: 1.0.4 + pg: 8.7.3 reflect-metadata: 0.1.13 sha.js: 2.4.11 tslib: 2.3.1 + uuid: 8.3.2 xml2js: 0.4.23 - yargonaut: 1.1.4 yargs: 17.2.1 zen-observable-ts: 1.1.0 transitivePeerDependencies: - supports-color dev: false + /typescript/4.2.3: + resolution: {integrity: sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: false + /typescript/4.3.5: resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} engines: {node: '>=4.2.0'} @@ -7734,12 +11124,20 @@ packages: hasBin: true dev: false + /uglify-js/3.15.4: + resolution: {integrity: sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + /unbox-primitive/1.0.1: resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} dependencies: function-bind: 1.1.1 has-bigints: 1.0.1 - has-symbols: 1.0.2 + has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 dev: false @@ -7827,6 +11225,13 @@ packages: source-map: 0.7.3 dev: false + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: false + /validator/13.7.0: resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} engines: {node: '>= 0.10'} @@ -7837,6 +11242,14 @@ packages: engines: {node: '>= 0.8'} dev: false + /vscode-oniguruma/1.6.2: + resolution: {integrity: sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==} + dev: false + + /vscode-textmate/5.2.0: + resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} + dev: false + /w3c-hr-time/1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} dependencies: @@ -7850,6 +11263,11 @@ packages: xml-name-validator: 3.0.0 dev: false + /walkdir/0.3.2: + resolution: {integrity: sha512-0Twghia4Z5wDGDYWURlhZmI47GvERMCsXIu0QZWVVZyW9ZjpbbZvD9Zy9M6cWiQQRRbAcYajIyKNavaZZDt1Uw==} + engines: {node: '>=6.0.0'} + dev: false + /walker/1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -7861,7 +11279,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 dev: false /wcwidth/1.0.1: @@ -7884,16 +11302,67 @@ packages: engines: {node: '>=10.4'} dev: false + /webpack-node-externals/2.5.2: + resolution: {integrity: sha512-aHdl/y2N7PW2Sx7K+r3AxpJO+aDMcYzMQd60Qxefq3+EwhewSbTBqNumOsCE1JsCUNoyfGj5465N0sSf6hc/5w==} + dev: false + /webpack-node-externals/3.0.0: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} engines: {node: '>=6'} dev: false + /webpack-sources/2.3.1: + resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} + engines: {node: '>=10.13.0'} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + dev: false + /webpack-sources/3.2.1: resolution: {integrity: sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==} engines: {node: '>=10.13.0'} dev: false + /webpack/5.28.0: + resolution: {integrity: sha512-1xllYVmA4dIvRjHzwELgW4KjIU1fW4PEuEnjsylz7k7H5HgPOctIq7W1jrt3sKH9yG5d72//XWzsHhfoWvsQVg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.1 + '@types/estree': 0.0.46 + '@webassemblyjs/ast': 1.11.0 + '@webassemblyjs/wasm-edit': 1.11.0 + '@webassemblyjs/wasm-parser': 1.11.0 + acorn: 8.7.0 + browserslist: 4.17.6 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.8.3 + es-module-lexer: 0.4.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.10 + json-parse-better-errors: 1.0.2 + loader-runner: 4.2.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.1.1 + tapable: 2.2.1 + terser-webpack-plugin: 5.2.4_webpack@5.28.0 + watchpack: 2.2.0 + webpack-sources: 2.3.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: false + /webpack/5.58.2: resolution: {integrity: sha512-3S6e9Vo1W2ijk4F4PPWRIu6D/uGgqaPmqw+av3W3jLDujuNkdxX5h5c+RQ6GkjVR+WwIPOfgY8av+j5j4tMqJw==} engines: {node: '>=10.13.0'} @@ -7909,8 +11378,8 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.5.0 - acorn-import-assertions: 1.8.0_acorn@8.5.0 + acorn: 8.7.0 + acorn-import-assertions: 1.8.0_acorn@8.7.0 browserslist: 4.17.6 chrome-trace-event: 1.0.3 enhanced-resolve: 5.8.3 @@ -7918,10 +11387,10 @@ packages: eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 - graceful-fs: 4.2.8 + graceful-fs: 4.2.10 json-parse-better-errors: 1.0.2 loader-runner: 4.2.0 - mime-types: 2.1.33 + mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 @@ -7991,6 +11460,12 @@ packages: string-width: 4.2.3 dev: false + /window-size/0.1.4: + resolution: {integrity: sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=} + engines: {node: '>= 0.10.0'} + hasBin: true + dev: false + /windows-release/4.0.0: resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} engines: {node: '>=10'} @@ -7998,11 +11473,61 @@ packages: execa: 4.1.0 dev: false + /winston-daily-rotate-file/4.6.1_winston@3.7.2: + resolution: {integrity: sha512-Ycch4LZmTycbhgiI2eQXBKI1pKcEQgAqmBjyq7/dC6Dk77nasdxvhLKraqTdCw7wNDSs8/M0jXaLATHquG7xYg==} + engines: {node: '>=8'} + peerDependencies: + winston: ^3 + dependencies: + file-stream-rotator: 0.6.1 + object-hash: 2.2.0 + triple-beam: 1.3.0 + winston: 3.7.2 + winston-transport: 4.5.0 + dev: false + + /winston-transport/4.5.0: + resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} + engines: {node: '>= 6.4.0'} + dependencies: + logform: 2.4.0 + readable-stream: 3.6.0 + triple-beam: 1.3.0 + dev: false + + /winston/3.7.2: + resolution: {integrity: sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==} + engines: {node: '>= 12.0.0'} + dependencies: + '@dabh/diagnostics': 2.0.3 + async: 3.2.3 + is-stream: 2.0.1 + logform: 2.4.0 + one-time: 1.0.0 + readable-stream: 3.6.0 + safe-stable-stringify: 2.3.1 + stack-trace: 0.0.10 + triple-beam: 1.3.0 + winston-transport: 4.5.0 + dev: false + /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: false + /wordwrap/1.0.0: + resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} + dev: false + + /wrap-ansi/2.1.0: + resolution: {integrity: sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: false + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -8064,11 +11589,19 @@ packages: engines: {node: '>=0.4'} dev: false + /y18n/3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: false + /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: false + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false @@ -8078,14 +11611,6 @@ packages: engines: {node: '>= 6'} dev: false - /yargonaut/1.1.4: - resolution: {integrity: sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==} - dependencies: - chalk: 1.1.3 - figlet: 1.5.2 - parent-require: 1.0.0 - dev: false - /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -8117,6 +11642,18 @@ packages: yargs-parser: 20.2.9 dev: false + /yargs/3.32.0: + resolution: {integrity: sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=} + dependencies: + camelcase: 2.1.1 + cliui: 3.2.0 + decamelize: 1.2.0 + os-locale: 1.4.0 + string-width: 1.0.2 + window-size: 0.1.4 + y18n: 3.2.2 + dev: false + /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -8138,9 +11675,8 @@ packages: resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} dev: false - file:projects/ssi-did.tgz_ts-node@10.7.0: + file:projects/ssi-did.tgz: resolution: {integrity: sha512-cFwrpzL7cFv+tOyUnQcr4SpV4mkGP30mAsiLqN6/va6QSYGdj9mm4o31Hivmdv7azS0JC6Ofms/kpjO+nyS3qg==, tarball: file:projects/ssi-did.tgz} - id: file:projects/ssi-did.tgz name: '@rush-temp/ssi-did' version: 0.0.0 dependencies: @@ -8153,27 +11689,136 @@ packages: eslint: 7.32.0 ethers: 5.5.1 ethr-did-resolver: 5.0.2 - jest: 27.0.6_ts-node@10.7.0 + jest: 27.0.6 rimraf: 3.0.2 - ts-jest: 27.0.7_ec3222e78695a6b5e6d9aa95aceec9d7 + ts-jest: 27.1.4_ec3222e78695a6b5e6d9aa95aceec9d7 typescript: 4.4.4 transitivePeerDependencies: - '@babel/core' - bufferutil - canvas + - esbuild - node-notifier - supports-color - ts-node - utf-8-validate dev: false - file:projects/ssi-vc-api.tgz_babel-jest@26.6.3: - resolution: {integrity: sha512-85bs55d6nZh3c22e+UuUHOKgBVBWGYGnTSVcATm48nCUAkGsryEqoW81HcW4FO4kO3ARbcbmIdwMXqXHNjnVkw==, tarball: file:projects/ssi-vc-api.tgz} + file:projects/ssi-dwn.tgz_3531d2b0a9f1221b1fd25b1e07e67c0c: + resolution: {integrity: sha512-pe9fdQZuwQHSNgbee7hWnFUyWr/LuYJ+HQF9etFGN/Qe4LncCv9UkZHqAftOMwPotysok02eAiosTCwJGJyhSQ==, tarball: file:projects/ssi-dwn.tgz} + id: file:projects/ssi-dwn.tgz + name: '@rush-temp/ssi-dwn' + version: 0.0.0 + dependencies: + '@energyweb/eslint-config': 0.0.2_d41a4af51b1c03c3d063f54fbed72fd6 + '@energyweb/prettier-config': 0.0.1_prettier@2.6.2 + '@ew-did-registry/credentials-interface': 0.6.3-alpha.544.0 + '@nestjs/axios': 0.0.7_b3e6921aee41404e2866237bfdfd83a3 + '@nestjs/cli': 7.6.0 + '@nestjs/common': 8.1.2_f8b67fbbfa59b70aa4035a6089ad771a + '@nestjs/config': 1.1.0_b3e6921aee41404e2866237bfdfd83a3 + '@nestjs/core': 8.1.2_3d1cfdac3af6acf6d20b789f19aaf219 + '@nestjs/jwt': 8.0.0_@nestjs+common@8.1.2 + '@nestjs/passport': 8.2.1_5bcb9755554a4dae2a94452779a7c82c + '@nestjs/platform-express': 8.1.2_bbf59b1cbf49bba2b2f47e404ee3cb27 + '@nestjs/schematics': 7.3.1_typescript@4.4.4 + '@nestjs/swagger': 5.1.5_a79683707c1b2de548b1d4db132385ae + '@nestjs/terminus': 8.0.6_90a4bb632c4b27addd0e86dd197fa862 + '@nestjs/testing': 8.1.2_830699a7a1bc4b367722dd63c0377123 + '@nestjs/typeorm': 8.0.2_15ce50d73117bf24d38d098c9f955110 + '@sentry/integrations': 6.19.6 + '@sentry/node': 6.19.6 + '@sentry/tracing': 6.19.6 + '@sentry/types': 6.19.6 + '@sphereon/pex': 1.0.2 + '@types/compression': 1.7.2 + '@types/cookie-parser': 1.4.2 + '@types/express': 4.17.13 + '@types/jest': 27.4.1 + '@types/jsonwebtoken': 8.5.8 + '@types/node': 13.13.52 + '@types/passport': 1.0.7 + '@types/passport-jwt': 3.0.6 + '@types/supertest': 2.0.11 + '@types/uuid': 8.3.4 + '@typescript-eslint/eslint-plugin': 5.20.0_3edef4978842152df7a6e247a241934b + '@typescript-eslint/parser': 5.20.0_eslint@8.14.0+typescript@4.4.4 + base64url: 3.0.1 + class-transformer: 0.5.1 + class-validator: 0.13.1 + compression: 1.7.4 + cookie-parser: 1.4.6 + dotenv: 10.0.0 + eslint: 8.14.0 + eslint-config-prettier: 8.3.0_eslint@8.14.0 + eslint-plugin-import: 2.26.0_eslint@8.14.0 + ethers: 5.6.4 + express: 4.18.0 + helmet: 4.6.0 + jest: 27.5.1_ts-node@9.1.1 + jsonwebtoken: 8.5.1 + multiformats: 9.6.4 + npm-run-all: 4.1.5 + passport: 0.5.2 + passport-jwt: 4.0.0 + pg: 8.7.3 + prettier: 2.6.2 + redact-pii: 3.2.3 + reflect-metadata: 0.1.13 + rimraf: 3.0.2 + rxjs: 7.4.0 + supertest: 4.0.2 + swagger-ui-express: 4.1.6_express@4.18.0 + ts-jest: 27.1.4_963093826ce3ff044bd0400f79dfde23 + ts-loader: 6.2.2_typescript@4.4.4 + ts-node: 9.1.1_typescript@4.4.4 + typedoc: 0.22.15_typescript@4.4.4 + typedoc-plugin-markdown: 3.12.1_typedoc@0.22.15 + typeorm: 0.2.45_better-sqlite3@7.5.0+pg@8.7.3 + typescript: 4.4.4 + uuid: 8.3.2 + winston: 3.7.2 + winston-daily-rotate-file: 4.6.1_winston@3.7.2 + transitivePeerDependencies: + - '@babel/core' + - '@nestjs/microservices' + - '@nestjs/websockets' + - '@sap/hana-client' + - '@swc/core' + - babel-jest + - better-sqlite3 + - bufferutil + - cache-manager + - canvas + - debug + - encoding + - esbuild + - fastify-swagger + - hdb-pool + - ioredis + - mongodb + - mssql + - mysql2 + - node-notifier + - oracledb + - pg-native + - pg-query-stream + - redis + - sql.js + - sqlite3 + - supports-color + - typeorm-aurora-data-api-driver + - uglify-js + - utf-8-validate + - webpack-cli + dev: false + + file:projects/ssi-vc-api.tgz_d5cea2b3b7dbbc9c57a422dfbe2b3170: + resolution: {integrity: sha512-85IdT1J2sEa65TCORU9V9g2jz6dEopawh80ZJ+xMa3Us4C6ksk6n7NhcoYS6gqPnKVYplMwzXYgokXXAMI+ORg==, tarball: file:projects/ssi-vc-api.tgz} id: file:projects/ssi-vc-api.tgz name: '@rush-temp/ssi-vc-api' version: 0.0.0 dependencies: - '@ew-did-registry/did': 0.6.0 '@nestjs/axios': 0.0.7_b3e6921aee41404e2866237bfdfd83a3 '@nestjs/cli': 8.1.4_eslint@7.32.0 '@nestjs/common': 8.1.2_43f93dd897e68fe834a23ddd32fb54cc @@ -8183,9 +11828,8 @@ packages: '@nestjs/schematics': 8.0.4_typescript@4.4.4 '@nestjs/swagger': 5.1.5_ea14560b646b9e6de5a63f20f1277708 '@nestjs/testing': 8.1.2_830699a7a1bc4b367722dd63c0377123 - '@nestjs/typeorm': 8.0.2_12346420c5d0822584d78b786936ea28 + '@nestjs/typeorm': 8.0.2_15ce50d73117bf24d38d098c9f955110 '@sphereon/pex': 1.0.2 - '@spruceid/didkit-wasm': 0.1.9 '@spruceid/didkit-wasm-node': 0.1.6 '@types/express': 4.17.13 '@types/jest': 26.0.24 @@ -8193,28 +11837,27 @@ packages: '@types/supertest': 2.0.11 '@typescript-eslint/eslint-plugin': 4.33.0_cc617358c89d3f38c52462f6d809db4c '@typescript-eslint/parser': 4.33.0_eslint@7.32.0+typescript@4.4.4 - axios: 0.26.0 better-sqlite3: 7.5.0 class-transformer: 0.4.0 class-validator: 0.13.1 did-resolver: 3.1.3 eslint: 7.32.0 eslint-config-prettier: 8.3.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_6e975bd57c7acf028c1a9ddbbf60c898 + eslint-plugin-prettier: 3.4.1_625706418ef443f92ded258e2cca0de0 jest: 27.0.6_ts-node@10.7.0 jose: 4.1.5 nock: 13.2.4 - prettier: 2.4.1 + prettier: 2.6.2 reflect-metadata: 0.1.13 rimraf: 3.0.2 rxjs: 7.4.0 supertest: 6.1.6 - swagger-ui-express: 4.1.6 - ts-jest: 27.0.7_ec3222e78695a6b5e6d9aa95aceec9d7 + swagger-ui-express: 4.1.6_express@4.18.0 + ts-jest: 27.1.4_ec3222e78695a6b5e6d9aa95aceec9d7 ts-loader: 9.2.6_typescript@4.4.4 ts-node: 10.7.0_0cb88d80cb04d25b21fa3ec194608c65 - tsconfig-paths: 3.11.0 - typeorm: 0.2.38_better-sqlite3@7.5.0 + tsconfig-paths: 3.14.1 + typeorm: 0.2.45_better-sqlite3@7.5.0+pg@8.7.3 typescript: 4.4.4 uuid: 8.3.2 transitivePeerDependencies: @@ -8229,6 +11872,7 @@ packages: - cache-manager - canvas - debug + - encoding - esbuild - express - fastify-swagger diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 00000000..93aa8ab1 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,17 @@ +version: '3.4' + +services: + postgres: + container_name: ssi-dwn-db + image: postgres:12-alpine + environment: + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_USERNAME: ${DB_USERNAME} + POSTGRES_DB: ${DB_NAME} + POSTGRES_PORT: ${DB_PORT} + networks: + - main + ports: + - 5432:5432 +networks: + main: diff --git a/docker/dwn/Dockerfile b/docker/dwn/Dockerfile new file mode 100644 index 00000000..6e37055c --- /dev/null +++ b/docker/dwn/Dockerfile @@ -0,0 +1,19 @@ +FROM node:16.10.0-alpine as base + +# Install the required packages +RUN apk add --no-cache curl \ + && curl -sL https://unpkg.com/@pnpm/self-installer | node +RUN npm install -g @microsoft/rush + +COPY . . +RUN rush install && pnpm add -g pnpm && rush build + +FROM node:16.10.0-alpine + +COPY --from=base . . + +EXPOSE 3000 + +WORKDIR /apps/decentralized-web-node + +CMD [ "pnpm", "run", "start:prod" ] diff --git a/docker/dwn/Dockerfile.dev b/docker/dwn/Dockerfile.dev new file mode 100644 index 00000000..79bb3ea7 --- /dev/null +++ b/docker/dwn/Dockerfile.dev @@ -0,0 +1,20 @@ +FROM node:16.10.0-alpine as base + +# Install the required packages +RUN apk add --no-cache curl \ + && curl -sL https://unpkg.com/@pnpm/self-installer | node +RUN npm install -g @microsoft/rush + +COPY . . + +RUN rush install && pnpm add -g pnpm && rush rebuild + +FROM node:16.10.0-alpine + +COPY --from=base . . + +EXPOSE 3000 + +WORKDIR /apps/decentralized-web-node + +RUN pnpm rebuild diff --git a/Dockerfile b/docker/vc-api/Dockerfile similarity index 84% rename from Dockerfile rename to docker/vc-api/Dockerfile index e4e8ff8a..40e79af7 100644 --- a/Dockerfile +++ b/docker/vc-api/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14-alpine as base +FROM node:16.10.0-alpine as base # Install the required packages RUN apk add --no-cache curl \ @@ -8,7 +8,7 @@ RUN npm install -g @microsoft/rush COPY . . RUN rush install && pnpm add -g pnpm && rush build -FROM node:14-alpine +FROM node:16.10.0-alpine COPY --from=base . . diff --git a/rush.json b/rush.json index 3e819c90..6bb73e88 100644 --- a/rush.json +++ b/rush.json @@ -454,6 +454,10 @@ { "packageName": "@energyweb/ssi-vc-api", "projectFolder": "apps/vc-api" + }, + { + "packageName": "@energyweb/ssi-dwn", + "projectFolder": "apps/decentralized-web-node" } ] }