diff --git a/apps/connection-manager/package.json b/apps/connection-manager/package.json index 4eacd371fba4edd43d202d09e1d05dcfe9f1f195..965cec91879e23df15c50a1be1406b8abc16d039 100644 --- a/apps/connection-manager/package.json +++ b/apps/connection-manager/package.json @@ -1,8 +1,10 @@ { "name": "@ocm/connection-manager", - "version": "0.0.1", - "description": "", - "author": "Sagar", + "version": "1.0.0", + "description": "Connection Manager for OCM", + "contributors": [ + "Konstantin Tsabolov <konstantin.tsabolov@spherity.com>" + ], "private": true, "license": "Apache-2.0", "type": "module", @@ -11,67 +13,40 @@ "prebuild": "pnpm clean", "build": "nest build", "prebuild:production": "pnpm clean", - "build:production": "pnpm prisma:generate && nest build -p tsconfig.production.json", - "prisma:dbpush": "prisma db push --schema=./src/prisma/schema.prisma", - "prisma:generate": "prisma generate --schema=./src/prisma/schema.prisma", - "prisma:migrate": "prisma migrate deploy --schema=./src/prisma/schema.prisma", - "prisma:studio": "prisma studio", - "start": "nest start", - "start:dev": "nest start --watch --preserveWatchOutput", - "test": "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.config.js" + "build:production": "nest build -p tsconfig.production.json", + "start": "nest start --watch --preserveWatchOutput", + "test": "jest" }, "dependencies": { - "@elastic/ecs-winston-format": "^1.5.0", - "@nestjs/axios": "^3.0.1", - "@nestjs/common": "^10.2.8", + "@nestjs/common": "^10.3.0", "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.2.8", - "@nestjs/mapped-types": "^2.0.4", - "@nestjs/microservices": "^10.2.8", - "@nestjs/platform-express": "^10.2.8", + "@nestjs/core": "^10.3.0", + "@nestjs/microservices": "^10.3.0", + "@nestjs/platform-express": "^10.3.0", "@nestjs/schedule": "^4.0.0", - "@nestjs/swagger": "^7.1.16", - "@nestjs/terminus": "^10.1.1", - "@prisma/client": "^5.6.0", + "@nestjs/swagger": "^7.1.17", + "@ocm/shared": "workspace:*", + "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "express": "^4.17.3", "joi": "^17.11.0", - "jsonwebtoken": "^9.0.2", - "jwks-rsa": "^3.1.0", - "moment": "^2.29.4", "nats": "^2.18.0", "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1", - "winston": "^3.11.0", - "winston-elasticsearch": "^0.17.4" + "rxjs": "^7.8.1" }, "devDependencies": { "@jest/globals": "^29.7.0", "@nestjs/cli": "^10.2.1", "@nestjs/schematics": "^10.0.3", - "@nestjs/testing": "^10.2.8", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.96", + "@nestjs/testing": "^10.3.0", + "@swc/cli": "^0.1.63", + "@swc/core": "^1.3.101", "@swc/jest": "^0.2.29", "@types/express": "^4.17.21", - "@types/jest": "27.0.2", - "@types/jsonwebtoken": "^9.0.5", - "@types/node": "^20.9.0", - "@types/simple-oauth2": "^5.0.7", - "@types/supertest": "^2.0.16", - "dotenv-cli": "^7.3.0", + "@types/jest": "29.5.11", + "@types/node": "^20.10.5", "jest": "^29.7.0", - "node-mocks-http": "^1.13.0", - "prisma": "^5.6.0", "rimraf": "^5.0.5", - "source-map-support": "^0.5.21", - "supertest": "^6.3.3", - "swagger-ui-express": "^5.0.0", - "ts-node": "^10.9.1", - "typescript": "^5.2.2" + "typescript": "^5.3.3" } } diff --git a/apps/connection-manager/src/__tests__/application.spec.ts b/apps/connection-manager/src/__tests__/application.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..3d41dce1e760da441b25979b18115a00468edf28 --- /dev/null +++ b/apps/connection-manager/src/__tests__/application.spec.ts @@ -0,0 +1,26 @@ +import type { INestApplication } from '@nestjs/common'; + +import { Test } from '@nestjs/testing'; + +import { Application } from '../application.js'; + +describe('Application', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleRef = await Test.createTestingModule({ + imports: [Application], + }).compile(); + + app = moduleRef.createNestApplication(); + await app.init(); + }); + + afterEach(async () => { + await app.close(); + }); + + it('should be defined', () => { + expect(app).toBeDefined(); + }); +}); diff --git a/apps/connection-manager/src/app.module.spec.ts b/apps/connection-manager/src/app.module.spec.ts deleted file mode 100644 index e5e685cb147cd6c916d4e4e80feb77c92880f436..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/app.module.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { INestApplication } from '@nestjs/common'; -import type { TestingModule } from '@nestjs/testing'; - -import { Test } from '@nestjs/testing'; - -import AppModule from './app.module.js'; - -describe('App Module', () => { - let app: INestApplication; - - beforeAll(async () => { - const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], - }).compile(); - - app = moduleFixture.createNestApplication(); - await app.init(); - }); - - it('should work', () => { - expect(true).toBe(true); - }); - - afterAll(async () => { - await app.close(); - }); -}); diff --git a/apps/connection-manager/src/app.module.ts b/apps/connection-manager/src/app.module.ts deleted file mode 100644 index 97bc1329d080b2d6ceb2a7fa7c629fdb078a2f27..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/app.module.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { MiddlewareConsumer, NestModule } from '@nestjs/common'; - -import { Module, RequestMethod } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; -import { APP_FILTER } from '@nestjs/core'; -import { ScheduleModule } from '@nestjs/schedule'; -import { TerminusModule } from '@nestjs/terminus'; - -import ExceptionHandler from './common/exception.handler.js'; -import config from './config/config.js'; -import validationSchema from './config/validation.js'; -import ConnectionsModule from './connections/module.js'; -import SchedulerService from './connections/scheduler/scheduler.service.js'; -import HealthController from './health/health.controller.js'; -import { AuthMiddleware } from './middleware/auth.middleware.js'; -import PrismaModule from './prisma/prisma.module.js'; - -@Module({ - imports: [ - ScheduleModule.forRoot(), - TerminusModule, - ConfigModule.forRoot({ - isGlobal: true, - load: [config], - validationSchema, - }), - PrismaModule, - ConnectionsModule, - ], - controllers: [HealthController], - providers: [ - { - provide: APP_FILTER, - useClass: ExceptionHandler, - }, - SchedulerService, - ], -}) -export default class AppModule implements NestModule { - // eslint-disable-next-line class-methods-use-this - public configure(consumer: MiddlewareConsumer) { - // eslint-disable-line - consumer - .apply(AuthMiddleware) - .exclude({ - path: 'v1/health', - method: RequestMethod.GET, - }) - .forRoutes('*'); - } -} diff --git a/apps/connection-manager/src/application.ts b/apps/connection-manager/src/application.ts new file mode 100644 index 0000000000000000000000000000000000000000..575ee560eaa36da9d160ea0c6223546714e8131f --- /dev/null +++ b/apps/connection-manager/src/application.ts @@ -0,0 +1,72 @@ +import type { ConfigType } from '@nestjs/config'; + +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { RouterModule } from '@nestjs/core'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { HealthModule } from '@ocm/shared'; + +import { NATS_CLIENT } from './common/constants.js'; +import { httpConfig } from './config/http.config.js'; +import { natsConfig } from './config/nats.config.js'; +import { ssiConfig } from './config/ssi.config.js'; +import { validationSchema } from './config/validation.js'; +import { ConnectionsModule } from './connections/connections.module.js'; +import { InvitationsModule } from './invitations/invitations.module.js'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + load: [httpConfig, natsConfig, ssiConfig], + cache: true, + expandVariables: true, + validationSchema, + validationOptions: { + allowUnknown: true, + abortEarly: true, + }, + }), + + ClientsModule.registerAsync({ + isGlobal: true, + clients: [ + { + name: NATS_CLIENT, + inject: [natsConfig.KEY], + useFactory: (config: ConfigType<typeof natsConfig>) => ({ + transport: Transport.NATS, + options: { + url: config.url as string, + }, + }), + }, + ], + }), + + HealthModule.registerAsync({ + inject: [natsConfig.KEY], + useFactory: (config: ConfigType<typeof natsConfig>) => { + const options: Parameters<typeof HealthModule.register>[0] = {}; + + if (config.monitoringUrl) { + options.nats = { + monitoringUrl: config.monitoringUrl as string, + }; + } + + return options; + }, + }), + + ConnectionsModule, + InvitationsModule, + + RouterModule.register([ + { module: HealthModule, path: '/health' }, + { module: ConnectionsModule, path: '/connections' }, + { module: InvitationsModule, path: '/invitations' }, + ]), + ], +}) +export class Application {} diff --git a/apps/connection-manager/src/client/config.client.ts b/apps/connection-manager/src/client/config.client.ts deleted file mode 100644 index b40504f420aa189ec679b52bea15a084ce635cac..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/client/config.client.ts +++ /dev/null @@ -1,20 +0,0 @@ -export default class ConfigClient { - /** - * - * If there is no Limit to check expire till date return false - * @returns Number to calculate end date - */ - public static checkExpireTill(): Date | false { - const days = 2; - const tillDate = new Date(); - tillDate.setDate(tillDate.getDate() - days); - return tillDate; - } - - public static getConnectionExpire(): Date | false { - const min = 30; - const connectionExpire = min * 60 * 1000; - const compareDateTime = new Date(new Date().getTime() - connectionExpire); - return compareDateTime; - } -} diff --git a/apps/connection-manager/src/client/nats.client.ts b/apps/connection-manager/src/client/nats.client.ts deleted file mode 100644 index a982dae39f8157d70101e771230221dbce3922ab..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/client/nats.client.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type ResponseType from '../common/response.js'; -import type ConnectionSubscriptionEndpointDto from '../connections/entities/connectionSubscribeEndPoint.entity.js'; - -import { Inject, Injectable } from '@nestjs/common'; -import { ClientProxy } from '@nestjs/microservices'; -import { lastValueFrom } from 'rxjs'; - -import { - Attestation, - NATSServices, - Principal, - ProofManager, -} from '../common/constants.js'; -import logger from '../utils/logger.js'; - -@Injectable() -export default class NatsClientService { - public constructor( - @Inject(NATSServices.SERVICE_NAME) private client: ClientProxy, - ) {} - - public sendConnectionStatusPrincipalManager( - status: string, - connectionId: string, - theirLabel: string, - participantDID: string, - theirDid: string, - ) { - const pattern = { - endpoint: `${Principal.NATS_ENDPOINT}/${Principal.CONNECTION_COMPLETE_STATUS}`, - }; - const payload = { - status, - connectionId, - theirLabel, - participantDID, - theirDid, - }; - logger.info(`before nats call to principal manager ${payload}`); - return lastValueFrom(this.client.send<ResponseType>(pattern, payload)); - } - - public getIssueCredentials(connectionId: string) { - const pattern = { - endpoint: `${Attestation.NATS_ENDPOINT}/${Attestation.GET_ISSUE_CREDENTIALS}`, - }; - const payload = { - connectionId, - }; - return lastValueFrom(this.client.send<ResponseType>(pattern, payload)); - } - - public sendMembershipProofRequestToProofManager(connectionId: string) { - const pattern = { - endpoint: `${ProofManager.NATS_ENDPOINT}/${ProofManager.SEND_MEMBERSHIP_PROOF_REQUEST}`, - }; - const payload = { - connectionId, - }; - return lastValueFrom(this.client.send<ResponseType>(pattern, payload)); - } - - public getPresentProofs(connectionId: string) { - const pattern = { - endpoint: `${ProofManager.NATS_ENDPOINT}/${ProofManager.GET_PRESENT_PROOFS}`, - }; - const payload = { - connectionId, - }; - return lastValueFrom(this.client.send<ResponseType>(pattern, payload)); - } - - public publishConnection(data: ConnectionSubscriptionEndpointDto) { - this.client.emit( - `${NATSServices.SERVICE_NAME}/${NATSServices.CONNECTION_SUBSCRIBER_ENDPOINT}`, - data, - ); - } -} diff --git a/apps/connection-manager/src/client/rest.client.ts b/apps/connection-manager/src/client/rest.client.ts deleted file mode 100644 index 14c1329fcf0b3475a79cbc591f761e9cdc18c4a8..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/client/rest.client.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { HttpService } from '@nestjs/axios'; -import { Injectable } from '@nestjs/common'; -import { lastValueFrom, map } from 'rxjs'; - -@Injectable() -export default class RestClientService { - public constructor(private readonly httpService: HttpService) {} - - public async post(url: string, payload: object) { - return lastValueFrom( - this.httpService - .post(url, payload) - .pipe(map((response) => response.data)), - ); - } -} diff --git a/apps/connection-manager/src/common/constants.ts b/apps/connection-manager/src/common/constants.ts index c1a9f7672786af93ba19f85cf5950b126e41885a..5122ca13e8e5fc22c79213575a8bdfa4fe670f5c 100644 --- a/apps/connection-manager/src/common/constants.ts +++ b/apps/connection-manager/src/common/constants.ts @@ -1,32 +1,2 @@ -export enum NATSServices { - SERVICE_NAME = 'CONNECTION_MANAGER_SERVICE', - CONNECTION_SUBSCRIBER_ENDPOINT = 'ConnectionSubscriberEndpoint', -} - -export enum LoggerConfig { - FILE_PATH = 'logs/log.json', - LOG_DIR = './logs', -} - -export enum Abstraction { - NATS_ENDPOINT = 'SSI_ABSTRACTION_SERVICE', - CONNECTION_STATE_CHANGED = 'ConnectionStateChanged', -} - -export enum Principal { - NATS_ENDPOINT = 'PRINCIPAL_MANAGER_SERVICE', - CONNECTION_COMPLETE_STATUS = 'connectionCompleteStatus', -} - -export enum Attestation { - NATS_ENDPOINT = 'ATTESTATION_MANAGER_SERVICE', - GET_ISSUE_CREDENTIALS = 'getIssueCredentials', -} - -export enum ProofManager { - NATS_ENDPOINT = 'PROOF_MANAGER_SERVICE', - GET_PRESENT_PROOFS = 'getPresentProofs', - SEND_MEMBERSHIP_PROOF_REQUEST = 'sendMembershipProofRequest', -} - -export const RECEIVED_CONNECTION_ALIAS = 'connection-received'; +export const SERVICE_NAME = 'SCHEMA_MANAGER_SERVICE'; +export const NATS_CLIENT = Symbol('NATS_CLIENT'); diff --git a/apps/connection-manager/src/common/date.utils.ts b/apps/connection-manager/src/common/date.utils.ts deleted file mode 100644 index a6d0cac913ae0a54764db2914951e2432ad6a6ed..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/common/date.utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -import moment from 'moment'; - -const getDate = () => moment().format('MM-DD-YYYY, h:mm:ss a'); - -export default getDate; diff --git a/apps/connection-manager/src/common/exception.handler.ts b/apps/connection-manager/src/common/exception.handler.ts deleted file mode 100644 index aab81f9f9089a2285c5195b16d2686fcdbe9b941..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/common/exception.handler.ts +++ /dev/null @@ -1,42 +0,0 @@ -import type ResponseType from './response.js'; -import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common'; - -import { Catch, HttpException, HttpStatus } from '@nestjs/common'; -import { HttpAdapterHost } from '@nestjs/core'; - -@Catch() -export default class ExceptionHandler implements ExceptionFilter { - public constructor(private readonly httpAdapterHost: HttpAdapterHost) {} - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public catch(exception: any, host: ArgumentsHost): void { - // In certain situations `httpAdapter` might not be available in the - // constructor method, thus we should resolve it here. - const { httpAdapter } = this.httpAdapterHost; - - const ctx = host.switchToHttp(); - const response = ctx.getResponse(); - - let statusCode = HttpStatus.INTERNAL_SERVER_ERROR; - let message = - exception.message.error || exception.message || 'Something went wrong!'; - - if (exception instanceof HttpException) { - const errorResponse: string | object = exception.getResponse(); - - statusCode = exception.getStatus(); - message = - (typeof errorResponse === 'object' && - Reflect.get(errorResponse, 'error')) || - message; - } - - const responseBody: ResponseType = { - statusCode, - message, - error: exception.message, - }; - - httpAdapter.reply(response, responseBody, statusCode); - } -} diff --git a/apps/connection-manager/src/common/response.ts b/apps/connection-manager/src/common/response.ts deleted file mode 100644 index 45f4ccb12e3724334b69a3bd7dbbc08f175d0f7f..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/common/response.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default interface ResponseType { - statusCode: number; - message: string; - data?: unknown; - error?: unknown; -} diff --git a/apps/connection-manager/src/config/config.ts b/apps/connection-manager/src/config/config.ts deleted file mode 100644 index b13ab0b2e4084522ef4a4b79eb8b381578af18da..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/config/config.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { fileURLToPath } from 'node:url'; - -const parentDirectory = fileURLToPath(new URL('..', import.meta.url)); - -const config = () => ({ - PORT: Number(process.env.PORT), - APP_URL: process.env.CONNECTION_MANAGER_URL, - auth: { - useAuth: process.env.USE_AUTH || 'false', - clientId: process.env.OAUTH_CLIENT_ID, - clientSecret: process.env.OAUTH_CLIENT_SECRET, - tokenUrl: process.env.OAUTH_TOKEN_URL, - }, - nats: { - url: process.env.NATS_URL, - }, - database: { - type: 'postgres', - host: process.env.DB_HOST, - username: process.env.DB_USERNAME, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - port: 5432, - synchronize: false, - logging: false, - entities: [`${parentDirectory}/../**/**.model{.ts,.js}`], - DATABASE_URL: process.env.DATABASE_URL, - }, - agent: { - agentUrl: process.env.AGENT_URL, - }, - ECSURL: process.env.ECSURL, -}); -export default config; diff --git a/apps/connection-manager/src/config/http.config.ts b/apps/connection-manager/src/config/http.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..906f6c8d0652bdc74d737b6adef02b4d8f333c1b --- /dev/null +++ b/apps/connection-manager/src/config/http.config.ts @@ -0,0 +1,6 @@ +import { registerAs } from '@nestjs/config'; + +export const httpConfig = registerAs('http', () => ({ + host: process.env.HTTP_HOST, + port: Number(process.env.HTTP_PORT), +})); diff --git a/apps/connection-manager/src/config/nats.config.ts b/apps/connection-manager/src/config/nats.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..023e92372adf6be27904aeccd041d125fbb804b9 --- /dev/null +++ b/apps/connection-manager/src/config/nats.config.ts @@ -0,0 +1,6 @@ +import { registerAs } from '@nestjs/config'; + +export const natsConfig = registerAs('nats', () => ({ + url: process.env.NATS_URL, + monitoringUrl: process.env.NATS_MONITORING_URL, +})); diff --git a/apps/connection-manager/src/config/ssi.config.ts b/apps/connection-manager/src/config/ssi.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..1779919f156e28d94440919221b2c95acda26a10 --- /dev/null +++ b/apps/connection-manager/src/config/ssi.config.ts @@ -0,0 +1,5 @@ +import { registerAs } from '@nestjs/config'; + +export const ssiConfig = registerAs('ssi', () => ({ + agentUrl: process.env.SSI_AGENT_URL, +})); diff --git a/apps/connection-manager/src/config/validation.ts b/apps/connection-manager/src/config/validation.ts index 5973fca87254b56b49de3e021efd39369c8489eb..a7fe2f83c768b702b76f629b790507af6344ff7c 100644 --- a/apps/connection-manager/src/config/validation.ts +++ b/apps/connection-manager/src/config/validation.ts @@ -1,15 +1,11 @@ import Joi from 'joi'; -const validationSchema = Joi.object({ - DATABASE_URL: Joi.string().required(), - NATS_URL: Joi.string().required(), - PORT: Joi.number().required(), - CONNECTION_MANAGER_URL: Joi.string().required(), - USE_AUTH: Joi.string(), - AGENT_URL: Joi.string().required(), - OAUTH_CLIENT_ID: Joi.string(), - OAUTH_CLIENT_SECRET: Joi.string(), - OAUTH_TOKEN_URL: Joi.string(), -}); +export const validationSchema = Joi.object({ + HTTP_HOST: Joi.string().default('0.0.0.0'), + HTTP_PORT: Joi.number().default(3000), + + NATS_URL: Joi.string().uri().default('nats://localhost:4222'), + NATS_MONITORING_URL: Joi.string().uri().default('http://localhost:8222'), -export default validationSchema; + SSI_AGENT_URL: Joi.string().default('http://localhost:3010'), +}); diff --git a/apps/connection-manager/src/connections/__tests__/connections.controller.spec.ts b/apps/connection-manager/src/connections/__tests__/connections.controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..3c6041552644b74f21793a12bf08e742da2f17f7 --- /dev/null +++ b/apps/connection-manager/src/connections/__tests__/connections.controller.spec.ts @@ -0,0 +1,132 @@ +import type { TestingModule } from '@nestjs/testing'; +import type { + EventDidcommConnectionsCreateWithSelf, + EventDidcommConnectionsGetAll, + EventDidcommConnectionsGetById, +} from '@ocm/shared'; + +import { Test } from '@nestjs/testing'; +import { Subject, of, takeUntil } from 'rxjs'; + +import { NATS_CLIENT } from '../../common/constants.js'; +import { ConnectionsController } from '../connections.controller.js'; +import { ConnectionsService } from '../connections.service.js'; + +describe('ConnectionsController', () => { + const natsClientMock = {}; + + let controller: ConnectionsController; + let service: ConnectionsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ConnectionsController], + providers: [ + { provide: NATS_CLIENT, useValue: natsClientMock }, + ConnectionsService, + ], + }).compile(); + + controller = module.get<ConnectionsController>(ConnectionsController); + service = module.get<ConnectionsService>(ConnectionsService); + }); + + describe('getAll', () => { + it('should return a list of connections', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const expectedResult: EventDidcommConnectionsGetAll['data'] = []; + + jest + .spyOn(service, 'getAllConnections') + .mockReturnValue(of(expectedResult)); + + controller + .getAll({ tenantId }) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); + + describe('getById', () => { + it('should return a connection', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const connectionId = 'exampleConnectionId'; + const expectedResult = {} as EventDidcommConnectionsGetById['data']; + + jest + .spyOn(service, 'getConnectionById') + .mockReturnValue(of(expectedResult)); + + controller + .getById({ connectionId }, { tenantId }) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); + + describe('createWithSelf', () => { + it('should return a connection', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const expectedResult = + {} as EventDidcommConnectionsCreateWithSelf['data']; + + jest + .spyOn(service, 'createConnectionWithSelf') + .mockReturnValue(of(expectedResult)); + + controller + .createWithSelf({ tenantId }) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); + + describe('block', () => { + it('should return a connection', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const idOrDid = 'exampleConnectionId'; + const expectedResult = {} as EventDidcommConnectionsGetById['data']; + + jest + .spyOn(service, 'blockConnection') + .mockReturnValue(of(expectedResult)); + + controller + .block({ idOrDid }, { tenantId }) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); +}); diff --git a/apps/connection-manager/src/connections/__tests__/connections.module.spec.ts b/apps/connection-manager/src/connections/__tests__/connections.module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c0eaeb1655c72c21b6f13d5dad75715b5be2cd3b --- /dev/null +++ b/apps/connection-manager/src/connections/__tests__/connections.module.spec.ts @@ -0,0 +1,37 @@ +import { ClientsModule } from '@nestjs/microservices'; +import { Test } from '@nestjs/testing'; + +import { NATS_CLIENT } from '../../common/constants.js'; +import { ConnectionsController } from '../connections.controller.js'; +import { ConnectionsModule } from '../connections.module.js'; +import { ConnectionsService } from '../connections.service.js'; + +describe('ConnectionsModule', () => { + let connectionsController: ConnectionsController; + let connectionsService: ConnectionsService; + + beforeEach(async () => { + const moduleRef = await Test.createTestingModule({ + imports: [ + ClientsModule.registerAsync({ + isGlobal: true, + clients: [{ name: NATS_CLIENT, useFactory: () => ({}) }], + }), + ConnectionsModule, + ], + }).compile(); + + connectionsController = moduleRef.get<ConnectionsController>( + ConnectionsController, + ); + connectionsService = moduleRef.get<ConnectionsService>(ConnectionsService); + }); + + it('should be defined', () => { + expect(connectionsController).toBeDefined(); + expect(connectionsController).toBeInstanceOf(ConnectionsController); + + expect(connectionsService).toBeDefined(); + expect(connectionsService).toBeInstanceOf(ConnectionsService); + }); +}); diff --git a/apps/connection-manager/src/connections/__tests__/connections.service.spec.ts b/apps/connection-manager/src/connections/__tests__/connections.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..b054cf94300ced602349de7f8630c74016676b72 --- /dev/null +++ b/apps/connection-manager/src/connections/__tests__/connections.service.spec.ts @@ -0,0 +1,161 @@ +import type { ClientProxy } from '@nestjs/microservices'; +import type { TestingModule } from '@nestjs/testing'; + +import { Test } from '@nestjs/testing'; +import { + EventDidcommConnectionsBlock, + EventDidcommConnectionsCreateWithSelf, + EventDidcommConnectionsGetAll, + EventDidcommConnectionsGetById, +} from '@ocm/shared'; +import { Subject, of, takeUntil } from 'rxjs'; + +import { NATS_CLIENT } from '../../common/constants.js'; +import { ConnectionsService } from '../connections.service.js'; + +describe('ConnectionsService', () => { + let service: ConnectionsService; + let natsClient: ClientProxy; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + ConnectionsService, + { + provide: NATS_CLIENT, + useValue: { + send: jest.fn(), + }, + }, + ], + }).compile(); + + service = module.get<ConnectionsService>(ConnectionsService); + natsClient = module.get<ClientProxy>(NATS_CLIENT); + }); + + describe('getAllConnections', () => { + it('should return all connections', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const expectedResult: EventDidcommConnectionsGetAll['data'] = []; + + jest + .spyOn(natsClient, 'send') + .mockReturnValue( + of(new EventDidcommConnectionsGetAll(expectedResult, tenantId)), + ); + + service + .getAllConnections(tenantId) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(natsClient.send).toHaveBeenCalledWith( + EventDidcommConnectionsGetAll.token, + { tenantId }, + ); + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); + + describe('getConnectionById', () => { + it('should return a connection', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const connectionId = 'exampleConnectionId'; + const expectedResult = {} as EventDidcommConnectionsGetById['data']; + + jest + .spyOn(natsClient, 'send') + .mockReturnValue( + of(new EventDidcommConnectionsGetById(expectedResult, tenantId)), + ); + + service + .getConnectionById(tenantId, connectionId) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(natsClient.send).toHaveBeenCalledWith( + EventDidcommConnectionsGetById.token, + { tenantId, id: connectionId }, + ); + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); + + describe('createConnectionWithSelf', () => { + it('should create a connection with self', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const expectedResult = + {} as EventDidcommConnectionsCreateWithSelf['data']; + + jest + .spyOn(natsClient, 'send') + .mockReturnValue( + of( + new EventDidcommConnectionsCreateWithSelf(expectedResult, tenantId), + ), + ); + + service + .createConnectionWithSelf(tenantId) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(natsClient.send).toHaveBeenCalledWith( + EventDidcommConnectionsCreateWithSelf.token, + { tenantId }, + ); + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); + + describe('blockConnection', () => { + it('should block a connection', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const idOrDid = 'exampleConnectionId'; + const expectedResult = {} as EventDidcommConnectionsBlock['data']; + + jest + .spyOn(natsClient, 'send') + .mockReturnValue( + of(new EventDidcommConnectionsBlock(expectedResult, tenantId)), + ); + + service + .blockConnection(tenantId, idOrDid) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(natsClient.send).toHaveBeenCalledWith( + EventDidcommConnectionsBlock.token, + { tenantId, idOrDid }, + ); + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); +}); diff --git a/apps/connection-manager/src/connections/connections.controller.ts b/apps/connection-manager/src/connections/connections.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..f8db8f8556722e340db711c631b6037111e7c7e5 --- /dev/null +++ b/apps/connection-manager/src/connections/connections.controller.ts @@ -0,0 +1,303 @@ +import { + Controller, + Get, + HttpStatus, + Param, + Post, + Query, + UseInterceptors, + UsePipes, + ValidationPipe, +} from '@nestjs/common'; +import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { MultitenancyParams, ResponseFormatInterceptor } from '@ocm/shared'; + +import { ConnectionsService } from './connections.service.js'; +import { BlockParams } from './dto/block.dto.js'; +import { GetByIdParams } from './dto/get-by-id.dto.js'; + +@Controller() +@UsePipes(new ValidationPipe({ transform: true, whitelist: true })) +@UseInterceptors(ResponseFormatInterceptor) +@ApiTags('Connections') +export class ConnectionsController { + public constructor(private readonly service: ConnectionsService) {} + + @Get() + @ApiOperation({ + summary: 'Fetch a list of connections', + description: 'This call provides a list of connections for a given tenant', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Connections fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connections fetched successfully': { + value: { + statusCode: 200, + message: 'Connections fetched successfully', + data: [], + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Tenant not found', + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal server error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal server error': { + value: { + statusCode: 500, + message: 'Internal server error', + data: null, + }, + }, + }, + }, + }, + }) + public getAll( + @Query() { tenantId }: MultitenancyParams, + ): ReturnType<ConnectionsService['getAllConnections']> { + return this.service.getAllConnections(tenantId); + } + + @Get(':connectionId') + @ApiOperation({ + summary: 'Fetch a connection by ID', + description: + 'This call provides a connection for a given tenant and connection ID', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Connection fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connection fetched successfully': { + value: { + statusCode: 200, + message: 'Connection fetched successfully', + data: {}, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Connection not found', + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + 'Connection not found': { + value: { + statusCode: 404, + message: 'Connection not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal server error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal server error': { + value: { + statusCode: 500, + message: 'Internal server error', + data: null, + }, + }, + }, + }, + }, + }) + public getById( + @Param() { connectionId }: GetByIdParams, + @Query() { tenantId }: MultitenancyParams, + ): ReturnType<ConnectionsService['getConnectionById']> { + return this.service.getConnectionById(tenantId, connectionId); + } + + @Post() + @ApiOperation({ + summary: 'Create a connection', + description: 'This call creates a self connection for a given tenant', + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Connection created successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connection created successfully': { + value: { + statusCode: 201, + message: 'Connection created successfully', + data: {}, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Tenant not found', + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal server error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal server error': { + value: { + statusCode: 500, + message: 'Internal server error', + data: null, + }, + }, + }, + }, + }, + }) + public createWithSelf( + @Query() { tenantId }: MultitenancyParams, + ): ReturnType<ConnectionsService['createConnectionWithSelf']> { + return this.service.createConnectionWithSelf(tenantId); + } + + @Post(':idOrDid/block') + @ApiOperation({ + summary: 'Block a connection', + description: + 'This call blocks a connection for a given tenant and connection ID', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Connection blocked successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connection blocked successfully': { + value: { + statusCode: 200, + message: 'Connection blocked successfully', + data: {}, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Connection not found', + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + 'Connection not found': { + value: { + statusCode: 404, + message: 'Connection not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal server error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal server error': { + value: { + statusCode: 500, + message: 'Internal server error', + data: null, + }, + }, + }, + }, + }, + }) + public block( + @Param() { idOrDid }: BlockParams, + @Query() { tenantId }: MultitenancyParams, + ): ReturnType<ConnectionsService['blockConnection']> { + return this.service.blockConnection(tenantId, idOrDid); + } +} diff --git a/apps/connection-manager/src/connections/connections.module.ts b/apps/connection-manager/src/connections/connections.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..6231fe9f019c65844f98d9b33e10a0430252adda --- /dev/null +++ b/apps/connection-manager/src/connections/connections.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; + +import { ConnectionsController } from './connections.controller.js'; +import { ConnectionsService } from './connections.service.js'; + +@Module({ + providers: [ConnectionsService], + controllers: [ConnectionsController], +}) +export class ConnectionsModule {} diff --git a/apps/connection-manager/src/connections/connections.service.ts b/apps/connection-manager/src/connections/connections.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a5647cacab3606c881151ef2e0e10b39be552102 --- /dev/null +++ b/apps/connection-manager/src/connections/connections.service.ts @@ -0,0 +1,71 @@ +import type { + EventDidcommConnectionsBlockInput, + EventDidcommConnectionsGetAllInput, + EventDidcommConnectionsGetByIdInput, +} from '@ocm/shared'; +import type { Observable } from 'rxjs'; + +import { Inject, Injectable } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { + EventDidcommConnectionsBlock, + EventDidcommConnectionsCreateWithSelf, + EventDidcommConnectionsGetAll, + EventDidcommConnectionsGetById, +} from '@ocm/shared'; +import { map } from 'rxjs'; + +import { NATS_CLIENT } from '../common/constants.js'; + +@Injectable() +export class ConnectionsService { + public constructor( + @Inject(NATS_CLIENT) private readonly natsClient: ClientProxy, + ) {} + + public getAllConnections( + tenantId: string, + ): Observable<EventDidcommConnectionsGetAll['data']> { + return this.natsClient + .send< + EventDidcommConnectionsGetAll, + EventDidcommConnectionsGetAllInput + >(EventDidcommConnectionsGetAll.token, { tenantId }) + .pipe(map((result) => result.data)); + } + + public getConnectionById( + tenantId: string, + id: string, + ): Observable<EventDidcommConnectionsGetById['data']> { + return this.natsClient + .send< + EventDidcommConnectionsGetById, + EventDidcommConnectionsGetByIdInput + >(EventDidcommConnectionsGetById.token, { tenantId, id }) + .pipe(map((result) => result.data)); + } + + public createConnectionWithSelf( + tenantId: string, + ): Observable<EventDidcommConnectionsCreateWithSelf['data']> { + return this.natsClient + .send<EventDidcommConnectionsCreateWithSelf>( + EventDidcommConnectionsCreateWithSelf.token, + { tenantId }, + ) + .pipe(map((result) => result.data)); + } + + public blockConnection( + tenantId: string, + idOrDid: string, + ): Observable<EventDidcommConnectionsBlock['data']> { + return this.natsClient + .send< + EventDidcommConnectionsBlock, + EventDidcommConnectionsBlockInput + >(EventDidcommConnectionsBlock.token, { tenantId, idOrDid }) + .pipe(map((result) => result.data)); + } +} diff --git a/apps/connection-manager/src/connections/controller/controller.spec.ts b/apps/connection-manager/src/connections/controller/controller.spec.ts deleted file mode 100644 index f6839dd445d50c297e86ae51645b7637a10d3625..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/controller/controller.spec.ts +++ /dev/null @@ -1,754 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type ConnectionStateDto from '../entities/connectionStateDto.entity.js'; -import type { TestingModule } from '@nestjs/testing'; - -import { HttpModule } from '@nestjs/axios'; -import { HttpStatus } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; -import { ClientsModule, Transport } from '@nestjs/microservices'; -import { Test } from '@nestjs/testing'; -import { createResponse } from 'node-mocks-http'; - -import NatsClientService from '../../client/nats.client.js'; -import RestClientService from '../../client/rest.client.js'; -import { NATSServices } from '../../common/constants.js'; -import PrismaService from '../../prisma/prisma.service.js'; -import ConnectionsService from '../services/service.js'; - -import ConnectionsController from './controller.js'; - -describe.skip('ConnectionsController', () => { - let connectionController: ConnectionsController; - let connectionService: ConnectionsService; - // const connection = new ConnectionDto(); - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - imports: [ - ConfigModule, - HttpModule, - ClientsModule.register([ - { - name: NATSServices.SERVICE_NAME, - transport: Transport.NATS, - }, - ]), - ], - controllers: [ConnectionsController], - providers: [ - ConnectionsService, - PrismaService, - NatsClientService, - RestClientService, - ], - exports: [PrismaService], - }).compile(); - connectionService = module.get<ConnectionsService>(ConnectionsService); - connectionController = module.get<ConnectionsController>( - ConnectionsController, - ); - }); - it('should be defined', () => { - expect(connectionController).toBeDefined(); - }); - - describe('Get all connections', () => { - it('should return an array of connection', async () => { - const param = {}; - const serviceResult: any = [ - 1, - { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }, - ]; - - const result: any = { - count: 1, - records: { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }, - }; - - const response = createResponse(); - - jest - .spyOn(connectionService, 'findConnections') - .mockResolvedValueOnce(serviceResult); - - const res: any = await connectionController.getConnection( - param, - response, - ); - - const resData = res._getData(); - - expect(res.statusCode).toBe(HttpStatus.OK); - expect(JSON.parse(resData).data).toStrictEqual(result); - }); - - it('If Not provided required parameter response should be bad request', async () => { - const param = {}; - const serviceResult: any = [ - 1, - { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }, - ]; - - const response = createResponse(); - - jest - .spyOn(connectionService, 'findConnections') - .mockResolvedValueOnce(serviceResult); - - const res = await connectionController.getConnection(param, response); - const resData = res._getData(); - - expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); - expect(JSON.parse(resData).message).toStrictEqual( - 'Participant ID/ connection ID / participant DID must be provided', - ); - }); - - it('Get connection against connection id', async () => { - const param = { - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - }; - - const serviceResult: any = { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }; - - const result: any = { - statusCode: 200, - message: 'Connections fetch successfully', - data: { - records: { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }, - }, - }; - - const response = createResponse(); - jest - .spyOn(connectionService, 'findConnections') - .mockResolvedValueOnce(serviceResult); - const res: any = await connectionController.getConnection( - param, - response, - ); - // eslint-disable-next-line no-underscore-dangle - const resData = res._getData(); - expect(res.statusCode).toBe(HttpStatus.OK); - expect(JSON.parse(resData)).toStrictEqual(result); - }); - - it('Not fount if data is not present against connection id', async () => { - const param = { - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - }; - const serviceResult: any = { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: false, - }; - - const result: any = { - statusCode: HttpStatus.NOT_FOUND, - message: 'No Data found', - }; - - const response = createResponse(); - jest - .spyOn(connectionService, 'findConnections') - .mockResolvedValueOnce(serviceResult); - const res: any = await connectionController.getConnection( - param, - response, - ); - // eslint-disable-next-line no-underscore-dangle - const resData = res._getData(); - expect(res.statusCode).toBe(HttpStatus.NOT_FOUND); - expect(JSON.parse(resData)).toStrictEqual(result); - }); - - it('should return an array of connection with status filter', async () => { - const param = {}; - const serviceResult: any = [ - 1, - { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }, - ]; - - const result: any = { - count: 1, - records: { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }, - }; - - const response = createResponse(); - jest - .spyOn(connectionService, 'findConnections') - .mockResolvedValueOnce(serviceResult); - const res: any = await connectionController.getConnection( - param, - response, - ); - // eslint-disable-next-line no-underscore-dangle - const resData = res._getData(); - expect(res.statusCode).toBe(HttpStatus.OK); - expect(JSON.parse(resData).data).toStrictEqual(result); - }); - }); - - describe('Connection webhook calls', () => { - it('Create connection webhook call', async () => { - const webHook: ConnectionStateDto = { - _tags: {}, - metadata: {}, - id: '7edc871d-9fa3-4f30-8763-59c80bf346f5', - createdAt: '2022-04-21T10:52:27.151Z', - did: 'DD8Aue5tuohjBaCLM9GMU7', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - [ - { - id: 'C1buxAXWiisjFpVVyUGM5D#1', - controller: 'C1buxAXWiisjFpVVyUGM5D', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', - }, - ], - ], - service: [ - { - id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', - serviceEndpoint: 'http://localhost:4011', - type: 'IndyAgent', - priority: 0, - recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], - routingKeys: [], - }, - ], - authentication: [[Object]], - id: 'DD8Aue5tuohjBaCLM9GMU7', - }, - theirDid: '', - theirLabel: '', - verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', - state: 'invited', - role: 'inviter', - alias: 'member', - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', - label: 'State_University', - recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], - serviceEndpoint: 'http://localhost:4017', - routingKeys: [], - }, - multiUseInvitation: false, - }; - const serviceResult: any = {}; - jest - .spyOn(connectionService, 'createConnections') - .mockResolvedValueOnce(serviceResult); - const res: any = await connectionController.createConnection({ - body: webHook, - }); - - expect(res.statusCode).toBe(HttpStatus.CREATED); - // expect(JSON.parse(resData).data).toStrictEqual(result); - }); - - it('Update connection webhook call -> member flow', async () => { - const webHook: ConnectionStateDto = { - _tags: {}, - metadata: {}, - id: '72534911-9be0-4e3f-8539-2a8a09e4e409', - createdAt: '2022-04-21T10:52:27.151Z', - did: 'DD8Aue5tuohjBaCLM9GMU7', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - [ - { - id: 'C1buxAXWiisjFpVVyUGM5D#1', - controller: 'C1buxAXWiisjFpVVyUGM5D', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', - }, - ], - ], - service: [ - { - id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', - serviceEndpoint: 'http://localhost:4011', - type: 'IndyAgent', - priority: 0, - recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], - routingKeys: [], - }, - ], - authentication: [[Object]], - id: 'DD8Aue5tuohjBaCLM9GMU7', - }, - theirDid: '', - theirLabel: '', - verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', - state: 'complete', - role: 'inviter', - alias: 'member', - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', - label: 'State_University', - recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], - serviceEndpoint: 'http://localhost:4017', - routingKeys: [], - }, - multiUseInvitation: false, - }; - - const restConnection: any = { - id: '29701e41-60e8-4fca-8504-ea3bcefa6486', - connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', - participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', - status: 'trusted', - participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', - theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', - theirLabel: 'Attest12', - createdDate: '2022-04-15T11:30:04.660Z', - updatedDate: '2022-04-15T11:36:58.560Z', - isActive: true, - }; - const serviceResult: any = {}; - jest - .spyOn(connectionService, 'updateStatusByConnectionId') - .mockResolvedValueOnce(serviceResult); - - jest - .spyOn(connectionService, 'getConnectionByID') - .mockResolvedValueOnce(restConnection); - const res: any = await connectionController.createConnection({ - body: webHook, - }); - - expect(res.statusCode).toBe(HttpStatus.OK); - // expect(JSON.parse(resData).data).toStrictEqual(result); - }); - - it('Update connection webhook call -> subscriber flow', async () => { - const webHook: ConnectionStateDto = { - _tags: {}, - metadata: {}, - id: '72534911-9be0-4e3f-8539-2a8a09e4e409', - createdAt: '2022-04-21T10:52:27.151Z', - did: 'DD8Aue5tuohjBaCLM9GMU7', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - [ - { - id: 'C1buxAXWiisjFpVVyUGM5D#1', - controller: 'C1buxAXWiisjFpVVyUGM5D', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', - }, - ], - ], - service: [ - { - id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', - serviceEndpoint: 'http://localhost:4011', - type: 'IndyAgent', - priority: 0, - recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], - routingKeys: [], - }, - ], - authentication: [[Object]], - id: 'DD8Aue5tuohjBaCLM9GMU7', - }, - theirDid: '', - theirLabel: '', - verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', - state: 'complete', - role: 'inviter', - alias: 'subscriber', - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', - label: 'State_University', - recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], - serviceEndpoint: 'http://localhost:4017', - routingKeys: [], - }, - multiUseInvitation: false, - }; - - const restConnection: any = { - id: '29701e41-60e8-4fca-8504-ea3bcefa6486', - connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', - participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', - status: 'trusted', - participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', - theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', - theirLabel: 'Attest12', - createdDate: '2022-04-15T11:30:04.660Z', - updatedDate: '2022-04-15T11:36:58.560Z', - isActive: true, - }; - const serviceResult: any = {}; - jest - .spyOn(connectionService, 'updateStatusByConnectionId') - .mockResolvedValueOnce(serviceResult); - - jest - .spyOn(connectionService, 'getConnectionByID') - .mockResolvedValueOnce(restConnection); - const res: any = await connectionController.createConnection({ - body: webHook, - }); - - expect(res.statusCode).toBe(HttpStatus.OK); - // expect(JSON.parse(resData).data).toStrictEqual(result); - }); - - it('Connection webhook call with wrong role', async () => { - const webHook: ConnectionStateDto = { - _tags: {}, - metadata: {}, - id: '72534911-9be0-4e3f-8539-2a8a09e4e409', - createdAt: '2022-04-21T10:52:27.151Z', - did: 'DD8Aue5tuohjBaCLM9GMU7', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - [ - { - id: 'C1buxAXWiisjFpVVyUGM5D#1', - controller: 'C1buxAXWiisjFpVVyUGM5D', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', - }, - ], - ], - service: [ - { - id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', - serviceEndpoint: 'http://localhost:4011', - type: 'IndyAgent', - priority: 0, - recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], - routingKeys: [], - }, - ], - authentication: [[Object]], - id: 'DD8Aue5tuohjBaCLM9GMU7', - }, - theirDid: '', - theirLabel: '', - verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', - state: 'complete', - role: 'invitee', - alias: 'subscriber', - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', - label: 'State_University', - recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], - serviceEndpoint: 'http://localhost:4017', - routingKeys: [], - }, - multiUseInvitation: false, - }; - - const restConnection = { - id: '29701e41-60e8-4fca-8504-ea3bcefa6486', - connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', - participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', - status: 'trusted', - participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', - theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', - theirLabel: 'Attest12', - createdDate: '2022-04-15T11:30:04.660Z', - updatedDate: '2022-04-15T11:36:58.560Z', - isActive: true, - }; - const serviceResult = {}; - - jest - .spyOn(connectionService, 'updateStatusByConnectionId') - .mockResolvedValueOnce(serviceResult); - - jest - .spyOn(connectionService, 'getConnectionByID') - .mockResolvedValueOnce(restConnection); - const res = await connectionController.createConnection({ - body: webHook, - }); - - expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); - // expect(JSON.parse(resData).data).toStrictEqual(result); - }); - }); - - describe('Get invitation URL', () => { - it('Get Member invitation URL', async () => { - const body = { - autoAcceptConnection: true, - }; - const query = { - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - process: 'member', - }; - const serviceResult: any = { - invitationUrl: - 'http://localhost:4005?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiYWMzYjE0NjktY2Y0Ni00M2ZjLWE4M2EtZGNmZjJjMDA1YjRlIiwibGFiZWwiOiJ0ZWNobmljYV9jb3JwIiwicmVjaXBpZW50S2V5cyI6WyI1bml1NWZmZmVnYkZlS2F3bU5OblRBTEpzaHB1cXpjRm5CUGpBOFFWU2dtWCJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwNSIsInJvdXRpbmdLZXlzIjpbXX0', - invitation: { - '@type': - 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', - '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', - label: 'technica_corp', - recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], - serviceEndpoint: 'http://localhost:4005', - routingKeys: [], - }, - connection: { - _tags: {}, - metadata: {}, - id: 'c1d73d9e-6988-4c84-9ebc-068c265d2fb6', - createdAt: '2022-04-21T10:52:18.161Z', - did: '9nYw7CSdHPqXf6ayfA7Wo2', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - { - id: '9nYw7CSdHPqXf6ayfA7Wo2#1', - controller: '9nYw7CSdHPqXf6ayfA7Wo2', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', - }, - ], - service: [ - { - id: '9nYw7CSdHPqXf6ayfA7Wo2#In7780cd24-af13-423e-b1ff-ae944ab6fd71dyAgentService', - serviceEndpoint: 'http://localhost:4005', - type: 'IndyAgent', - priority: 0, - recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], - routingKeys: [], - }, - ], - authentication: [ - { - publicKey: '9nYw7CSdHPqXf6ayfA7Wo2#1', - type: 'Ed25519SignatureAuthentication2018', - }, - ], - id: '9nYw7CSdHPqXf6ayfA7Wo2', - }, - verkey: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', - state: 'invited', - role: 'inviter', - alias: 'member', - autoAcceptConnection: true, - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', - label: 'technica_corp', - recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], - serviceEndpoint: 'http://localhost:4005', - routingKeys: [], - }, - multiUseInvitation: false, - }, - }; - - const result: any = { - statusCode: 200, - message: 'Connection created successfully', - data: { - invitationUrl: - 'http://localhost:4005?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiYWMzYjE0NjktY2Y0Ni00M2ZjLWE4M2EtZGNmZjJjMDA1YjRlIiwibGFiZWwiOiJ0ZWNobmljYV9jb3JwIiwicmVjaXBpZW50S2V5cyI6WyI1bml1NWZmZmVnYkZlS2F3bU5OblRBTEpzaHB1cXpjRm5CUGpBOFFWU2dtWCJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwNSIsInJvdXRpbmdLZXlzIjpbXX0', - invitation: { - '@type': - 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', - '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', - label: 'technica_corp', - recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], - serviceEndpoint: 'http://localhost:4005', - routingKeys: [], - }, - connection: { - _tags: {}, - metadata: {}, - id: 'c1d73d9e-6988-4c84-9ebc-068c265d2fb6', - createdAt: '2022-04-21T10:52:18.161Z', - did: '9nYw7CSdHPqXf6ayfA7Wo2', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - { - id: '9nYw7CSdHPqXf6ayfA7Wo2#1', - controller: '9nYw7CSdHPqXf6ayfA7Wo2', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: - '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', - }, - ], - service: [ - { - id: '9nYw7CSdHPqXf6ayfA7Wo2#In7780cd24-af13-423e-b1ff-ae944ab6fd71dyAgentService', - serviceEndpoint: 'http://localhost:4005', - type: 'IndyAgent', - priority: 0, - recipientKeys: [ - '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', - ], - routingKeys: [], - }, - ], - authentication: [ - { - publicKey: '9nYw7CSdHPqXf6ayfA7Wo2#1', - type: 'Ed25519SignatureAuthentication2018', - }, - ], - id: '9nYw7CSdHPqXf6ayfA7Wo2', - }, - verkey: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', - state: 'invited', - role: 'inviter', - alias: 'member', - autoAcceptConnection: true, - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', - label: 'technica_corp', - recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], - serviceEndpoint: 'http://localhost:4005', - routingKeys: [], - }, - multiUseInvitation: false, - }, - }, - }; - - const response = createResponse(); - jest - .spyOn(connectionService, 'createInvitationURL') - .mockResolvedValueOnce(serviceResult); - const res: any = await connectionController.createConnectionInvitation( - body, - query, - response, - ); - // eslint-disable-next-line no-underscore-dangle - const resData = res._getData(); - expect(res.statusCode).toBe(HttpStatus.OK); - expect(resData).toStrictEqual(result); - }); - - it('Get Member invitation URL-> Agent is not present', async () => { - const body = { - autoAcceptConnection: true, - }; - const query = { - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - process: 'member', - }; - const serviceResult: any = undefined; - - const result: any = { - statusCode: HttpStatus.NOT_FOUND, - message: 'Agent Data not found.', - }; - - const response = createResponse(); - jest - .spyOn(connectionService, 'createInvitationURL') - .mockResolvedValueOnce(serviceResult); - const res: any = await connectionController.createConnectionInvitation( - body, - query, - response, - ); - // eslint-disable-next-line no-underscore-dangle - const resData = res._getData(); - expect(res.statusCode).toBe(HttpStatus.NOT_FOUND); - expect(resData).toStrictEqual(result); - }); - }); -}); diff --git a/apps/connection-manager/src/connections/controller/controller.ts b/apps/connection-manager/src/connections/controller/controller.ts deleted file mode 100644 index 0dc1b2d2268596e854c92041b8d5b16d62694d5d..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/controller/controller.ts +++ /dev/null @@ -1,779 +0,0 @@ -import type ResponseType from '../../common/response.js'; -import type ConnectionStateDto from '../entities/connectionStateDto.entity.js'; -import type ConnectionSubscriptionEndpointDto from '../entities/connectionSubscribeEndPoint.entity.js'; -import type ConnectionDto from '../entities/entity.js'; -// eslint-disable-next-line @typescript-eslint/consistent-type-imports -import type { Response } from 'express'; - -import { - Body, - Controller, - Get, - HttpStatus, - Param, - Post, - Query, - Res, - Version, -} from '@nestjs/common'; -import { MessagePattern } from '@nestjs/microservices'; -import { - ApiBody, - ApiExcludeEndpoint, - ApiOperation, - ApiQuery, - ApiResponse, - ApiTags, -} from '@nestjs/swagger'; - -import { - Abstraction, - NATSServices, - RECEIVED_CONNECTION_ALIAS, -} from '../../common/constants.js'; -import logger from '../../utils/logger.js'; -import AcceptConnectionInvitationBody from '../entities/AcceptConnectionInvitationBody.js'; -import ConnectionCreateInvitationDto from '../entities/connectionCreateInvitationDto.entity.js'; -import ConnectionsService from '../services/service.js'; - -@ApiTags('Connections') -@Controller() -export default class ConnectionsController { - public constructor(private readonly connectionsService: ConnectionsService) {} - - @MessagePattern({ - endpoint: `${Abstraction.NATS_ENDPOINT}/${Abstraction.CONNECTION_STATE_CHANGED}`, - }) - public async createConnection(body: { - connectionRecord: ConnectionStateDto; - }) { - const connection = body.connectionRecord; - - const connectionObj: ConnectionDto = { - connectionId: connection.id ? connection.id : '', - status: connection.state ? connection.state : '', - participantDid: connection.did ? connection.did : '', - theirDid: connection.theirDid ? connection.theirDid : '', - theirLabel: connection.theirLabel ? connection.theirLabel : '', - isReceived: connection.alias === RECEIVED_CONNECTION_ALIAS, - }; - - /** - * Sent Connection updates to subscriber - */ - const connectionSubscriptionEndpointDto: ConnectionSubscriptionEndpointDto = - { - connectionId: connectionObj.connectionId, - status: connectionObj.status, - }; - this.connectionsService.publishConnectionSubscriberEndpoint( - connectionSubscriptionEndpointDto, - ); - - if (connection.state === ConnectionsService.status.INVITED) { - connectionObj.invitation = { - serviceEndpoint: connection.invitation.serviceEndpoint, - }; - const res: ResponseType = { - statusCode: HttpStatus.CREATED, - message: 'Connection established successfully', - data: await this.connectionsService.createConnections(connectionObj), - }; - return res; - } - if (connection.state === ConnectionsService.status.COMPLETE) { - logger.info('connection is in complete state'); - if ( - connection.alias === RECEIVED_CONNECTION_ALIAS || - connection.alias === ConnectionsService.connectionAlias.TRUST - ) { - connectionObj.status = ConnectionsService.status.TRUSTED; - } else { - const resConnection = await this.connectionsService.getConnectionByID( - connection.id, - ); - - if (resConnection) { - if (connection.alias === ConnectionsService.connectionAlias.MEMBER) { - logger.info( - `connection.alias ===${ConnectionsService.connectionAlias.MEMBER}`, - ); - await this.connectionsService.sendConnectionStatusToPrincipal( - connection.state, - connection.id, - connection.theirLabel, - connection.did, - connection.theirDid, - ); - } - - if ( - connection.alias === ConnectionsService.connectionAlias.SUBSCRIBER - ) { - await this.connectionsService.sendMembershipProofRequestToProofManager( - connection.id, - ); - } - } - } - } - - const res: ResponseType = { - statusCode: HttpStatus.OK, - message: 'Connection status Updated successfully', - data: await this.connectionsService.updateStatusByConnectionId( - connectionObj, - ), - }; - - return res; - } - - @Version(['1']) - @ApiBody({ type: ConnectionCreateInvitationDto }) - @Post('invitation-url') - @ApiOperation({ - summary: 'Create new connection invitation', - description: - "This call provides the capability to create new connection invitation by providing alias parameter for taht connection in the body of request. Alias can be one of value: trust/subscriber/trust. This call returns an object contains three fields. invitationUrl, invitationUrlShort, invitation object and connection object. You can use invitationUrlShort or invitationUrl to create QR code which can be scanned by PCM. It's better to use invitationUrlShort because long string of invitationUrl replaced with short id and QR code can be displayed properly", - }) - @ApiResponse({ - status: HttpStatus.OK, - description: 'Connection created successfully', - content: { - 'application/json': { - schema: {}, - examples: { - 'Connection created successfully': { - value: { - statusCode: 200, - message: 'Connection created successfully', - data: { - invitationUrl: - 'https://serviceEndpointUrl.com:443/ocm/didcomm?c_i=eyJAdHlwZSI6Imh0dHBzOi', - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': 'efe3fe97', - label: 'ssi-abstraction-agent', - recipientKeys: ['8iT6AAmbj9P'], - serviceEndpoint: - 'https://serviceEndpointUrl.com:443/ocm/didcomm', - routingKeys: [], - }, - connection: { - _tags: {}, - metadata: {}, - id: '507de3ab', - createdAt: '1970-01-01T00:00:00.358Z', - did: 'F9xYT1m', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - { - id: 'F9xYT1m', - controller: 'F9xYT1m', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: '8iT6AAmbj9P', - }, - ], - service: [ - { - id: 'F9xYT1m#IndyAgentService', - serviceEndpoint: - 'https://serviceEndpointUrl.com:443/ocm/didcomm', - type: 'IndyAgent', - priority: 0, - recipientKeys: ['8iT6AAmbj9P'], - routingKeys: [], - }, - ], - authentication: [ - { - publicKey: 'F9xYT1m', - type: 'Ed25519SignatureAuthentication2018', - }, - ], - id: 'F9xYT1m', - }, - verkey: '8iT6AAmbj9P', - state: 'invited', - role: 'inviter', - alias: 'trust', - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': 'efe3fe97', - label: 'ssi-abstraction-agent', - recipientKeys: ['8iT6AAmbj9P'], - serviceEndpoint: - 'https://serviceEndpointUrl.com:443/ocm/didcomm', - routingKeys: [], - }, - multiUseInvitation: false, - }, - invitationUrlShort: - 'https://serviceEndpointUrl.com/ocm/connection/v1/url/1234abc', - }, - }, - }, - }, - }, - }, - }) - @ApiResponse({ - status: HttpStatus.BAD_REQUEST, - description: 'Alias must be provided', - content: { - 'application/json': { - schema: {}, - examples: { - 'Alias must be provided': { - value: { - statusCode: 400, - message: 'Alias must be provided', - }, - }, - }, - }, - }, - }) - @ApiResponse({ - status: HttpStatus.NOT_FOUND, - description: 'Agent Data not found.', - content: { - 'application/json': { - schema: {}, - examples: { - 'Agent Data not found.': { - value: { - statusCode: 400, - message: 'Agent Data not found.', - }, - }, - }, - }, - }, - }) - @ApiQuery({ name: 'alias', required: true }) - public async createConnectionInvitation( - @Body() connectionCreate: ConnectionCreateInvitationDto, - @Query() query: { alias: string }, - @Res() response: Response, - ) { - logger.info(JSON.stringify(query)); - let res: ResponseType; - - if ( - !( - query.alias === ConnectionsService.connectionAlias.MEMBER || - query.alias === ConnectionsService.connectionAlias.SUBSCRIBER || - query.alias === ConnectionsService.connectionAlias.TRUST - ) - ) { - response.status(HttpStatus.BAD_REQUEST); - res = { - statusCode: HttpStatus.BAD_REQUEST, - message: 'Alias must be provided', - }; - return response.send(res); - } - const createConnectionPayload = { - ...connectionCreate, - alias: query.alias, - }; - const result = await this.connectionsService.createInvitationURL( - createConnectionPayload, - ); - if (result) { - res = { - statusCode: HttpStatus.OK, - message: 'Connection created successfully', - data: result, - }; - return response.send(res); - } - response.status(HttpStatus.NOT_FOUND); - res = { - statusCode: HttpStatus.NOT_FOUND, - message: 'Agent Data not found.', - }; - - return response.send(res); - } - - @Version(['1']) - @Get('url/:id') - @ApiOperation({ - summary: 'Get full url from short url id', - description: 'Get full url from short url id', - }) - @ApiExcludeEndpoint() - public async redirectToConnectionUrl( - @Param() params: { id: string }, - @Res() response: Response, - ) { - const result = await this.connectionsService.findConnectionByShortUrlId( - params.id, - ); - if (!result) { - throw new Error('Not found'); - } - response.writeHead(302, { - location: result.connectionUrl, - }); - return response.end(); - } - - @Version(['1']) - @Get('connection-information') - @ApiOperation({ - summary: 'Fetch connection information by id or did', - description: - 'This call provides the capability to get information about connection by connectionId or did. This call returns issued credentials and requested proof to that connection', - }) - @ApiQuery({ name: 'connectionId', required: false }) - @ApiQuery({ name: 'did', required: false }) - @ApiResponse({ - status: HttpStatus.OK, - description: 'Connection information fetched successfully', - content: { - 'application/json': { - schema: {}, - examples: { - 'Connection information fetched successfully': { - value: { - statusCode: 200, - message: 'Connection information fetched successfully', - data: { - records: { - issueCredentials: [ - { - id: '6a6ee15d', - credentialId: '624a76fd', - credDefId: '8y8oycXjn', - threadId: '9f95a52a', - state: 'done', - principalDid: 'KGaeQVa', - connectionId: '12cd39de', - createdDate: '1970-01-01T00:00:00.149Z', - updatedDate: '1970-01-01T00:00:00.467Z', - expirationDate: null, - }, - ], - presentProofs: [], - }, - }, - }, - }, - }, - }, - }, - }) - @ApiResponse({ - status: HttpStatus.BAD_REQUEST, - description: 'connection ID / DID must be provided', - content: { - 'application/json': { - schema: {}, - examples: { - 'connection ID / DID must be provided': { - value: { - statusCode: 400, - message: 'connection ID / DID must be provided', - }, - }, - }, - }, - }, - }) - @ApiResponse({ - status: HttpStatus.BAD_REQUEST, - description: 'Invalid connection ID / DID', - content: { - 'application/json': { - schema: {}, - examples: { - 'Invalid connection ID / DID': { - value: { - statusCode: 400, - message: 'Invalid connection ID / DID', - }, - }, - }, - }, - }, - }) - public async getConnectionInformationRequest( - @Query() query: { connectionId: string; did: string }, - @Res() response: Response, - ) { - let res: ResponseType; - - if (!query.connectionId && !query.did) { - response.status(HttpStatus.BAD_REQUEST); - res = { - statusCode: HttpStatus.BAD_REQUEST, - message: 'connection ID / DID must be provided', - }; - return response.json(res); - } - - const result = - await this.connectionsService.getConnectionInformationRequest( - query.connectionId || '', - query.did || '', - ); - - if (!result) { - response.status(HttpStatus.BAD_REQUEST); - res = { - statusCode: HttpStatus.BAD_REQUEST, - message: 'Invalid connection ID / DID', - }; - return response.json(res); - } - - res = { - statusCode: HttpStatus.OK, - message: 'Connection information fetched successfully', - data: { - records: result, - }, - }; - return response.json(res); - } - - @Version(['1']) - @Get('connections') - @ApiOperation({ - summary: 'Fetch list of connections', - description: - 'This call provides the capability to search connections by using pagination and filter parameters. This call returns a list of connections and overall count of records. This endpoint supports followinng query filter parameters: participantDID, status, pageSize, page', - }) - @ApiQuery({ name: 'page', required: false }) - @ApiQuery({ name: 'pageSize', required: false }) - @ApiQuery({ name: 'status', required: false }) - @ApiQuery({ name: 'participantDID', required: false }) - @ApiResponse({ - status: HttpStatus.OK, - description: 'Connections fetched successfully', - content: { - 'application/json': { - schema: {}, - examples: { - 'Connections fetched successfully': { - value: { - statusCode: 200, - message: 'Connections fetched successfully', - data: { - count: 1, - records: [ - { - id: '089e1b95', - connectionId: 'e7361a1b', - status: 'invited', - participantDid: 'Kv6NS9y', - theirDid: '', - theirLabel: '', - createdDate: '1970-01-01T00:00:00.617Z', - updatedDate: '1970-01-01T00:00:00.617Z', - isActive: false, - isReceived: false, - }, - ], - }, - }, - }, - }, - }, - }, - }) - @ApiResponse({ - status: HttpStatus.NOT_FOUND, - description: 'No Data found', - content: { - 'application/json': { - schema: {}, - examples: { - 'No Data found': { - value: { - statusCode: 404, - message: 'No Data found', - }, - }, - }, - }, - }, - }) - public async getConnectionLists( - @Param() params: { connectionId: string }, - @Query() - query: { - participantDID?: string; - pageSize?: string; - page?: string; - status?: string; - }, - @Res() response: Response, - ) { - let res: ResponseType; - - const result = await this.connectionsService.findConnections( - query.pageSize ? parseInt(query.pageSize, 10) : 10, - query.page ? parseInt(query.page, 10) : 0, - query.status ? query.status : false, - params?.connectionId ? params.connectionId : undefined, - query.participantDID, - ); - - if (Array.isArray(result) && result[0] > 0) { - res = { - statusCode: HttpStatus.OK, - message: 'Connections fetched successfully', - data: { - count: result[0], - records: result[1], - }, - }; - return response.json(res); - } - - if (result && !Array.isArray(result) && result.isActive) { - res = { - statusCode: HttpStatus.OK, - message: 'Connections fetched successfully', - data: { - records: result, - }, - }; - return response.json(res); - } - - response.status(HttpStatus.NOT_FOUND); - res = { - statusCode: HttpStatus.NOT_FOUND, - message: 'No Data found', - }; - return response.json(res); - } - - @Version(['1']) - @Get('connections/:connectionId') - @ApiOperation({ - summary: 'Fetch connection by id', - description: - 'This call provides the capability to get connection data by providing connectionId. The connection data is the same which is returned from /v1/connections endpoint and contains generic information about connection like connectionId, status, dids and so on.', - }) - @ApiResponse({ - status: HttpStatus.OK, - description: 'Connections fetched successfully', - content: { - 'application/json': { - schema: {}, - examples: { - 'Connections fetched successfully': { - value: { - statusCode: 200, - message: 'Connections fetched successfully', - data: { - count: 1, - records: [ - { - id: '089e1b95', - connectionId: 'e7361a1b', - status: 'invited', - participantDid: 'Kv6NS9y', - theirDid: '', - theirLabel: '', - createdDate: '1970-01-01T00:00:00.617Z', - updatedDate: '1970-01-01T00:00:00.617Z', - isActive: false, - isReceived: false, - }, - ], - }, - }, - }, - }, - }, - }, - }) - @ApiResponse({ - status: HttpStatus.NOT_FOUND, - description: 'No Data found', - content: { - 'application/json': { - schema: {}, - examples: { - 'No Data found': { - value: { - statusCode: 404, - message: 'No Data found', - }, - }, - }, - }, - }, - }) - public async getConnection( - @Param() params: { connectionId: string }, - @Res() response: Response, - ) { - return this.getConnectionLists(params, {}, response); - } - - @MessagePattern({ - endpoint: `${NATSServices.SERVICE_NAME}/getConnectionById`, - }) - public async getConnectionById(data: { connectionId: string }) { - const result = await this.connectionsService.findConnections( - -1, - -1, - false, - data.connectionId, - ); - return result; - } - - @MessagePattern({ - endpoint: `${NATSServices.SERVICE_NAME}/makeConnectionTrusted`, - }) - public async makeConnectionTrusted(data: { connectionId: string }) { - const result = await this.connectionsService.makeConnectionTrusted( - data.connectionId, - ); - return result; - } - - @Version(['1']) - @ApiBody({ type: AcceptConnectionInvitationBody }) - @Post('accept-connection-invitation') - @ApiOperation({ - summary: 'Accept connection invitation', - description: - 'This call provides the capability to receive connection invitation as invitee by invitationUrl and create connection. If auto accepting is enabled via either the config passed in the function or the global agent config, a connection request message will be send.', - }) - @ApiResponse({ - status: HttpStatus.ACCEPTED, - description: 'Accepted Connection Request', - content: { - 'application/json': { - schema: {}, - examples: { - 'Accepted Connection Request': { - value: { - statusCode: 202, - message: 'Accepted Connection Request', - data: { - _tags: { - invitationKey: '5Nj', - state: 'invited', - role: 'invitee', - verkey: 'F6d', - }, - metadata: {}, - id: 'e6d30380', - createdAt: '1970-01-01T00:00:00.103Z', - did: 'Ss8', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - { - id: 'Ss8#1', - controller: 'Ss8', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: 'F6d', - }, - ], - service: [ - { - id: 'Ss8', - serviceEndpoint: - 'https://serviceEndpointUrl.com:443/ocm/didcomm', - type: 'IndyAgent', - priority: 0, - recipientKeys: ['F6d'], - routingKeys: [], - }, - ], - authentication: [ - { - publicKey: 'Ss8#1', - type: 'Ed25519SignatureAuthentication2018', - }, - ], - id: 'Ss8', - }, - verkey: 'F6d', - theirLabel: 'ssi-abstraction-agent', - state: 'requested', - role: 'invitee', - alias: 'connection-received', - autoAcceptConnection: true, - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': '12ebbf61', - label: 'ssi-abstraction-agent', - recipientKeys: ['5Nj'], - serviceEndpoint: - 'https://serviceEndpointUrl.com:443/ocm/didcomm', - routingKeys: [], - }, - multiUseInvitation: false, - }, - }, - }, - }, - }, - }, - }) - @ApiResponse({ - status: HttpStatus.INTERNAL_SERVER_ERROR, - description: 'Internal Server Error or Bad Request', - content: { - 'application/json': { - schema: {}, - examples: { - 'Internal Server Error or Bad Request': { - value: { - statusCode: 500, - timestamp: '1970-01-01T00:00:00.668Z', - message: 'something went wrong: Lorem Ipsum', - }, - }, - }, - }, - }, - }) - public async acceptConnectionInvitation( - @Body() body: AcceptConnectionInvitationBody, - @Res() response: Response, - ) { - const { invitationUrl, autoAcceptConnection } = body; - - const { agentUrl } = this.connectionsService.getAgentUrl(); - - const responseData: ResponseType = { - statusCode: HttpStatus.ACCEPTED, - message: 'Accepted Connection Request', - data: await this.connectionsService.acceptConnectionInvitation(agentUrl, { - invitationUrl, - autoAcceptConnection, - alias: RECEIVED_CONNECTION_ALIAS, - }), - }; - - return response.status(responseData.statusCode).send(responseData); - } - - @MessagePattern({ - endpoint: `${NATSServices.SERVICE_NAME}/getReceivedConnections`, - }) - public async getReceivedConnections() { - let result: object[] = []; - const connections = await this.connectionsService.getReceivedConnections(); - if (connections[0]) { - [, result] = connections; - } - return result; - } -} diff --git a/apps/connection-manager/src/connections/dto/block.dto.ts b/apps/connection-manager/src/connections/dto/block.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..71c86182d55ab22acbab1a617cefc187e3215380 --- /dev/null +++ b/apps/connection-manager/src/connections/dto/block.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class BlockParams { + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: 'The connection ID or DID', + example: '8d74c6ec-fa3e-4a09-91fb-5fd0062da835', + }) + public idOrDid: string; +} diff --git a/apps/connection-manager/src/connections/dto/get-by-id.dto.ts b/apps/connection-manager/src/connections/dto/get-by-id.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..a1b8bc9ed494ff4add226e81dfa3b590fc4a8bc8 --- /dev/null +++ b/apps/connection-manager/src/connections/dto/get-by-id.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class GetByIdParams { + @IsString() + @IsNotEmpty() + @ApiProperty({ + description: 'The connection ID', + example: '71b784a3', + }) + public connectionId: string; +} diff --git a/apps/connection-manager/src/connections/entities/AcceptConnectionInvitationBody.ts b/apps/connection-manager/src/connections/entities/AcceptConnectionInvitationBody.ts deleted file mode 100644 index 57c85fbcfbc19cfd07fb4e332477e550d93f12fe..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/entities/AcceptConnectionInvitationBody.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export default class AcceptConnectionInvitationBody { - @ApiProperty() - public invitationUrl: string; - - @ApiProperty() - public autoAcceptConnection: boolean; -} diff --git a/apps/connection-manager/src/connections/entities/InvitationDto.entity.ts b/apps/connection-manager/src/connections/entities/InvitationDto.entity.ts deleted file mode 100644 index b10c4a25d36b67150e5945ad6c2b5be786877b95..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/entities/InvitationDto.entity.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { IsString } from 'class-validator'; - -export default class InvitationDTO { - @IsString() - public serviceEndpoint?: string; - - @IsString() - public ['@type']?: string; - - @IsString() - public ['@id']?: string; - - @IsString() - public label?: string; - - @IsString() - public recipientKeys?: [string]; - - @IsString() - public routingKeys?: []; -} diff --git a/apps/connection-manager/src/connections/entities/connectionCreateInvitationDto.entity.ts b/apps/connection-manager/src/connections/entities/connectionCreateInvitationDto.entity.ts deleted file mode 100644 index 1f41f25d874c5ffaf3e1e1895f8d2d0ef5c6ed43..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/entities/connectionCreateInvitationDto.entity.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsString } from 'class-validator'; - -export default class ConnectionCreateInvitationDto { - @IsString() - @ApiProperty() - public autoAcceptConnection?: boolean; - - @IsString() - @ApiProperty() - public alias?: string; - - @IsString() - @ApiProperty() - public myLabel?: string; - - @IsString() - @ApiProperty() - public myImageUrl?: string; -} diff --git a/apps/connection-manager/src/connections/entities/connectionStateDto.entity.ts b/apps/connection-manager/src/connections/entities/connectionStateDto.entity.ts deleted file mode 100644 index d6380acfc8932838589ef7c421b7aa3e2a93972e..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/entities/connectionStateDto.entity.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { IsBooleanString, IsNotEmpty, IsString } from 'class-validator'; - -import InvitationDTO from './InvitationDto.entity.js'; - -export default class ConnectionStateDto { - @IsString() - public _tags?: string; - - @IsString() - public metadata?: string; - - @IsString() - public didDoc?: string; - - @IsString() - public verkey?: string; - - @IsString() - public createdAt?: string; - - @IsString() - @IsNotEmpty() - public role: string; - - @IsString() - @IsNotEmpty() - public state: string; - - @IsString() - @IsNotEmpty() - public id: string; - - @IsString() - @IsNotEmpty() - public did: string; - - @IsString() - public theirDid: string; - - @IsString() - public theirLabel: string; - - @IsString() - public invitation: InvitationDTO; - - @IsString() - public alias: string; - - @IsBooleanString() - public multiUseInvitation?: boolean; -} diff --git a/apps/connection-manager/src/connections/entities/connectionSubscribeEndPoint.entity.ts b/apps/connection-manager/src/connections/entities/connectionSubscribeEndPoint.entity.ts deleted file mode 100644 index cbd2454ba268faef6abbda1ac8d57e37c45315ef..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/entities/connectionSubscribeEndPoint.entity.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IsString, IsNotEmpty } from 'class-validator'; - -export default class ConnectionSubscriptionEndpointDto { - @IsString() - @IsNotEmpty() - public connectionId: string; - - @IsString() - @IsNotEmpty() - public status: string; -} diff --git a/apps/connection-manager/src/connections/entities/entity.ts b/apps/connection-manager/src/connections/entities/entity.ts deleted file mode 100644 index a683edac6e7491eb269e0db1a7c4e27658a58950..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/entities/entity.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { IsString, IsNotEmpty, IsDate, IsBoolean } from 'class-validator'; - -import InvitationDTO from './InvitationDto.entity.js'; - -export default class ConnectionDto { - @IsString() - public id?: string; - - @IsDate() - public connectionDate?: Date; - - @IsDate() - public createdDate?: Date; - - @IsDate() - public updatedDate?: Date; - - @IsString() - @IsNotEmpty() - public participantDid: string; - - @IsString() - @IsNotEmpty() - public status: string; - - @IsString() - @IsNotEmpty() - public connectionId: string; - - @IsString() - public theirDid: string; - - @IsString() - public theirLabel: string; - - @IsBoolean() - public isReceived: boolean; - - @IsString() - public invitation?: InvitationDTO; -} diff --git a/apps/connection-manager/src/connections/module.spec.ts b/apps/connection-manager/src/connections/module.spec.ts deleted file mode 100644 index 0964656b5eaf8968ceab4b7c3c782580a7db4715..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/module.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import ConnectionsModule from './module'; - -describe('Check if the module is working', () => { - it('should be defined', () => { - expect(ConnectionsModule).toBeDefined(); - }); -}); diff --git a/apps/connection-manager/src/connections/module.ts b/apps/connection-manager/src/connections/module.ts deleted file mode 100644 index 21f11842c57d08c00806beb9e8d3a16959169bb9..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { HttpModule } from '@nestjs/axios'; -import { Module } from '@nestjs/common'; -import { ClientsModule, Transport } from '@nestjs/microservices'; - -import NatsClientService from '../client/nats.client.js'; -import RestClientService from '../client/rest.client.js'; -import { NATSServices } from '../common/constants.js'; -import config from '../config/config.js'; -import PrismaService from '../prisma/prisma.service.js'; - -import ConnectionsController from './controller/controller.js'; -import ConnectionsService from './services/service.js'; - -@Module({ - imports: [ - HttpModule, - ClientsModule.register([ - { - name: NATSServices.SERVICE_NAME, - transport: Transport.NATS, - options: { - servers: [config().nats.url as string], - }, - }, - ]), - ], - controllers: [ConnectionsController], - providers: [ - ConnectionsService, - PrismaService, - NatsClientService, - RestClientService, - ], -}) -export default class ConnectionsModule {} diff --git a/apps/connection-manager/src/connections/repository/connection.repository.ts b/apps/connection-manager/src/connections/repository/connection.repository.ts deleted file mode 100644 index f1cfb5855cef1c0eb6c50cb5e010706241fd3953..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/repository/connection.repository.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { Prisma } from '@prisma/client'; - -import { Injectable } from '@nestjs/common'; - -import PrismaService from '../../prisma/prisma.service.js'; - -@Injectable() -export default class ConnectionRepository { - public constructor(private readonly prismaService: PrismaService) {} - - public async createConnection(data: Prisma.ConnectionCreateInput) { - return this.prismaService.connection.create({ data }); - } - - public async createShortUrl(connectionUrl: string) { - return this.prismaService.shortUrlConnection.create({ - data: { connectionUrl }, - }); - } - - public async getShortUrl(id: string) { - return this.prismaService.shortUrlConnection.findUnique({ - where: { id }, - }); - } - - public async updateConnection(params: { - where: Prisma.ConnectionWhereUniqueInput; - data: Prisma.ConnectionUpdateInput; - }) { - const { where, data } = params; - - return this.prismaService.connection.update({ - data, - where, - }); - } - - public async updateManyConnection(params: { - where: Prisma.ConnectionWhereInput; - data: Prisma.ConnectionUpdateInput; - }) { - const { where, data } = params; - - return this.prismaService.connection.updateMany({ - data, - where, - }); - } - - public async findConnections(params: { - skip?: number; - take?: number; - cursor?: Prisma.ConnectionWhereUniqueInput; - where?: Prisma.ConnectionWhereInput; - orderBy?: Prisma.ConnectionOrderByWithRelationInput; - select?: Prisma.ConnectionSelect; - }) { - const { skip, take, cursor, where, orderBy, select } = params; - - if (where) { - where.isActive = true; - } - - return this.prismaService.$transaction([ - this.prismaService.connection.count({ where }), - this.prismaService.connection.findMany({ - skip, - take, - cursor, - where, - orderBy, - select, - }), - ]); - } - - public async findUniqueConnection(params: { - where: Prisma.ConnectionWhereUniqueInput; - }) { - const { where } = params; - - return this.prismaService.connection.findUnique({ - where, - }); - } - - public findByConnectionId(connectionId: string) { - const query = { where: { connectionId } }; - return this.findUniqueConnection(query); - } - - public findByConnectionByParticipantDID(participantDid: string) { - const query = { where: { participantDid } }; - return this.findUniqueConnection(query); - } -} diff --git a/apps/connection-manager/src/connections/scheduler/scheduler.service.ts b/apps/connection-manager/src/connections/scheduler/scheduler.service.ts deleted file mode 100644 index 69492c4bdf3ad1b4ff546383620b669844b311d9..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/scheduler/scheduler.service.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { - Controller, - Injectable, - InternalServerErrorException, -} from '@nestjs/common'; -import { Cron, CronExpression } from '@nestjs/schedule'; - -import ConfigClient from '../../client/config.client.js'; -import PrismaService from '../../prisma/prisma.service.js'; -import logger from '../../utils/logger.js'; -import ConnectionRepository from '../repository/connection.repository.js'; -import ConnectionsService from '../services/service.js'; - -@Injectable() -@Controller() -export default class SchedulerService { - private connectionRepository; - - public constructor(private readonly prismaService: PrismaService) { - this.connectionRepository = new ConnectionRepository(this.prismaService); - } - - @Cron(CronExpression.EVERY_30_SECONDS) - public async expireNonCompleteConnection() { - const compareDateTime = ConfigClient.getConnectionExpire(); - if (compareDateTime) { - const checkExpireTillDateTime = ConfigClient.checkExpireTill(); - - const query = { - where: { - AND: [ - { - OR: [ - { - status: ConnectionsService.status.INVITED, - }, - { - status: ConnectionsService.status.REQUESTED, - }, - { - status: ConnectionsService.status.RESPONDED, - }, - ], - }, - { - isActive: true, - }, - { - createdDate: { - lt: compareDateTime, - ...(checkExpireTillDateTime && { gt: checkExpireTillDateTime }), - }, - }, - ], - }, - data: { - isActive: false, - }, - }; - const result = - await this.connectionRepository.updateManyConnection(query); - logger.info(JSON.stringify(result)); - } else { - throw new InternalServerErrorException( - 'Connection Expire period is mandatory', - ); - } - } - - @Cron(CronExpression.EVERY_30_SECONDS) - public async expireNonTrustedConnection() { - const compareDateTime = ConfigClient.getConnectionExpire(); - if (compareDateTime) { - const checkExpireTillDateTime = ConfigClient.checkExpireTill(); - - const query = { - where: { - AND: [ - { - status: ConnectionsService.status.COMPLETE, - }, - { - isActive: true, - }, - { - createdDate: { - lt: compareDateTime, - ...(checkExpireTillDateTime && { gt: checkExpireTillDateTime }), - }, - }, - ], - }, - data: { - isActive: false, - }, - }; - const result = - await this.connectionRepository.updateManyConnection(query); - logger.info(JSON.stringify(result)); - } else { - throw new InternalServerErrorException( - 'Connection Expire period is mandatory', - ); - } - } -} diff --git a/apps/connection-manager/src/connections/services/service.spec.ts b/apps/connection-manager/src/connections/services/service.spec.ts deleted file mode 100644 index ac71026624bf3ec13cdb6f9d72dfb9dc8d12ce0e..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/services/service.spec.ts +++ /dev/null @@ -1,469 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type ConnectionDto from '../entities/entity.js'; -import type { TestingModule } from '@nestjs/testing'; - -import { HttpModule } from '@nestjs/axios'; -import { ConfigModule } from '@nestjs/config'; -import { ClientsModule, Transport } from '@nestjs/microservices'; -import { Test } from '@nestjs/testing'; - -import NatsClientService from '../../client/nats.client.js'; -import RestClientService from '../../client/rest.client.js'; -import { NATSServices } from '../../common/constants.js'; -import PrismaService from '../../prisma/prisma.service.js'; - -import ConnectionsService from './service.js'; - -describe('ConnectionsService', () => { - let service: ConnectionsService; - let prismaService: PrismaService; - let restClientService: RestClientService; - let natsClient: NatsClientService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - imports: [ - ConfigModule, - HttpModule, - ClientsModule.register([ - { - name: NATSServices.SERVICE_NAME, - transport: Transport.NATS, - }, - ]), - ], - providers: [ - ConnectionsService, - PrismaService, - NatsClientService, - RestClientService, - ], - exports: [PrismaService], - }).compile(); - prismaService = module.get<PrismaService>(PrismaService); - service = module.get<ConnectionsService>(ConnectionsService); - restClientService = module.get<RestClientService>(RestClientService); - natsClient = module.get<NatsClientService>(NatsClientService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); - - describe('find Connection function', () => { - it('find connection by connection Id', async () => { - const repositoryResult: any = { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }; - - const result: any = { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }; - - jest - .spyOn(prismaService.connection, 'findUnique') - .mockResolvedValueOnce(repositoryResult); - - const res: any = await service.findConnections( - NaN, - -1, - false, - '', - '7b821264-2ae3-4459-b45f-19fa975d91f7', - ); - - expect(res).toStrictEqual(result); - }); - - it('find connection by participant DID', async () => { - const repositoryResult: any = { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }; - - const result: any = { - id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', - status: 'trusted', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-18T11:03:58.099Z', - updatedDate: '2022-04-18T11:05:10.004Z', - isActive: true, - }; - - jest - .spyOn(prismaService.connection, 'findUnique') - .mockResolvedValueOnce(repositoryResult); - - const res: any = await service.findConnections( - NaN, - -1, - '', - '', - 'SU1SHqQiDcc6gDvqH8wwYF', - ); - - expect(res).toStrictEqual(result); - }); - - it('find connection by participant id', async () => { - const repositoryResult: any = [ - 3, - [ - { - id: '977c7cd6-a1af-4a5a-bd51-03758d8db50f', - connectionId: '19694476-cc8e-42a3-a5ea-0b2503133348', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'invited', - participantDid: 'UVE8wxzGEYGjTWWcudc2nB', - theirDid: '', - theirLabel: '', - createdDate: '2022-04-22T12:15:59.365Z', - updatedDate: '2022-04-22T12:15:59.365Z', - isActive: true, - }, - { - id: 'a453d1ae-f95d-4485-8a1a-3c4347450537', - connectionId: '24fcc8b7-3cfa-4d46-a14a-9b6297e81d7e', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'trusted', - participantDid: '3X5jtG9CJFgsDFyXjUDRNp', - theirDid: 'Us8ZgUGXZ5P7GTF8q5NEgh', - theirLabel: 'tango@vomoto.com', - createdDate: '2022-04-22T12:18:42.273Z', - updatedDate: '2022-04-22T12:23:09.183Z', - isActive: true, - }, - { - id: 'ccde23e4-5a21-44d8-a90b-beeba526d5f4', - connectionId: 'ff468f45-7fe8-4964-abb4-d2dd90b6aed3', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'responded', - participantDid: 'WYcecJk6ZbWvoF2VD9xTey', - theirDid: '3NigtUWR68H3HPQiuwgfEk', - theirLabel: 'arnold@vomoto.com', - createdDate: '2022-04-22T12:16:03.614Z', - updatedDate: '2022-04-22T12:16:56.132Z', - isActive: true, - }, - ], - ]; - - const result: any = [ - 3, - [ - { - id: '977c7cd6-a1af-4a5a-bd51-03758d8db50f', - connectionId: '19694476-cc8e-42a3-a5ea-0b2503133348', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'invited', - participantDid: 'UVE8wxzGEYGjTWWcudc2nB', - theirDid: '', - theirLabel: '', - createdDate: '2022-04-22T12:15:59.365Z', - updatedDate: '2022-04-22T12:15:59.365Z', - isActive: true, - }, - { - id: 'a453d1ae-f95d-4485-8a1a-3c4347450537', - connectionId: '24fcc8b7-3cfa-4d46-a14a-9b6297e81d7e', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'trusted', - participantDid: '3X5jtG9CJFgsDFyXjUDRNp', - theirDid: 'Us8ZgUGXZ5P7GTF8q5NEgh', - theirLabel: 'tango@vomoto.com', - createdDate: '2022-04-22T12:18:42.273Z', - updatedDate: '2022-04-22T12:23:09.183Z', - isActive: true, - }, - { - id: 'ccde23e4-5a21-44d8-a90b-beeba526d5f4', - connectionId: 'ff468f45-7fe8-4964-abb4-d2dd90b6aed3', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'responded', - participantDid: 'WYcecJk6ZbWvoF2VD9xTey', - theirDid: '3NigtUWR68H3HPQiuwgfEk', - theirLabel: 'arnold@vomoto.com', - createdDate: '2022-04-22T12:16:03.614Z', - updatedDate: '2022-04-22T12:16:56.132Z', - isActive: true, - }, - ], - ]; - - jest - .spyOn(prismaService, '$transaction') - .mockResolvedValueOnce(repositoryResult); - - const res: any = await service.findConnections(NaN, -1, '', '', ''); - - expect(res).toStrictEqual(result); - }); - - it.skip('find connections by participant Id and status', async () => { - const repositoryResult = [ - 3, - [ - { - id: '977c7cd6-a1af-4a5a-bd51-03758d8db50f', - connectionId: '19694476-cc8e-42a3-a5ea-0b2503133348', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'invited', - participantDid: 'UVE8wxzGEYGjTWWcudc2nB', - theirDid: '', - theirLabel: '', - createdDate: '2022-04-22T12:15:59.365Z', - updatedDate: '2022-04-22T12:15:59.365Z', - isActive: true, - }, - { - id: 'a453d1ae-f95d-4485-8a1a-3c4347450537', - connectionId: '24fcc8b7-3cfa-4d46-a14a-9b6297e81d7e', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'trusted', - participantDid: '3X5jtG9CJFgsDFyXjUDRNp', - theirDid: 'Us8ZgUGXZ5P7GTF8q5NEgh', - theirLabel: 'tango@vomoto.com', - createdDate: '2022-04-22T12:18:42.273Z', - updatedDate: '2022-04-22T12:23:09.183Z', - isActive: true, - }, - { - id: 'ccde23e4-5a21-44d8-a90b-beeba526d5f4', - connectionId: 'ff468f45-7fe8-4964-abb4-d2dd90b6aed3', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'responded', - participantDid: 'WYcecJk6ZbWvoF2VD9xTey', - theirDid: '3NigtUWR68H3HPQiuwgfEk', - theirLabel: 'arnold@vomoto.com', - createdDate: '2022-04-22T12:16:03.614Z', - updatedDate: '2022-04-22T12:16:56.132Z', - isActive: true, - }, - ], - ]; - - const result = [ - 3, - [ - { - id: '977c7cd6-a1af-4a5a-bd51-03758d8db50f', - connectionId: '19694476-cc8e-42a3-a5ea-0b2503133348', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'invited', - participantDid: 'UVE8wxzGEYGjTWWcudc2nB', - theirDid: '', - theirLabel: '', - createdDate: '2022-04-22T12:15:59.365Z', - updatedDate: '2022-04-22T12:15:59.365Z', - isActive: true, - }, - { - id: 'a453d1ae-f95d-4485-8a1a-3c4347450537', - connectionId: '24fcc8b7-3cfa-4d46-a14a-9b6297e81d7e', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'trusted', - participantDid: '3X5jtG9CJFgsDFyXjUDRNp', - theirDid: 'Us8ZgUGXZ5P7GTF8q5NEgh', - theirLabel: 'tango@vomoto.com', - createdDate: '2022-04-22T12:18:42.273Z', - updatedDate: '2022-04-22T12:23:09.183Z', - isActive: true, - }, - { - id: 'ccde23e4-5a21-44d8-a90b-beeba526d5f4', - connectionId: 'ff468f45-7fe8-4964-abb4-d2dd90b6aed3', - participantId: '13f412e2-2749-462a-a10a-54f25e326641', - status: 'responded', - participantDid: 'WYcecJk6ZbWvoF2VD9xTey', - theirDid: '3NigtUWR68H3HPQiuwgfEk', - theirLabel: 'arnold@vomoto.com', - createdDate: '2022-04-22T12:16:03.614Z', - updatedDate: '2022-04-22T12:16:56.132Z', - isActive: true, - }, - ], - ]; - - jest - .spyOn(prismaService, '$transaction') - .mockResolvedValueOnce(repositoryResult); - - const res = await service.findConnections( - -1, - -1, - 'trusted,complete,responded,invited', - undefined, - '13f412e2-2749-462a-a10a-54f25e326641', - ); - - expect(res).toStrictEqual(result); - }); - }); - - describe.skip('create invitation', () => { - it('Create invitation-> member flow', async () => { - const serviceResult: any = { - invitationUrl: - 'http://localhost:4005?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiYWMzYjE0NjktY2Y0Ni00M2ZjLWE4M2EtZGNmZjJjMDA1YjRlIiwibGFiZWwiOiJ0ZWNobmljYV9jb3JwIiwicmVjaXBpZW50S2V5cyI6WyI1bml1NWZmZmVnYkZlS2F3bU5OblRBTEpzaHB1cXpjRm5CUGpBOFFWU2dtWCJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwNSIsInJvdXRpbmdLZXlzIjpbXX0', - invitation: { - '@type': - 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', - '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', - label: 'technica_corp', - recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], - serviceEndpoint: 'http://localhost:4005', - routingKeys: [], - }, - connection: { - _tags: {}, - metadata: {}, - id: 'c1d73d9e-6988-4c84-9ebc-068c265d2fb6', - createdAt: '2022-04-21T10:52:18.161Z', - did: '9nYw7CSdHPqXf6ayfA7Wo2', - didDoc: { - '@context': 'https://w3id.org/did/v1', - publicKey: [ - { - id: '9nYw7CSdHPqXf6ayfA7Wo2#1', - controller: '9nYw7CSdHPqXf6ayfA7Wo2', - type: 'Ed25519VerificationKey2018', - publicKeyBase58: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', - }, - ], - service: [ - { - id: '9nYw7CSdHPqXf6ayfA7Wo2#In7780cd24-af13-423e-b1ff-ae944ab6fd71dyAgentService', - serviceEndpoint: 'http://localhost:4005', - type: 'IndyAgent', - priority: 0, - recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], - routingKeys: [], - }, - ], - authentication: [ - { - publicKey: '9nYw7CSdHPqXf6ayfA7Wo2#1', - type: 'Ed25519SignatureAuthentication2018', - }, - ], - id: '9nYw7CSdHPqXf6ayfA7Wo2', - }, - verkey: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', - state: 'invited', - role: 'inviter', - alias: 'member', - autoAcceptConnection: true, - invitation: { - '@type': 'https://didcomm.org/connections/1.0/invitation', - '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', - label: 'technica_corp', - recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], - serviceEndpoint: 'http://localhost:4005', - routingKeys: [], - }, - multiUseInvitation: false, - }, - }; - - const agent: any = { - status: 200, - message: 'Agent Data', - data: { - service_endpoint: 'agent URL', - }, - }; - - const result = serviceResult; - - jest - .spyOn(natsClient, 'getAgentByParticipantId') - .mockResolvedValueOnce(agent); - - jest - .spyOn(restClientService, 'post') - .mockResolvedValueOnce(serviceResult); - - const res = await service.createInvitationURL( - { autoAcceptConnection: true, alias: 'member' }, - 'participantId', - ); - - expect(res).toStrictEqual(result); - }); - }); - - describe.skip('Create connection', () => { - it('should create', async () => { - const connectionObj: ConnectionDto = { - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - status: 'complete', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - }; - - const agent: any = { - status: 200, - message: 'Agent Data', - data: { - service_endpoint: 'agent URL', - }, - }; - - const repositoryResult: any = { - id: '52d499e0-f76a-4b25-9c2a-f357bf6b73be', - connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', - participantId: '', - status: 'complete', - participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', - theirDid: 'Ax9xMqE89F9LStfGnTpDzg', - theirLabel: 'sagar@getnada.com', - createdDate: '2022-04-27T06:55:01.643Z', - updatedDate: '2022-04-27T06:55:01.643Z', - isActive: true, - }; - - const result = repositoryResult; - - jest.spyOn(natsClient, 'getAgentByURL').mockResolvedValueOnce(agent); - - jest - .spyOn(prismaService.connection, 'create') - .mockResolvedValueOnce(repositoryResult); - - const res = await service.createConnections(connectionObj); - - expect(res).toStrictEqual(result); - }); - }); -}); diff --git a/apps/connection-manager/src/connections/services/service.ts b/apps/connection-manager/src/connections/services/service.ts deleted file mode 100644 index 1bfe8a484a07dd695ff57dfa141410f2c18fe5af..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/connections/services/service.ts +++ /dev/null @@ -1,266 +0,0 @@ -import type ConnectionCreateInvitationDto from '../entities/connectionCreateInvitationDto.entity.js'; -import type ConnectionSubscriptionEndpointDto from '../entities/connectionSubscribeEndPoint.entity.js'; -import type ConnectionDto from '../entities/entity.js'; -import type { Connection, Prisma } from '@prisma/client'; - -import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; - -import NatsClientService from '../../client/nats.client.js'; -import RestClientService from '../../client/rest.client.js'; -import PrismaService from '../../prisma/prisma.service.js'; -import logger from '../../utils/logger.js'; -import pagination from '../../utils/pagination.js'; -import ConnectionRepository from '../repository/connection.repository.js'; - -@Injectable() -export default class ConnectionsService { - private connectionRepository: ConnectionRepository; - - public constructor( - private readonly prismaService: PrismaService, - private readonly natsClient: NatsClientService, - private readonly restClient: RestClientService, - private readonly configService: ConfigService, - ) { - this.connectionRepository = new ConnectionRepository(this.prismaService); - } - - public static readonly connectionAlias = { - MEMBER: 'member', - SUBSCRIBER: 'subscriber', - TRUST: 'trust', - }; - - public static readonly status = { - DEFAULT: 'invited', - INVITED: 'invited', - REQUESTED: 'requested', - RESPONDED: 'responded', - COMPLETE: 'complete', - TRUSTED: 'trusted', - }; - - public static readonly roles = { - INVITER: 'inviter', - INVITEE: 'invitee', - }; - - public async createConnections(connection: ConnectionDto) { - logger.info( - `connection service create connection connection?.invitation?.serviceEndpoint is ${connection?.invitation?.serviceEndpoint}`, - ); - const insertData = { - ...connection, - }; - delete insertData.invitation; - return this.connectionRepository.createConnection({ - ...insertData, - }); - } - - public async sendConnectionStatusToPrincipal( - status: string, - connectionId: string, - theirLabel: string, - participantDID: string, - theirDid: string, - ) { - try { - const response = - await this.natsClient.sendConnectionStatusPrincipalManager( - status, - connectionId, - theirLabel, - participantDID, - theirDid, - ); - return response; - } catch (error: unknown) { - logger.error(String(error)); - return error; - } - } - - public async sendMembershipProofRequestToProofManager(connectionId: string) { - try { - const response = - await this.natsClient.sendMembershipProofRequestToProofManager( - connectionId, - ); - return response; - } catch (error: unknown) { - logger.error(String(error)); - return error; - } - } - - public async updateStatusByConnectionId(connection: ConnectionDto) { - return this.connectionRepository.updateConnection({ - where: { connectionId: connection.connectionId }, - data: { - status: connection.status, - theirDid: connection.theirDid, - theirLabel: connection.theirLabel, - updatedDate: new Date(), - }, - }); - } - - public getConnectionByID(connectionId: string) { - return this.connectionRepository.findByConnectionId(connectionId); - } - - public getAgentUrl() { - return this.configService.get('agent'); - } - - public getAppUrl() { - return this.configService.get('APP_URL'); - } - - public async findConnections( - pageSize: number, - page: number, - status: string | false, - connectionId = '', - participantDid = '', - ) { - let query: { - skip?: number; - take?: number; - cursor?: Prisma.ConnectionWhereUniqueInput; - where?: Prisma.ConnectionWhereInput; - orderBy?: Prisma.ConnectionOrderByWithRelationInput; - } = {}; - - if (connectionId) { - return this.connectionRepository.findByConnectionId(connectionId); - } - - if (participantDid) { - return this.connectionRepository.findByConnectionByParticipantDID( - participantDid, - ); - } - - if (status) { - const statuses: string[] = status.split(','); - query.where = { status: { in: statuses } }; - } - - query = { ...query, ...pagination(pageSize, page) }; - - return this.connectionRepository.findConnections(query); - } - - public async createInvitationURL( - connectionCreate: ConnectionCreateInvitationDto, - ) { - const { agentUrl } = this.getAgentUrl(); - const appUrl = this.getAppUrl(); - const responseData = await this.restClient.post( - `${agentUrl}/connections/create-invitation`, - connectionCreate, - ); - - const shortRow = await this.connectionRepository.createShortUrl( - responseData.invitationUrl, - ); - responseData.invitationUrlShort = `${appUrl}/v1/url/${shortRow.id}`; - return responseData; - } - - public async findConnectionByShortUrlId(id: string) { - return this.connectionRepository.getShortUrl(id); - } - - public async getConnectionInformationRequest(connectionId = '', did = '') { - try { - let connectionDetails: Connection | null = null; - - if (connectionId) { - connectionDetails = - await this.connectionRepository.findByConnectionId(connectionId); - } - - if (did && !connectionDetails) { - connectionDetails = - await this.connectionRepository.findByConnectionByParticipantDID(did); - } - - if (!connectionDetails) { - return null; - } - - const response = { - issueCredentials: [], - presentProofs: [], - }; - - const issueCredentials = await this.natsClient.getIssueCredentials( - connectionDetails.connectionId, - ); - - if ( - issueCredentials && - Array.isArray(issueCredentials) && - !!issueCredentials[1] - ) { - const [, issueCredentialsArr] = issueCredentials; - response.issueCredentials = issueCredentialsArr; - } - - const presentProofs = await this.natsClient.getPresentProofs( - connectionDetails.connectionId, - ); - - if (presentProofs && Array.isArray(presentProofs) && !!presentProofs[1]) { - const [, presentProofsArr] = presentProofs; - response.presentProofs = presentProofsArr; - } - - return response; - } catch (error) { - logger.error(JSON.stringify(error)); - return error; - } - } - - public async makeConnectionTrusted(connectionId: string) { - return this.connectionRepository.updateConnection({ - where: { connectionId }, - data: { - status: ConnectionsService.status.TRUSTED, - updatedDate: new Date(), - }, - }); - } - - public publishConnectionSubscriberEndpoint( - data: ConnectionSubscriptionEndpointDto, - ) { - this.natsClient.publishConnection(data); - } - - public async acceptConnectionInvitation( - agentURL: string, - payload: { - invitationUrl: string; - autoAcceptConnection: boolean; - alias: string; - }, - ) { - return this.restClient.post( - `${agentURL}/connections/receive-invitation-url`, - payload, - ); - } - - public async getReceivedConnections() { - return this.connectionRepository.findConnections({ - where: { isReceived: true }, - select: { connectionId: true }, - }); - } -} diff --git a/apps/connection-manager/src/health/health.controller.ts b/apps/connection-manager/src/health/health.controller.ts deleted file mode 100644 index d298ca31b48f7cde89bea7fb2b6d7a602efce3e9..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/health/health.controller.ts +++ /dev/null @@ -1,42 +0,0 @@ -import type ResponseType from '../common/response.js'; - -import { Controller, Get, HttpStatus, Version } from '@nestjs/common'; -import { ApiOperation, ApiResponse } from '@nestjs/swagger'; - -@Controller('health') -export default class HealthController { - private res: ResponseType; - - @Version(['1']) - @Get() - @ApiOperation({ - summary: 'Health check', - description: - 'This call provides the capability to check the service is working and up. The call returns 200 Status Code and current server time in json body', - }) - @ApiResponse({ - status: HttpStatus.OK, - description: 'Service is up and running.', - content: { - 'application/json': { - schema: {}, - examples: { - 'Service is up and running.': { - value: { - statusCode: 200, - message: - 'Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time)', - }, - }, - }, - }, - }, - }) - public getHealth() { - this.res = { - statusCode: HttpStatus.OK, - message: `${new Date()}`, - }; - return this.res; - } -} diff --git a/apps/connection-manager/src/health/health.spec.ts b/apps/connection-manager/src/health/health.spec.ts deleted file mode 100644 index 05fa6793a33e70fdc56daf6d485ea6d1f02a0d64..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/health/health.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { TestingModule } from '@nestjs/testing'; - -import { HttpStatus } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; - -import HealthController from './health.controller'; - -describe('Health', () => { - let healthController: HealthController; - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - imports: [], - controllers: [HealthController], - providers: [], - }).compile(); - healthController = module.get<HealthController>(HealthController); - }); - it('should be defined', () => { - expect(healthController).toBeDefined(); - }); - - it('should call getHealth', () => { - const response = healthController.getHealth(); - expect(response.statusCode).toBe(HttpStatus.OK); - }); -}); diff --git a/apps/connection-manager/src/invitations/__tests__/invitations.controller.spec.ts b/apps/connection-manager/src/invitations/__tests__/invitations.controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6acb10a2648402fbd8acfa3f31f26482f1c4fe3 --- /dev/null +++ b/apps/connection-manager/src/invitations/__tests__/invitations.controller.spec.ts @@ -0,0 +1,88 @@ +import type { TestingModule } from '@nestjs/testing'; +import type { + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsReceiveInvitationFromUrl, +} from '@ocm/shared'; + +import { Test } from '@nestjs/testing'; +import { Subject, of, takeUntil } from 'rxjs'; + +import { NATS_CLIENT } from '../../common/constants.js'; +import { InvitationsController } from '../invitations.controller.js'; +import { InvitationsService } from '../invitations.service.js'; + +describe('InvitationsController', () => { + const natsClientMock = {}; + + let controller: InvitationsController; + let service: InvitationsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [InvitationsController], + providers: [ + { provide: NATS_CLIENT, useValue: natsClientMock }, + InvitationsService, + ], + }).compile(); + + controller = module.get<InvitationsController>(InvitationsController); + service = module.get<InvitationsService>(InvitationsService); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + describe('create', () => { + it('should return an invitation', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const expectedResult: EventDidcommConnectionsCreateInvitation['data'] = { + invitationUrl: 'https://example.com/invitation', + }; + + jest + .spyOn(service, 'createInvitation') + .mockReturnValue(of(expectedResult)); + + controller + .createInvitation({ tenantId }) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); + + describe('receive', () => { + it('should return a connection', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const invitationUrl = 'https://example.com/invitation'; + const expectedResult = + {} as EventDidcommConnectionsReceiveInvitationFromUrl['data']; + + jest + .spyOn(service, 'receiveInvitationFromURL') + .mockReturnValue(of(expectedResult)); + + controller + .receiveInvitation({ tenantId }, { invitationUrl }) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); +}); diff --git a/apps/connection-manager/src/invitations/__tests__/invitations.module.spec.ts b/apps/connection-manager/src/invitations/__tests__/invitations.module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..46c9ad7bf650eb50f732bc895a356edb15e83e1a --- /dev/null +++ b/apps/connection-manager/src/invitations/__tests__/invitations.module.spec.ts @@ -0,0 +1,37 @@ +import { ClientsModule } from '@nestjs/microservices'; +import { Test } from '@nestjs/testing'; + +import { NATS_CLIENT } from '../../common/constants.js'; +import { InvitationsController } from '../invitations.controller.js'; +import { InvitationsModule } from '../invitations.module.js'; +import { InvitationsService } from '../invitations.service.js'; + +describe('InvitationsModule', () => { + let invitationsService: InvitationsService; + let invitationsController: InvitationsController; + + beforeEach(async () => { + const moduleRef = await Test.createTestingModule({ + imports: [ + ClientsModule.registerAsync({ + isGlobal: true, + clients: [{ name: NATS_CLIENT, useFactory: () => ({}) }], + }), + InvitationsModule, + ], + }).compile(); + + invitationsService = moduleRef.get<InvitationsService>(InvitationsService); + invitationsController = moduleRef.get<InvitationsController>( + InvitationsController, + ); + }); + + it('should be defined', () => { + expect(invitationsService).toBeDefined(); + expect(invitationsService).toBeInstanceOf(InvitationsService); + + expect(invitationsController).toBeDefined(); + expect(invitationsController).toBeInstanceOf(InvitationsController); + }); +}); diff --git a/apps/connection-manager/src/invitations/__tests__/invitations.service.spec.ts b/apps/connection-manager/src/invitations/__tests__/invitations.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5adb78954776ba16c16d91af856be359b2bb576 --- /dev/null +++ b/apps/connection-manager/src/invitations/__tests__/invitations.service.spec.ts @@ -0,0 +1,108 @@ +import type { ClientProxy } from '@nestjs/microservices'; +import type { TestingModule } from '@nestjs/testing'; + +import { Test } from '@nestjs/testing'; +import { + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsReceiveInvitationFromUrl, +} from '@ocm/shared'; +import { Subject, of, takeUntil } from 'rxjs'; + +import { NATS_CLIENT } from '../../common/constants.js'; +import { InvitationsService } from '../invitations.service.js'; + +describe('InvitationsService', () => { + let service: InvitationsService; + let natsClient: ClientProxy; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + InvitationsService, + { + provide: NATS_CLIENT, + useValue: { + send: jest.fn(), + }, + }, + ], + }).compile(); + + service = module.get<InvitationsService>(InvitationsService); + natsClient = module.get<ClientProxy>(NATS_CLIENT); + }); + + describe('createInvitation', () => { + it('should return an invitation', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const expectedResult: EventDidcommConnectionsCreateInvitation['data'] = { + invitationUrl: 'https://example.com/invitation', + }; + + jest + .spyOn(natsClient, 'send') + .mockReturnValue( + of( + new EventDidcommConnectionsCreateInvitation( + expectedResult, + tenantId, + ), + ), + ); + + service + .createInvitation(tenantId) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(natsClient.send).toHaveBeenCalledWith( + EventDidcommConnectionsCreateInvitation.token, + { tenantId }, + ); + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); + + describe('receiveInvitationFromURL', () => { + it('should return a connection', (done) => { + const unsubscribe$ = new Subject<void>(); + const tenantId = 'exampleTenantId'; + const invitationUrl = 'https://example.com/invitation'; + const expectedResult = + {} as EventDidcommConnectionsReceiveInvitationFromUrl['data']; + + jest + .spyOn(natsClient, 'send') + .mockReturnValue( + of( + new EventDidcommConnectionsReceiveInvitationFromUrl( + expectedResult, + tenantId, + ), + ), + ); + + service + .receiveInvitationFromURL(tenantId, invitationUrl) + .pipe(takeUntil(unsubscribe$)) + .subscribe((result) => { + expect(natsClient.send).toHaveBeenCalledWith( + EventDidcommConnectionsReceiveInvitationFromUrl.token, + { tenantId, invitationUrl }, + ); + expect(result).toStrictEqual(expectedResult); + + unsubscribe$.next(); + unsubscribe$.complete(); + + done(); + }); + }); + }); +}); diff --git a/apps/connection-manager/src/invitations/dto/receive-invitation.dto.ts b/apps/connection-manager/src/invitations/dto/receive-invitation.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..24fd1d8236271011b53c27e9938fba9a7633a372 --- /dev/null +++ b/apps/connection-manager/src/invitations/dto/receive-invitation.dto.ts @@ -0,0 +1,13 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString, IsUrl } from 'class-validator'; + +export class ReceiveInvitationPayload { + @IsString() + @IsNotEmpty() + @IsUrl({ require_tld: false }) + @ApiProperty({ + description: 'The invitation URL to receive', + example: 'https://example.com/invitation', + }) + public invitationUrl: string; +} diff --git a/apps/connection-manager/src/invitations/invitations.controller.ts b/apps/connection-manager/src/invitations/invitations.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..278810cb6ca0f007b918743427fbeadbe25b4846 --- /dev/null +++ b/apps/connection-manager/src/invitations/invitations.controller.ts @@ -0,0 +1,158 @@ +import { + Body, + Controller, + HttpStatus, + Post, + Query, + UseInterceptors, + UsePipes, + ValidationPipe, +} from '@nestjs/common'; +import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { MultitenancyParams, ResponseFormatInterceptor } from '@ocm/shared'; + +import { ReceiveInvitationPayload } from './dto/receive-invitation.dto.js'; +import { InvitationsService } from './invitations.service.js'; + +@Controller() +@UsePipes(new ValidationPipe({ transform: true, whitelist: true })) +@UseInterceptors(ResponseFormatInterceptor) +@ApiTags('Invitations') +export class InvitationsController { + public constructor(private readonly service: InvitationsService) {} + + @Post() + @ApiOperation({ + summary: 'Create a new invitation', + description: 'This call creates a new invitation for a given tenant', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Invitation created successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Invitation created successfully': { + value: { + statusCode: 200, + message: 'Invitation created successfully', + data: { + invitationUrl: 'https://example.com/invitation', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Tenant not found', + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Failed to create invitation', + content: { + 'application/json': { + schema: {}, + examples: { + 'Failed to create invitation': { + value: { + statusCode: 500, + message: 'Failed to create invitation', + data: null, + }, + }, + }, + }, + }, + }) + public createInvitation( + @Query() { tenantId }: MultitenancyParams, + ): ReturnType<InvitationsService['createInvitation']> { + return this.service.createInvitation(tenantId); + } + + @Post('receive') + @ApiOperation({ + summary: 'Receive an invitation', + description: 'This call receives an invitation for a given tenant', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Invitation received successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Invitation received successfully': { + value: { + statusCode: 200, + message: 'Invitation received successfully', + data: { + connectionId: '123', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Tenant not found', + content: { + 'application/json': { + schema: {}, + examples: { + 'Tenant not found': { + value: { + statusCode: 404, + message: 'Tenant not found', + data: null, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Failed to receive invitation', + content: { + 'application/json': { + schema: {}, + examples: { + 'Failed to receive invitation': { + value: { + statusCode: 500, + message: 'Failed to receive invitation', + data: null, + }, + }, + }, + }, + }, + }) + public receiveInvitation( + @Query() { tenantId }: MultitenancyParams, + @Body() { invitationUrl }: ReceiveInvitationPayload, + ): ReturnType<InvitationsService['receiveInvitationFromURL']> { + return this.service.receiveInvitationFromURL(tenantId, invitationUrl); + } +} diff --git a/apps/connection-manager/src/invitations/invitations.module.ts b/apps/connection-manager/src/invitations/invitations.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..880695c86fce67603c70827935d775ecc737276c --- /dev/null +++ b/apps/connection-manager/src/invitations/invitations.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; + +import { InvitationsController } from './invitations.controller.js'; +import { InvitationsService } from './invitations.service.js'; + +@Module({ + providers: [InvitationsService], + controllers: [InvitationsController], +}) +export class InvitationsModule {} diff --git a/apps/connection-manager/src/invitations/invitations.service.ts b/apps/connection-manager/src/invitations/invitations.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..6ece9eb63ca54396434bcc58171696b1fec52ffc --- /dev/null +++ b/apps/connection-manager/src/invitations/invitations.service.ts @@ -0,0 +1,48 @@ +import type { + EventDidcommConnectionsCreateInvitationInput, + EventDidcommConnectionsReceiveInvitationFromUrlInput, +} from '@ocm/shared'; +import type { Observable } from 'rxjs'; + +import { Inject, Injectable } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsReceiveInvitationFromUrl, +} from '@ocm/shared'; +import { map } from 'rxjs'; + +import { NATS_CLIENT } from '../common/constants.js'; + +@Injectable() +export class InvitationsService { + public constructor( + @Inject(NATS_CLIENT) private readonly natsClient: ClientProxy, + ) {} + + public createInvitation( + tenantId: string, + ): Observable<EventDidcommConnectionsCreateInvitation['data']> { + return this.natsClient + .send< + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsCreateInvitationInput + >(EventDidcommConnectionsCreateInvitation.token, { tenantId }) + .pipe(map(({ data }) => data)); + } + + public receiveInvitationFromURL( + tenantId: string, + invitationUrl: string, + ): Observable<EventDidcommConnectionsReceiveInvitationFromUrl['data']> { + return this.natsClient + .send< + EventDidcommConnectionsReceiveInvitationFromUrl, + EventDidcommConnectionsReceiveInvitationFromUrlInput + >(EventDidcommConnectionsReceiveInvitationFromUrl.token, { + tenantId, + invitationUrl, + }) + .pipe(map(({ data }) => data)); + } +} diff --git a/apps/connection-manager/src/main.ts b/apps/connection-manager/src/main.ts index 9049f6299b80a17cb1d9893aef477c8158db6b9d..0490cd5aea0c873d02557512dec0a7022426aa87 100644 --- a/apps/connection-manager/src/main.ts +++ b/apps/connection-manager/src/main.ts @@ -1,16 +1,15 @@ +/* c8 ignore start */ import type { MicroserviceOptions } from '@nestjs/microservices'; import { VersioningType } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; -import { HttpAdapterHost, NestFactory } from '@nestjs/core'; +import { NestFactory } from '@nestjs/core'; import { Transport } from '@nestjs/microservices'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; -import AppModule from './app.module.js'; -import AllExceptionsFilter from './utils/exceptionsFilter.js'; -import logger from './utils/logger.js'; +import { Application } from './application.js'; -const app = await NestFactory.create(AppModule); +const app = await NestFactory.create(Application); const configService = app.get(ConfigService); app.enableCors(); @@ -22,15 +21,14 @@ app.connectMicroservice<MicroserviceOptions>({ }); app.enableVersioning({ - defaultVersion: ['1', '2'], + defaultVersion: ['1'], type: VersioningType.URI, }); const swaggerConfig = new DocumentBuilder() - .setTitle('Gaia-x Connection Manager API') + .setTitle('Gaia-X Connection Manager API') .setDescription('API documentation for GAIA-X Connection Manager') .setVersion('1.0') - .addServer(`http://localhost:${configService.get('PORT')}`) .build(); const document = SwaggerModule.createDocument(app, swaggerConfig); @@ -38,9 +36,5 @@ const document = SwaggerModule.createDocument(app, swaggerConfig); SwaggerModule.setup('/swagger', app, document); await app.startAllMicroservices(); -const httpAdapter = app.get(HttpAdapterHost); -app.useGlobalFilters(new AllExceptionsFilter(httpAdapter)); - -await app.listen(configService.get('PORT') || 3000, () => { - logger.info(`Listening on Port:${configService.get('PORT')}` || 3000); -}); +await app.listen(configService.get('http.port') as number); +/* c8 ignore stop */ diff --git a/apps/connection-manager/src/middleware/auth.middleware.ts b/apps/connection-manager/src/middleware/auth.middleware.ts deleted file mode 100644 index 40549bfd6bb55ef9f200f7a427ac0c5d06c50cee..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/middleware/auth.middleware.ts +++ /dev/null @@ -1,86 +0,0 @@ -import type { NestMiddleware } from '@nestjs/common'; -import type { NextFunction, Request, Response } from 'express'; - -import { HttpStatus, Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import jwt from 'jsonwebtoken'; -import jwksClient from 'jwks-rsa'; - -import logger from '../utils/logger.js'; - -@Injectable() -export class AuthMiddleware implements NestMiddleware { - public constructor(private readonly configService: ConfigService) {} - - /* eslint-disable */ - async use(req: Request, res: Response, next: NextFunction) { - if (this.configService.get('auth.useAuth') === 'false') { - return next(); - } - - logger.info('Request at middleware'); - - const authHeader = req.headers.authorization; - const authToken = authHeader && authHeader.split(' ')[1]; - - if (!authToken) { - logger.error('No access token provided.'); - res.json({ - status: HttpStatus.UNAUTHORIZED, - message: 'Unauthorized. No Access token provided.', - data: undefined, - }); - return; - } - - const getKey = ( - header: jwt.JwtHeader, - callback: jwt.SigningKeyCallback, - ): void => { - const jwksUri = this.configService.get('auth.tokenUrl') || ''; - const client = jwksClient({ jwksUri, timeout: 30000 }); - - client - .getSigningKey(header.kid) - .then((key) => callback(null, key.getPublicKey())) - .catch(callback); - }; - - function verify(token: string): Promise<any> | undefined { - return new Promise( - (resolve: (decoded: any) => void, reject: (error: Error) => void) => { - const verifyCallback: jwt.VerifyCallback<jwt.JwtPayload | string> = ( - error: jwt.VerifyErrors | null, - decoded: any, - ): void => { - if (error) { - return reject(error); - } - return resolve(decoded); - }; - - jwt.verify(token, getKey, verifyCallback); - }, - ); - } - - const result = await verify(authToken); - - if (!result) { - logger.error('Invalid access token provided.'); - res.json({ - status: HttpStatus.UNAUTHORIZED, - message: 'Unauthorized. Invalid Access token provided.', - data: undefined, - }); - return; - } - - next(); - } - /* eslint-enable */ -} - -export default { - AuthMiddleware, -}; diff --git a/apps/connection-manager/src/prisma/prisma.module.spec.ts b/apps/connection-manager/src/prisma/prisma.module.spec.ts deleted file mode 100644 index 1f7b6e316cbe74f441a2b5328ec3e24f2edf5da1..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/prisma/prisma.module.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import PrismaModule from './prisma.module.js'; - -describe('Check if the module is working', () => { - it('should be defined', () => { - expect(PrismaModule).toBeDefined(); - }); -}); diff --git a/apps/connection-manager/src/prisma/prisma.module.ts b/apps/connection-manager/src/prisma/prisma.module.ts deleted file mode 100644 index c0d718cbaa670c814fbd4cb308450928e6146563..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/prisma/prisma.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; - -import PrismaService from './prisma.service.js'; - -@Module({ - providers: [PrismaService], - exports: [PrismaService], -}) -export default class PrismaModule {} diff --git a/apps/connection-manager/src/prisma/prisma.service.ts b/apps/connection-manager/src/prisma/prisma.service.ts deleted file mode 100644 index b27f2bfb34a97ca4d9e37ad58782e1b53f710d20..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/prisma/prisma.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { OnModuleDestroy, OnModuleInit } from '@nestjs/common'; - -import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import { PrismaClient } from '@prisma/client'; - -@Injectable() -export default class PrismaService - extends PrismaClient - implements OnModuleInit, OnModuleDestroy -{ - public constructor(private configService: ConfigService) { - super({ - datasources: { - db: { - url: configService.get('DATABASE_URL'), - }, - }, - }); - } - - public async onModuleInit() { - await this.$connect(); - } - - public async onModuleDestroy() { - await this.$disconnect(); - } -} diff --git a/apps/connection-manager/src/prisma/schema.prisma b/apps/connection-manager/src/prisma/schema.prisma deleted file mode 100644 index 58c5c2d7c5ae4baa1e426a7268ed2752bde9725f..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/prisma/schema.prisma +++ /dev/null @@ -1,26 +0,0 @@ -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -model Connection { - id String @id @default(uuid()) - connectionId String @unique @map("connection_id") - status String - participantDid String @unique @map("participant_did") - theirDid String @map("their_did") - theirLabel String @map("their_label") - createdDate DateTime @default(now()) @map("created_date") - updatedDate DateTime @default(now()) @map("updated_date") - isActive Boolean @default(true) @map("is_active") - isReceived Boolean @map("is_received") -} - -model ShortUrlConnection { - id String @id @default(uuid()) - connectionUrl String -} diff --git a/apps/connection-manager/src/utils/exceptionsFilter.ts b/apps/connection-manager/src/utils/exceptionsFilter.ts deleted file mode 100644 index 196efcabd241b3a03e30f88b6c01660a76a1b073..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/utils/exceptionsFilter.ts +++ /dev/null @@ -1,82 +0,0 @@ -import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common'; -import type { Request } from 'express'; - -import { Catch, HttpException, HttpStatus, Logger } from '@nestjs/common'; -import { HttpAdapterHost } from '@nestjs/core'; -import { Prisma } from '@prisma/client'; - -const { PrismaClientKnownRequestError, PrismaClientValidationError } = Prisma; - -@Catch() -export default class AllExceptionsFilter implements ExceptionFilter { - public constructor(private readonly httpAdapterHost: HttpAdapterHost) {} - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public catch(exception: any, host: ArgumentsHost): void { - const { httpAdapter } = this.httpAdapterHost; - - const ctx = host.switchToHttp(); - const request = ctx.getRequest<Request>(); - - let httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; - let message = ''; - switch (exception.constructor) { - case HttpException: - httpStatus = (exception as HttpException).getStatus(); - message = exception?.message || 'Internal server error'; - break; - case PrismaClientKnownRequestError: - switch (exception.code) { - case 'P2002': // Unique constraint failed on the {constraint} - case 'P2000': // The provided value for the column is too long for the column's type. Column: {column_name} - case 'P2001': // The record searched for in the where condition ({model_name}.{argument_name} = {argument_value}) does not exist - case 'P2005': // The value {field_value} stored in the database for the field {field_name} is invalid for the field's type - case 'P2006': // The provided value {field_value} for {model_name} field {field_name} is not valid - case 'P2010': // Raw query failed. Code: {code}. Message: {message} - case 'P2011': // Null constraint violation on the {constraint} - case 'P2017': // The records for relation {relation_name} between the {parent_name} and {child_name} models are not connected. - case 'P2021': // The table {table} does not exist in the current database. - case 'P2022': // The column {column} does not exist in the current database. - httpStatus = HttpStatus.BAD_REQUEST; - message = exception?.message; - break; - case 'P2018': // The required connected records were not found. {details} - case 'P2025': // An operation failed because it depends on one or more records that were required but not found. {cause} - case 'P2015': // A related record could not be found. {details} - httpStatus = HttpStatus.NOT_FOUND; - message = exception?.message; - break; - default: - httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; - message = exception?.message || 'Internal server error'; - } - break; - case PrismaClientValidationError: - httpStatus = HttpStatus.BAD_REQUEST; - message = exception?.message; - break; - default: - httpStatus = - exception.response?.status || HttpStatus.INTERNAL_SERVER_ERROR; - message = - exception.response?.data?.message || - exception?.message || - 'Internal server error'; - } - - Logger.error( - 'Exception Filter :', - message, - (exception as Error).stack, - `${request.method} ${request.url}`, - ); - - const responseBody = { - statusCode: httpStatus, - timestamp: new Date().toISOString(), - message, - }; - - httpAdapter.reply(ctx.getResponse(), responseBody, httpStatus); - } -} diff --git a/apps/connection-manager/src/utils/logger.spec.ts b/apps/connection-manager/src/utils/logger.spec.ts deleted file mode 100644 index 04293dc347bbb729b0b3721359a41b14dd24fb5c..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/utils/logger.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import fs from 'node:fs'; - -describe('Logger', () => { - it('should create a directory if not exists', async () => { - jest.spyOn(fs, 'existsSync').mockImplementation(() => false); - jest.spyOn(fs, 'mkdirSync').mockImplementation(() => 'mocked'); - const logger = await import('./logger.js'); - expect(logger).toBeDefined(); - expect(fs.existsSync).toHaveBeenCalled(); - expect(fs.mkdirSync).toHaveBeenCalled(); - }); -}); diff --git a/apps/connection-manager/src/utils/logger.ts b/apps/connection-manager/src/utils/logger.ts deleted file mode 100644 index b1958d564a6e6657405384d03400e8485b2bcc43..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/utils/logger.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { Logger } from 'winston'; - -import { ecsFormat } from '@elastic/ecs-winston-format'; -import { createLogger, transports } from 'winston'; - -const logger: Logger = createLogger({ - format: ecsFormat({ convertReqRes: true }), - - transports: [new transports.Console()], -}); - -logger.on('error', (error) => { - // eslint-disable-next-line no-console - console.error('Error in logger caught', error); -}); - -export default logger; diff --git a/apps/connection-manager/src/utils/nats.ts b/apps/connection-manager/src/utils/nats.ts deleted file mode 100644 index 6eede1a7a549399219b2e060172427e7c95708fc..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/utils/nats.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { NatsConnection } from 'nats'; - -import { connect, StringCodec } from 'nats'; - -const sc = StringCodec(); - -export default class Nats { - private static nc: NatsConnection | null = null; - - public static async initialize(natsConfig: { - servers: Array<string> | string; - name: string; - }): Promise<NatsConnection | null> { - this.nc = await connect(natsConfig); - - return this.nc; - } - - public static async publish(subject: string, payload: string) { - if (this.nc) { - this.nc.publish(subject, sc.encode(payload)); - } else { - throw new Error('Initialize Nats First!!'); - } - } - - public static async subscribe( - subject: string, - cb: (...args: unknown[]) => unknown, - ) { - if (this.nc) { - const sub = this.nc.subscribe(subject); - for await (const m of sub) { - cb(sc.decode(m.data)); - } - } else { - throw new Error('Initialize Nats First!!'); - } - } -} diff --git a/apps/connection-manager/src/utils/pagination.spec.ts b/apps/connection-manager/src/utils/pagination.spec.ts deleted file mode 100644 index e517f67bcaeeeae9aaa1b605fbbf8833ad1dbe22..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/utils/pagination.spec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import pagination from './pagination.js'; - -describe('Check if the module is working', () => { - it('should be defined', () => { - expect(pagination).toBeDefined(); - }); - - it('should be return default value', () => { - const result = { skip: 0, take: 1000 }; - expect(pagination(0, 0)).toStrictEqual(result); - }); - - it('should be return next page value', () => { - const result = { skip: 0, take: 10 }; - expect(pagination(10, 0)).toStrictEqual(result); - }); -}); diff --git a/apps/connection-manager/src/utils/pagination.ts b/apps/connection-manager/src/utils/pagination.ts deleted file mode 100644 index a498e614fec4f8f01d731ba9a9c08886f9e93f57..0000000000000000000000000000000000000000 --- a/apps/connection-manager/src/utils/pagination.ts +++ /dev/null @@ -1,16 +0,0 @@ -const pagination = (pageSize: number, page: number) => { - const query: { - skip?: number; - take?: number; - } = {}; - if (pageSize && (page || page === 0)) { - query.skip = page * pageSize; - query.take = pageSize; - } else { - query.skip = 0; - query.take = 1000; - } - return query; -}; - -export default pagination; diff --git a/apps/connection-manager/test/app.e2e-spec.ts b/apps/connection-manager/test/app.e2e-spec.ts deleted file mode 100644 index 071ca4ed95a2f6f19141de5f08fe4f6a546196f9..0000000000000000000000000000000000000000 --- a/apps/connection-manager/test/app.e2e-spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { INestApplication } from '@nestjs/common'; -import type { TestingModule } from '@nestjs/testing'; - -import { afterEach, beforeEach, describe, it } from '@jest/globals'; -import { Test } from '@nestjs/testing'; -import request from 'supertest'; - -import AppModule from '../src/app.module.js'; - -describe('AppController (e2e)', () => { - let app: INestApplication; - - beforeEach(async () => { - const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], - }).compile(); - - app = moduleFixture.createNestApplication(); - await app.init(); - }); - - afterEach(async () => { - await app.close(); - }); - - it('/v1/health (GET)', () => - request(app.getHttpServer()).get('/health').expect(200)); -}); diff --git a/apps/connection-manager/test/jest.config.js b/apps/connection-manager/test/jest.config.js deleted file mode 100644 index c2b3ddf9bf2a2231e63f8b040213ce5ffcbb9412..0000000000000000000000000000000000000000 --- a/apps/connection-manager/test/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('jest').Config} */ - -import config from '../jest.config.js'; - -export default { - ...config, - rootDir: '.', - testRegex: '.*\\.e2e-spec\\.ts$', -}; diff --git a/apps/shared/package.json b/apps/shared/package.json index e9859f1cd59257d427dae0e9d8e89a29c8b7fa23..a25a26e1bcb02d6da4a10db498c9619daebc15a8 100644 --- a/apps/shared/package.json +++ b/apps/shared/package.json @@ -26,11 +26,11 @@ "@aries-framework/tenants": "^0.4.2", "@elastic/ecs-winston-format": "^1.5.0", "@nestjs/axios": "^3.0.1", - "@nestjs/common": "^10.2.10", + "@nestjs/common": "^10.3.0", "@nestjs/config": "^3.1.1", - "@nestjs/microservices": "^10.2.10", - "@nestjs/swagger": "^7.1.16", - "@nestjs/terminus": "^10.1.1", + "@nestjs/microservices": "^10.3.0", + "@nestjs/swagger": "^7.1.17", + "@nestjs/terminus": "^10.2.0", "axios": "^1.6.2", "joi": "^17.11.0", "class-transformer": "^0.5.1", @@ -41,7 +41,7 @@ }, "devDependencies": { "@nestjs/cli": "^10.2.1", - "@nestjs/testing": "^10.2.10", + "@nestjs/testing": "^10.3.0", "@types/jest": "^29.5.9", "@types/node": "^20.9.3", "rimraf": "^5.0.5", @@ -49,6 +49,6 @@ "ts-jest": "^29.1.1", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", - "typescript": "^5.3.2" + "typescript": "^5.3.3" } } diff --git a/apps/shared/src/events/__tests__/didEvents.spec.ts b/apps/shared/src/events/__tests__/didEvents.spec.ts index 8776ea77515d531272414dcfebb3c742255890fc..abd678744068de7b62e03bd03bd3fcc0691923cc 100644 --- a/apps/shared/src/events/__tests__/didEvents.spec.ts +++ b/apps/shared/src/events/__tests__/didEvents.spec.ts @@ -1,22 +1,12 @@ import { DidDocument } from '@aries-framework/core'; -import { EventDidsPublicDid, EventDidsResolve } from '../didEvents.js'; +import { EventDidsResolve } from '../didEvents.js'; describe('Did Events', () => { it('should return module', () => { jest.requireActual('../didEvents'); }); - it.skip('should create get public did event', () => { - const doc = new DidDocument({ id: 'did:web:123.com' }); - const event = new EventDidsPublicDid(doc, 'tenantId'); - - expect(typeof event.id).toStrictEqual('string'); - expect(event.type).toStrictEqual('EventDidsPublicDid'); - expect(event.timestamp).toBeInstanceOf(Date); - expect(event.instance).toMatchObject(doc); - }); - it('should create did resolve event', () => { const doc = new DidDocument({ id: 'did:my:id' }); const event = new EventDidsResolve(doc, 'tenantId'); diff --git a/apps/shared/src/events/connectionEvents.ts b/apps/shared/src/events/connectionEvents.ts index a9ae32a9e47c061241b343cb004db41703b03f83..166f6cdd8cd9f7a53aebd365c37ec6d302aa4dac 100644 --- a/apps/shared/src/events/connectionEvents.ts +++ b/apps/shared/src/events/connectionEvents.ts @@ -48,6 +48,51 @@ export class EventDidcommConnectionsGetById extends BaseEvent<ConnectionRecord | } } +export type EventDidcommConnectionsCreateInvitationInput = BaseEventInput; +export class EventDidcommConnectionsCreateInvitation extends BaseEvent<{ + invitationUrl: string; +}> { + public static token = 'didcomm.connections.createInvitation'; + + public get instance() { + return this.data; + } + + public static fromEvent(e: EventDidcommConnectionsCreateInvitation) { + return new EventDidcommConnectionsCreateInvitation( + e.data, + e.tenantId, + e.id, + e.type, + e.timestamp, + ); + } +} + +export type EventDidcommConnectionsReceiveInvitationFromUrlInput = + BaseEventInput<{ + invitationUrl: string; + }>; +export class EventDidcommConnectionsReceiveInvitationFromUrl extends BaseEvent<ConnectionRecord | null> { + public static token = 'didcomm.connections.receiveInvitationFromUrl'; + + public get instance() { + return this.data + ? JsonTransformer.fromJSON(this.data, ConnectionRecord) + : null; + } + + public static fromEvent(e: EventDidcommConnectionsReceiveInvitationFromUrl) { + return new EventDidcommConnectionsReceiveInvitationFromUrl( + e.data, + e.tenantId, + e.id, + e.type, + e.timestamp, + ); + } +} + export type EventDidcommConnectionsCreateWithSelfInput = BaseEventInput; export class EventDidcommConnectionsCreateWithSelf extends BaseEvent<ConnectionRecord> { public static token = 'didcomm.connections.createWithSelf'; diff --git a/apps/ssi-abstraction/src/agent/connections/connections.controller.ts b/apps/ssi-abstraction/src/agent/connections/connections.controller.ts index 4f04f50d6352bdf72ce7359ad7d29d8b7d96769a..8b59f12e9c8cf97917058de9f7dc29b9d524f90b 100644 --- a/apps/ssi-abstraction/src/agent/connections/connections.controller.ts +++ b/apps/ssi-abstraction/src/agent/connections/connections.controller.ts @@ -9,6 +9,10 @@ import { EventDidcommConnectionsGetByIdInput, EventDidcommConnectionsCreateWithSelfInput, EventDidcommConnectionsBlockInput, + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsCreateInvitationInput, + EventDidcommConnectionsReceiveInvitationFromUrl, + EventDidcommConnectionsReceiveInvitationFromUrlInput, } from '@ocm/shared'; import { ConnectionsService } from './connections.service.js'; @@ -37,6 +41,26 @@ export class ConnectionsController { ); } + @MessagePattern(EventDidcommConnectionsCreateInvitation.token) + public async createInvitation( + options: EventDidcommConnectionsCreateInvitationInput, + ): Promise<EventDidcommConnectionsCreateInvitation> { + return new EventDidcommConnectionsCreateInvitation( + await this.connectionsService.createInvitation(options), + options.tenantId, + ); + } + + @MessagePattern(EventDidcommConnectionsReceiveInvitationFromUrl.token) + public async receiveInvitationFromUrl( + options: EventDidcommConnectionsReceiveInvitationFromUrlInput, + ): Promise<EventDidcommConnectionsReceiveInvitationFromUrl> { + return new EventDidcommConnectionsReceiveInvitationFromUrl( + await this.connectionsService.receiveInvitationFromUrl(options), + options.tenantId, + ); + } + @MessagePattern(EventDidcommConnectionsCreateWithSelf.token) public async createConnectionWithSelf( options: EventDidcommConnectionsCreateWithSelfInput, diff --git a/apps/ssi-abstraction/src/agent/connections/connections.module.ts b/apps/ssi-abstraction/src/agent/connections/connections.module.ts index edee4f45a63a1731c0bf23487a1028f8f5dae183..0689f1a4ea6545be547e375109a3d8d49bcd5129 100644 --- a/apps/ssi-abstraction/src/agent/connections/connections.module.ts +++ b/apps/ssi-abstraction/src/agent/connections/connections.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; import { AgentModule } from '../agent.module.js'; @@ -6,7 +7,7 @@ import { ConnectionsController } from './connections.controller.js'; import { ConnectionsService } from './connections.service.js'; @Module({ - imports: [AgentModule], + imports: [AgentModule, ConfigModule], providers: [ConnectionsService], controllers: [ConnectionsController], }) diff --git a/apps/ssi-abstraction/src/agent/connections/connections.service.ts b/apps/ssi-abstraction/src/agent/connections/connections.service.ts index 2e2b3c975f3feca342a34176c29625110cff7c93..620b916110476727711ebdb77ec18c2bb116815a 100644 --- a/apps/ssi-abstraction/src/agent/connections/connections.service.ts +++ b/apps/ssi-abstraction/src/agent/connections/connections.service.ts @@ -5,9 +5,11 @@ import type { } from '@aries-framework/core'; import type { EventDidcommConnectionsBlockInput, + EventDidcommConnectionsCreateInvitationInput, EventDidcommConnectionsCreateWithSelfInput, EventDidcommConnectionsGetAllInput, EventDidcommConnectionsGetByIdInput, + EventDidcommConnectionsReceiveInvitationFromUrlInput, } from '@ocm/shared'; import { @@ -17,6 +19,7 @@ import { } from '@aries-framework/core'; import { isDid } from '@aries-framework/core/build/utils/did.js'; import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; import { MetadataTokens } from '../../common/constants.js'; import { AgentService } from '../agent.service.js'; @@ -29,6 +32,7 @@ export class ConnectionsService { public constructor( agentService: AgentService, private withTenantService: WithTenantService, + private configService: ConfigService, ) { this.agent = agentService.agent; } @@ -84,6 +88,47 @@ export class ConnectionsService { }); } + public async createInvitation({ + tenantId, + }: EventDidcommConnectionsCreateInvitationInput): Promise<{ + invitationUrl: string; + }> { + const host = this.configService.get<string>('agent.host'); + if (!host) { + throw new Error( + 'Could not get the `agentHost` from the config. This is required to create an invitation', + ); + } + + return this.withTenantService.invoke(tenantId, async (t) => { + const { outOfBandInvitation } = await t.oob.createInvitation(); + + return { + invitationUrl: outOfBandInvitation.toUrl({ + domain: host, + }), + }; + }); + } + + public async receiveInvitationFromUrl({ + tenantId, + invitationUrl, + }: EventDidcommConnectionsReceiveInvitationFromUrlInput): Promise<ConnectionRecord> { + return this.withTenantService.invoke(tenantId, async (t) => { + const { connectionRecord } = + await t.oob.receiveInvitationFromUrl(invitationUrl); + + if (!connectionRecord) { + throw new Error( + 'Invitation did not establish a connection. Is it a connection invitation?', + ); + } + + return connectionRecord; + }); + } + public async createConnectionWithSelf({ tenantId, }: EventDidcommConnectionsCreateWithSelfInput): Promise<ConnectionRecord> { diff --git a/apps/ssi-abstraction/test/connections.e2e-spec.ts b/apps/ssi-abstraction/test/connections.e2e-spec.ts index ff9a2e49c28d3baa6f6dc04ff345229b77370b6a..cbda3cafbfbbab328f140e5fd14673dfec87d4f5 100644 --- a/apps/ssi-abstraction/test/connections.e2e-spec.ts +++ b/apps/ssi-abstraction/test/connections.e2e-spec.ts @@ -5,8 +5,11 @@ import type { EventDidcommConnectionsCreateWithSelfInput, EventDidcommConnectionsGetByIdInput, EventDidcommConnectionsBlockInput, + EventDidcommConnectionsReceiveInvitationFromUrlInput, + EventDidcommConnectionsCreateInvitationInput, } from '@ocm/shared'; +import { ConnectionRecord } from '@aries-framework/core'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { Test } from '@nestjs/testing'; import { @@ -14,6 +17,8 @@ import { EventDidcommConnectionsGetAll, EventDidcommConnectionsCreateWithSelf, EventDidcommConnectionsBlock, + EventDidcommConnectionsReceiveInvitationFromUrl, + EventDidcommConnectionsCreateInvitation, } from '@ocm/shared'; import { firstValueFrom } from 'rxjs'; @@ -86,6 +91,53 @@ describe('Connections', () => { expect(eventInstance.instance).toBeNull(); }); + it(EventDidcommConnectionsCreateInvitation.token, async () => { + const response$ = client.send< + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsCreateInvitationInput + >(EventDidcommConnectionsCreateInvitation.token, { + tenantId, + }); + const response = await firstValueFrom(response$); + const eventInstance = + EventDidcommConnectionsCreateInvitation.fromEvent(response); + + expect(eventInstance.instance).toMatchObject({ + invitationUrl: expect.any(String), + }); + }); + + it(EventDidcommConnectionsReceiveInvitationFromUrl.token, async () => { + const createInvitationResponse$ = client.send< + EventDidcommConnectionsCreateInvitation, + EventDidcommConnectionsCreateInvitationInput + >(EventDidcommConnectionsCreateInvitation.token, { + tenantId, + }); + const createInvitationResponse = await firstValueFrom( + createInvitationResponse$, + ); + const createInvitationEventInstance = + EventDidcommConnectionsCreateInvitation.fromEvent( + createInvitationResponse, + ); + + const { invitationUrl } = createInvitationEventInstance.instance; + + const response$ = client.send< + EventDidcommConnectionsReceiveInvitationFromUrl, + EventDidcommConnectionsReceiveInvitationFromUrlInput + >(EventDidcommConnectionsReceiveInvitationFromUrl.token, { + invitationUrl, + tenantId, + }); + const response = await firstValueFrom(response$); + const eventInstance = + EventDidcommConnectionsReceiveInvitationFromUrl.fromEvent(response); + + expect(eventInstance.instance).toBeInstanceOf(ConnectionRecord); + }); + it(EventDidcommConnectionsCreateWithSelf.token, async () => { const response$ = client.send< EventDidcommConnectionsCreateWithSelf, diff --git a/compose/aries-mediator-service/.dockerignore b/compose/aries-mediator-service/.dockerignore deleted file mode 100644 index d91a0796edbb5e167325708ba08a7752e21b4b6d..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -caddy -README.md -docker-compose.yml -.env -.env.sample \ No newline at end of file diff --git a/compose/aries-mediator-service/.env.sample b/compose/aries-mediator-service/.env.sample deleted file mode 100644 index 8b68b0ef2b136c9902e56ce4e89d31fdf5f20e16..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/.env.sample +++ /dev/null @@ -1,5 +0,0 @@ -MEDIATOR_CONTROLLER_ADMIN_API_KEY=insecure-hello-world-1 -MEDIATOR_AGENT_ADMIN_API_KEY=insecure-hello-world-2 -MEDIATOR_ALIAS=MOON -LOG_LEVEL=INFO -MEDIATOR_ENDPOINT_URL=localhost:2015 diff --git a/compose/aries-mediator-service/README.md b/compose/aries-mediator-service/README.md deleted file mode 100644 index f64afa1ae43da8516e5206e0d3181b70a4f9a6e3..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/README.md +++ /dev/null @@ -1,162 +0,0 @@ -# Aries Mediator Service - -## TL;DR - -This repository provides a simple process for a developer to run an Aries mediator agent. You should be able to bring the stack on-line by copying `.env.stample` to `.env` and running `docker-compose up`. For more information, keep reading. - -## Build & Run - -This is setup to be run as is with a simple `docker-compose up`. When run it will fire up the following containers: - -### ngrok - -You need to accept inbound connections. Most of us are behind firewalls or have impermanent IP addresses. Ngrok is used as a proxy to work around this. It will provide the URL that will act as a front door for your wallet to access the mediator service. - -If you have a paid ngrok account you can provide your access token as one of the parameters (via the .env file). If not, leave it blank and it'll assume your on the free plan. - -Pro Tip 🤓 - -- Free plans can only keep a connection open for 60 minutes. After this, you will need to restart the stack. If this gets annoying, use a paid plan for a long lived tunnel :) - -- Every time your restart the stack (all the containers) the URL will change. You may be able to work around this with different paid plans. - -### Caddy - -Your wallet needs to open two connections to the mediator: The first is a standard **https** connection. This will be embedded in the invitation and will be used by the wallet for standard CRUD operations. Once the invite is accepted, a second WebSocket (wss) connection will be opened. This will be the primary mode of communication between the mediator and your wallet. - -Caddy is used to route **http** and **wss** traffic to the correct transport on the mediator. Without it, two ngrok tunnels would need to be started making startup and configuration a little more complicated. - -In any case, I think its more clear and consumable to have a single URL. - -### Mediator Demo Controller - -The mediator is configured to allow it to automatically accept connections. This functionality can be delegated to a controller process if business rules require approval / intervention before accepting a connection. A sample controller to do this is included with the project. - -This custom **nodejs** app, written in TypeScript, uses [Feathers JS](https://feathersjs.com) to provide RESTFull endpoints to ACA-py. To enable the controller and have it determine if connections should be accepted: - -1. Update the mediator configuration - -In the `.env` file override the mediator config environment variable by adding `MEDIATOR_ARG_FILE` as follows: - -``` -MEDIATOR_ARG_FILE=./configs/mediator-with-controller.yml -``` - -2. Enable the mediator service in the docker stack - -Remove these two lines from the [docker-compose.yml](./docker-compose.yml) file in the `mediator-controller` service: - -``` - profiles: - - donotstart -``` - -3. Add the following line to [start.sh](./acapy/start.sh) to allow the mediator to find and use the controller: - -``` - --webhook-url ${MEDIATOR_CONTROLLER_WEBHOOK} -``` - -### Mediator - -A mediator is just a special type of agent. In this case, the mediator is ACA-py, with a few special config params, into make it run as a "mediator" rather than a traditional agent. - -About 1/2 of the params for ACA-py are provided in `start.sh`, others are passed via a configuration file [mediator-auto-accept.yml](./acapy/configs/mediator.yml). Move them around as you see fit. Ones that are likely to change are better kept as environment variables. - -### PostgreSQL - -[PostgreSQL](https://www.postgresql.org) is well known RDBMS. It is used by the mediator persist wallet information. Without it, the wallet would be reset every time the stack is restarted. The first time the mediator container runs it will create a database for its wallet and initialize the wallet state. - -### Run It ! - -0. Put some tunes on, it'll help. Here's one to get you started [Bossa Nova - Take On Me](https://open.spotify.com/track/7rpDM5zKuWaf2VzXFKU3yV?si=6aacebaa532d4848). You should have it up and running before the song is done. - -1. Start by cloning this repo: - -```console -git clone git@github.com:fullboar/aries-mediator-service.git -``` - -2. Copy the file `env.sample` to `.env` in the root of the project. The default values are fine, edit as you see fit. This file will be used by `docker-compose` to add or override any environment variables. - -```console -cp env.sample .env -``` - -Pro Tip 🤓 - -You can generate strong tokens for production with `OpenSSL`: - -```console -openssl rand 32 -hex -``` - -3. Bring up the stack. When you first run this command it will build the mediator container so it may take a few moments. Subsequent restarts will be much faster. - -```console -docker-compose up -``` - -When the stack is on-line you'll see a big white QR code scroll up your screen, just above that is your invitation URL. I'll look something like this: - -```console -mediator_1 | Invitation URL (Connections protocol): -mediator_1 | https://ed49-70-67-240-52.ngrok.io?c_i=eyJAdHlwZSI6ICJkaWQ6c292OkJ6Q2JzTlloTXJqSGlxWkRUVUFTSGc7c3BlYy9jb25uZWN0aW9ucy8xLjAvaW52aXRhdGlvbiIsICJAaWQiOiAiZmYwMjkzNmYtNzYzZC00N2JjLWE2ZmYtMmZjZmI2NmVjNTVmIiwgImxhYmVsIjogIk1lZGlhdG9yIiwgInJlY2lwaWVudEtleXMiOiBbIkFyVzd1NkgxQjRHTGdyRXpmUExQZERNUXlnaEhXZEJTb0d5amRCY0UzS0pEIl0sICJzZXJ2aWNlRW5kcG9pbnQiOiAiaHR0cHM6Ly9lZDQ5LTcwLTY3LTI0MC01Mi5uZ3Jvay5pbyJ9 -``` - -The `c_i` parameter is your reusable invitation encoded as base64. Let's decode it and see what's inside: - -```json -{ - "@type": "did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation", - "@id": "ff02936f-763d-47bc-a6ff-2fcfb66ec55f", - "label": "Mediator", - "recipientKeys": ["ArW7u6H1B4GLgrEzfPLPdDMQyghHWdBSoGyjdBcE3KJD"], - "serviceEndpoint": "https://ed49-70-67-240-52.ngrok.io" -} -``` - -Pro Tip 🤓 - -The invitation will be regenerated every time you restart the docker stack for two important reason: - -1. The `ngrok` URL changes with restarts; and -2. The database is not persistent. This is where wallet initialization data, like [verkey](https://hyperledger.github.io/indy-did-method/) is stored. This will cause the `@id` and `recipientKeys` properties to change in the invitation (`c_i` payload above). - -The general workaround steps are: - -- expose the caddy ports outside of the container; -- start `ngrok` outside of a container and update the MEDIATOR_URL in [start.sh](./acapy/start.sh); -- give postgres a persistent volume; - -### Aries Bifold Wallet Integration - -You can easily use your newly minted mediator with the [Aries Bifold wallet](https://github.com/hyperledger/aries-mobile-agent-react-native). Take the full invitation URL from above and provide it to Bifold through the `MEDIATOR_URL` parameter. This can be in the form of an environment variable or, a more reliable way is to create a `.env` file in the root of the project with the parameter `MEDIATOR_URL` in it like this: - -```console -MEDIATOR_URL=https://ed49-70-67-240-52.ngrok.io?c_i=eyJAdHlwZSI6ICJkaWQ6c292OkJ6Q2JzTlloTXJqSGlxWkRUVUFTSGc7c3BlYy9jb25uZWN0aW9ucy8xLjAvaW52aXRhdGlvbiIsICJAaWQiOiAiZmYwMjkzNmYtNzYzZC00N2JjLWE2ZmYtMmZjZmI2NmVjNTVmIiwgImxhYmVsIjogIk1lZGlhdG9yIiwgInJlY2lwaWVudEtleXMiOiBbIkFyVzd1NkgxQjRHTGdyRXpmUExQZERNUXlnaEhXZEJTb0d5amRCY0UzS0pEIl0sICJzZXJ2aWNlRW5kcG9pbnQiOiAiaHR0cHM6Ly9lZDQ5LTcwLTY3LTI0MC01Mi5uZ3Jvay5pbyJ9 -``` - -## FAQ - -### How does Bifold talk to the Mediator? - -I struggled quite a bit with how HTTP/s and WSS are managed internally. The key, for me, was the `--endpoint` argument in ACA-py. To run a mediator, and maybe other agents, it takes two params for this argument. The first is the HTTP/s endpoint and the second is the `WSS` endpoint. - -The HTTP/s endpoints, as per the docs on this param, will be used for invitations. Its going to be how your wallet finds and opens a dialogue with the mediator. Once a connection is established the WSS endpoint will be how the mediator and your wallet primarily communicated; they will message over the WebSocket. - -### Can I use two URLs rather than one? - -You can use two different URLs and route them to the respective ports on the mediator. It won't care. As per "How does Bifold talk to the Mediator" just make sure the HTTP/s port is the first in the `--endpoint` argument and use `wss://` ad the protocol in the second param even though the URL is the same. - -I've used one URL and setup Caddy to route traffic to the correct port on the mediator. I think this setup is much more clear making it easier to consume and maintain. - -### Are there other ways to manage transports? - -Sure. There is a ACA-py plug-in that will allow it to take both HTTP/s and WSS traffic over a single port. You can find it in the [Plugin Toolbox](https://github.com/hyperledger/aries-acapy-plugin-toolbox) - -My pro-tip is use Caddy. Reverse proxies are a tried and tru technology. - -### Why Caddy? - -I get asked a bit why Caddy? NGINX is great, but I find you need a PhD in NGINX to configure it. Caddy is lightweight and built from the ground up be more effective in cloud (k8s / OpenShift) deployments and has more human friendly config. diff --git a/compose/aries-mediator-service/acapy/Dockerfile.acapy b/compose/aries-mediator-service/acapy/Dockerfile.acapy deleted file mode 100644 index 4c8105d3451edff972c7f78e3a9749915810533d..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/Dockerfile.acapy +++ /dev/null @@ -1,24 +0,0 @@ -FROM bcgovimages/von-image:py36-1.16-1 - -USER root - -RUN mkdir -p /acapy-mediator -WORKDIR /acapy-mediator - -ADD https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 /usr/bin/jq -RUN chmod +x /usr/bin/jq - -USER $user - -COPY acapy/requirements-latest.txt ./ - -RUN pip install -r ./requirements-latest.txt - -# Copy the necessary files from the mediator sub-folder -COPY acapy/start.sh start.sh -RUN chmod +x start.sh -COPY acapy/configs configs - -RUN aca-py --version > ./acapy-version.txt - -ENTRYPOINT ["bash", "./start.sh"] diff --git a/compose/aries-mediator-service/acapy/configs/local.yml b/compose/aries-mediator-service/acapy/configs/local.yml deleted file mode 100644 index 8f553c4e97d5a479af6adbe6970adc68cde3fea7..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/configs/local.yml +++ /dev/null @@ -1,34 +0,0 @@ -# This configuration is good for testing locally. It is not suited for -# production environments for the following reasons: -# -# 1. No persistent storage -# 2. Admin interface is not secured -# 3. Endpoint does not reflect a production endpoint -# 4. "Open mediation," or granting all incoming mediation requests, is enabled - -# General -label: Mediator -endpoint: http://localhost:3000 -inbound-transport: - - [http, 0.0.0.0, 3000] -outbound-transport: http - -# Mediator does not use a ledger -no-ledger: true - -# Admin -admin: [0.0.0.0, 3001] -admin-insecure-mode: true - -# Connections -debug-connections: true -auto-accept-invites: true -auto-accept-requests: true - -# Create and print multi-use invitation -connections-invite: true -invite-multi-use: true - -# Mediation -open-mediation: true -enable-undelivered-queue: true diff --git a/compose/aries-mediator-service/acapy/configs/mediator-auto-accept.yml b/compose/aries-mediator-service/acapy/configs/mediator-auto-accept.yml deleted file mode 100644 index caa6eff781911a50af0a8847bc370b0f016eed3d..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/configs/mediator-auto-accept.yml +++ /dev/null @@ -1,25 +0,0 @@ -# General settings for mediator agent - -# Mediator does not use a ledger -no-ledger: true - -# Wallet -wallet-type: indy -wallet-name: mediator -wallet-key: insecure, for testing purposes only -auto-provision: true - -# Mediation -open-mediation: true -enable-undelivered-queue: true - -# Connections -debug-connections: true -auto-accept-invites: true -auto-accept-requests: true -auto-ping-connection: true - -# Print an admin invite -connections-invite: true -invite-label: 'Mediator' -invite-multi-use: true diff --git a/compose/aries-mediator-service/acapy/configs/mediator-with-controller.yml b/compose/aries-mediator-service/acapy/configs/mediator-with-controller.yml deleted file mode 100644 index afe62367e2e8bd413f7db9d023242eec61c138ca..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/configs/mediator-with-controller.yml +++ /dev/null @@ -1,24 +0,0 @@ -# General settings for mediator agent - -# Mediator does not use a ledger -no-ledger: true - -# Wallet -wallet-type: indy -wallet-name: mediator -wallet-key: insecure, for testing purposes only -auto-provision: true - -# Mediation -open-mediation: true -enable-undelivered-queue: true - -# Connections -debug-connections: true -auto-accept-requests: true -auto-ping-connection: true - -# Print an admin invite -connections-invite: true -invite-label: 'Mediator' -invite-multi-use: true diff --git a/compose/aries-mediator-service/acapy/configs/mediator-with-plugin.yml b/compose/aries-mediator-service/acapy/configs/mediator-with-plugin.yml deleted file mode 100644 index cff780e028b15a41a7028ecf6c1d1391670cb1b2..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/configs/mediator-with-plugin.yml +++ /dev/null @@ -1,62 +0,0 @@ -# General -label: Indicio Mediator -inbound-transport: - - [acapy_plugin_toolbox.http_ws, 0.0.0.0, 3000] -outbound-transport: http -endpoint: http://localhost:3000/ - -# Mediator does not use a ledger -no-ledger: true - -# Wallet -wallet-type: indy -wallet-name: mediator -# TODO: Replace this value with a secret stored outside of this repo -# This can be specified as an environment variable: -# ACAPY_WALLET_KEY=.... -# TODO: Ensure this value matches provision.yml exactly -wallet-key: insecure, for testing purposes only - -# Persistent Storage using postgres -# -# Available Wallet Schemes: -# -# DatabasePerWallet - each wallet has its own database -# MultiWalletSingleTable - all wallets are stored in single table in single -# database. Each wallet has its own connection pool. -# MultiWalletSingleTableSharedPool - all wallets are stored in single table in -# single database. The plugin will create only 1 connection pool reused by all -# wallets. This can be useful if intend to open many different wallets. -# Postgres has by default limitation of ~100 simultaneous connections and using -# this strategy you can limit number of DB connections significantly. -wallet-storage-type: postgres_storage -# TODO: Fill in these values as appropriate -# TODO: Ensure these values match provision.yml exactly -wallet-storage-config: '{"url":"localhost:5432", "wallet_scheme": "DatabasePerWallet"}' -wallet-storage-creds: '{"account":"acapy", "password":"acapy", "admin_account":"acapy", "admin_password":"acapy"}' - -# Admin -# admin: [0.0.0.0, 3001] -# TODO: Replace this value with a secret stored outside of this repo -# This can be specified as an environment variable: -# ACAPY_ADMIN_API_KEY=.... -# admin-api-key: 4QZoBE+lJZRGbWnq8ejL7FgFn9MCTr00OdDlSpNuN+4= - -# Mediation -open-mediation: true -enable-undelivered-queue: true - -# Connections -debug-connections: true -auto-accept-invites: true -auto-accept-requests: true -auto-ping-connection: true - -# Toolbox Plugin -plugin: - - acapy_plugin_toolbox -# Print an admin invite -connections-invite: true -invite-metadata: '{"group": "admin"}' -invite-label: 'Mediator (Admin)' -invite-multi-use: true diff --git a/compose/aries-mediator-service/acapy/configs/provision.yml b/compose/aries-mediator-service/acapy/configs/provision.yml deleted file mode 100644 index 846f61ec955f91c42991867331c8aafa489cd5ea..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/configs/provision.yml +++ /dev/null @@ -1,33 +0,0 @@ -# --label=Proof Mediator --inbound-transport=['acapy_plugin_toolbox.http_ws', '0.0.0.0', 3000] --outbound-transport=http --open-mediation=True --enable-undelivered-queue=True --debug-connections=True --auto-accept-invites=True --auto-accept-requests=True --auto-ping-connection=True --connections-invite=True --invite-metadata={"group": "admin"} --invite-label=Mediator (Admin) --invite-multi-use=True -# General -endpoint: http://localhost:3000/ - -# Mediator does not use a ledger -no-ledger: true - -# Wallet -wallet-type: indy -wallet-name: mediator -# TODO: Replace this value with a secret stored outside of this repo -# This can be specified as an environment variable: -# ACAPY_WALLET_KEY=.... -# TODO: Ensure this value matches provision.yml exactly -wallet-key: insecure, for testing purposes only - -# Persistent Storage using postgres -# -# Available Wallet Schemes: -# -# DatabasePerWallet - each wallet has its own database -# MultiWalletSingleTable - all wallets are stored in single table in single -# database. Each wallet has its own connection pool. -# MultiWalletSingleTableSharedPool - all wallets are stored in single table in -# single database. The plugin will create only 1 connection pool reused by all -# wallets. This can be useful if intend to open many different wallets. -# Postgres has by default limitation of ~100 simultaneous connections and using -# this strategy you can limit number of DB connections significantly. -wallet-storage-type: postgres_storage -# TODO: Fill in these values as appropriate -# TODO: Ensure these values match provision.yml exactly -wallet-storage-config: '{"url":"localhost:5432", "wallet_scheme": "DatabasePerWallet"}' -wallet-storage-creds: '{"account":"acapy", "password":"acapy", "admin_account":"acapy", "admin_password":"acapy"}' diff --git a/compose/aries-mediator-service/acapy/controller/.editorconfig b/compose/aries-mediator-service/acapy/controller/.editorconfig deleted file mode 100644 index e717f5eb6387be229227ad8eba6a56f4cd904ade..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/compose/aries-mediator-service/acapy/controller/.eslintrc.json b/compose/aries-mediator-service/acapy/controller/.eslintrc.json deleted file mode 100644 index 5154dc7495af1c138099de091bf777c3c6044d19..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/.eslintrc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "env": { - "es6": true, - "node": true, - "jest": true - }, - "parserOptions": { - "parser": "@typescript-eslint/parser", - "ecmaVersion": 2018, - "sourceType": "module" - }, - "plugins": ["@typescript-eslint"], - "extends": ["plugin:@typescript-eslint/recommended"], - "rules": { - "indent": ["error", 2, { "SwitchCase": 1 }], - "linebreak-style": ["error", "unix"], - "quotes": ["error", "single", { "avoidEscape": true }], - "semi": ["error", "always"], - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-empty-interface": "off" - } -} diff --git a/compose/aries-mediator-service/acapy/controller/.gitignore b/compose/aries-mediator-service/acapy/controller/.gitignore deleted file mode 100644 index b6c55a1915ec655707b9c75b63d3f541b272a3ee..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/.gitignore +++ /dev/null @@ -1,112 +0,0 @@ -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# Commenting this out is preferred by some people, see -# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- -node_modules - -# Users Environment Variables -.lock-wscript - -# IDEs and editors (shamelessly copied from @angular/cli's .gitignore) -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -### Linux ### -*~ - -# temporary files which can be created if a process still has a handle open of a deleted file -.fuse_hidden* - -# KDE directory preferences -.directory - -# Linux trash folder which might appear on any partition or disk -.Trash-* - -# .nfs files are created when an open file is removed but is still being accessed -.nfs* - -### OSX ### -*.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -ehthumbs.db -ehthumbs_vista.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - -# Others -lib/ -data/ diff --git a/compose/aries-mediator-service/acapy/controller/.prettierrc.json b/compose/aries-mediator-service/acapy/controller/.prettierrc.json deleted file mode 100644 index 544138be45652abc7bc3873341deacd3f4f90c61..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/.prettierrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "singleQuote": true -} diff --git a/compose/aries-mediator-service/acapy/controller/README.md b/compose/aries-mediator-service/acapy/controller/README.md deleted file mode 100644 index 3d7b2e44d9b6fc054310f844e8d11ef9bceae9b6..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# endorser-controller - -> A controller for an instance of Aries Cloud Agent Python mediator agent - -## About - -This project uses [Feathers](http://feathersjs.com). An open source web framework for building modern real-time applications. - -This code is borrowed from the [Aries VCR Issuer Agency/Endorser Controller](https://github.com/bcgov/aries-vcr-issuer-agency/tree/main/endorser) - -## Getting Started - -Getting up and running is as easy as 1, 2, 3. - -1. Make sure you have [NodeJS](https://nodejs.org/) and [npm](https://www.npmjs.com/) installed. -2. Install your dependencies - - ``` - cd path/to/mediator-controller - npm install - ``` - -3. Start your app - - ``` - npm start - ``` - -## Testing - -Simply run `npm test` and all your tests in the `test/` directory will be run. - -## Scaffolding - -Feathers has a powerful command line interface. Here are a few things it can do: - -``` -$ npm install -g @feathersjs/cli # Install Feathers CLI - -$ feathers generate service # Generate a new Service -$ feathers generate hook # Generate a new Hook -$ feathers help # Show all commands -``` - -## Help - -For more information on all the things you can do with Feathers visit [docs.feathersjs.com](http://docs.feathersjs.com). diff --git a/compose/aries-mediator-service/acapy/controller/config/default.json b/compose/aries-mediator-service/acapy/controller/config/default.json deleted file mode 100644 index 0d2058f1f74a2975eb07a7889be52e8535fd388f..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/config/default.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "host": "localhost", - "port": "PORT", - "public": "../public/", - "paginate": { - "default": 10, - "max": 50 - }, - "authentication": { - "adminApiKey": "CONTROLLER_ADMIN_API_KEY" - }, - "agent": { - "adminUrl": "MEDIATOR_ADMIN_URL", - "headers": { - "x-api-key": "MEDIATOR_ADMIN_API_KEY" - }, - "alias": "MEDIATOR_ALIAS" - }, - "logging": { - "logLevel": "LOG_LEVEL" - } -} diff --git a/compose/aries-mediator-service/acapy/controller/config/production.json b/compose/aries-mediator-service/acapy/controller/config/production.json deleted file mode 100644 index 39a4117d72807c5e7547d859add850b5c5b9b4e4..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/config/production.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "host": "mediator-controller-app.feathersjs.com", - "port": "PORT" -} diff --git a/compose/aries-mediator-service/acapy/controller/config/test.json b/compose/aries-mediator-service/acapy/controller/config/test.json deleted file mode 100644 index 0967ef424bce6791893e9a57bb952f80fd536e93..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/config/test.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/compose/aries-mediator-service/acapy/controller/jest.config.js b/compose/aries-mediator-service/acapy/controller/jest.config.js deleted file mode 100644 index ebe914b195cd46dbf4f32c959a2e7a8763f3da27..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - globals: { - 'ts-jest': { - diagnostics: false, - }, - }, -}; diff --git a/compose/aries-mediator-service/acapy/controller/package-lock.json b/compose/aries-mediator-service/acapy/controller/package-lock.json deleted file mode 100644 index 3f39e2e916d1e73a75a276c6dc86ab9dea69b9fc..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/package-lock.json +++ /dev/null @@ -1,6726 +0,0 @@ -{ - "name": "mediator-controller", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", - "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", - "dev": true - }, - "@babel/core": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.0.tgz", - "integrity": "sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.1.tgz", - "integrity": "sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-transforms": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz", - "integrity": "sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", - "dev": true, - "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" - } - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.1.tgz", - "integrity": "sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - } - } - }, - "@babel/traverse": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.0.tgz", - "integrity": "sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.0", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.0", - "@babel/types": "^7.14.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.1.tgz", - "integrity": "sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - }, - "dependencies": { - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - } - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@feathers-plus/batch-loader": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@feathers-plus/batch-loader/-/batch-loader-0.3.6.tgz", - "integrity": "sha512-r+n31iZ/B5Rl1mLkC9/S20UI445MdkZvE3VBmjupep2t8OuyTYHPkFEgR25HY6khH+RothK1VL3B5eumk9N2QQ==" - }, - "@feathersjs/commons": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-4.5.12.tgz", - "integrity": "sha512-ss3yyk8HurmOCSD+wvENIrT9iSa8vg9SmikoP5c9JaLkbtMmKpH88jCjgRl7jiO54f2+UcjW3PqccNgUGSNSDQ==" - }, - "@feathersjs/configuration": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@feathersjs/configuration/-/configuration-4.5.12.tgz", - "integrity": "sha512-9fmEcz/yCB8lpzo3cB5uwiAp7rDzSSxGv+pHh6O5a3ZZoCL/7AZrh7/mZB2fFIBK2yAVE1GNdHkLXJI4OMWDGA==", - "requires": { - "@feathersjs/feathers": "^4.5.12", - "config": "^3.3.6", - "debug": "^4.3.3" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@feathersjs/errors": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-4.5.12.tgz", - "integrity": "sha512-xIQJ7t/acTuL1fTC6mpf0qlcWfJkA9x0rRMrSgjD3mzUnJU6VqxXFxusL8895ksGD0vQHwPueblbm8Hn6Ifqqw==", - "requires": { - "debug": "^4.3.3" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@feathersjs/express": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-4.5.12.tgz", - "integrity": "sha512-ftGbrBHQZ3vXL/Pq9FBGmMZrJLFmNTjUtBA85YZSyChbVhAdmf8teDJc5JSu8sy4ylM8SkP4C9XgXlixehxw+Q==", - "requires": { - "@feathersjs/commons": "^4.5.12", - "@feathersjs/errors": "^4.5.12", - "@types/express": "^4.17.13", - "debug": "^4.3.3", - "express": "^4.17.2", - "lodash": "^4.17.21", - "uberproto": "^2.0.6" - }, - "dependencies": { - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@feathersjs/feathers": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-4.5.12.tgz", - "integrity": "sha512-24bxpMpheBrDmVwwByNPPfXnXk2KkeiW3NvE3xXHbt7QzZj3OrPJ8WS5MqUZMPMFSLMyqlhRKs+hpQgfWhuxrA==", - "requires": { - "@feathersjs/commons": "^4.5.12", - "debug": "^4.3.3", - "events": "^3.3.0", - "uberproto": "^2.0.6" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@feathersjs/primus": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@feathersjs/primus/-/primus-4.5.12.tgz", - "integrity": "sha512-H0vjhAht2j3fmh++3qclNJGcOflStG2CupRlBTazcpKmxlcdn3mlJEm0FW28AhY1bhRo2rGea45q3/n8JSo+Dw==", - "requires": { - "@feathersjs/transport-commons": "^4.5.12", - "debug": "^4.3.3", - "primus": "^8.0.5", - "primus-emitter": "^3.1.1", - "uberproto": "^2.0.6" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@feathersjs/transport-commons": { - "version": "4.5.12", - "resolved": "https://registry.npmjs.org/@feathersjs/transport-commons/-/transport-commons-4.5.12.tgz", - "integrity": "sha512-c/FnP+xzCmfsHGj4NGhHpTy2haaA2jiKZ+du8rUUWBgxC73y3mw7udUGhWdDxGx2mnXtOKCwIA6oPQBdXtFC+A==", - "requires": { - "@feathersjs/commons": "^4.5.12", - "@feathersjs/errors": "^4.5.12", - "debug": "^4.3.3", - "lodash": "^4.17.21", - "radix-router": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - } - }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - } - }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - } - }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/compression": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.2.tgz", - "integrity": "sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", - "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", - "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==" - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" - }, - "@types/serve-favicon": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@types/serve-favicon/-/serve-favicon-2.5.3.tgz", - "integrity": "sha512-HirXLRJjLXzwiSnjhE1vMu55X7+qaY+noXsKqi/7eK1uByl3L6TwkcALZuJnQXqOalMdmBz3b662yXvaR+89Vw==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true - }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "dependencies": { - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - } - } - } - }, - "access-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/access-control/-/access-control-1.0.1.tgz", - "integrity": "sha512-H5aqjkogmFxfaOrfn/e42vyspHVXuJ8er63KuljJXpOyJ1ZO/U5CrHfO8BLKIy2w7mBM02L5quL0vbfQqrGQbA==", - "requires": { - "millisecond": "~0.1.2", - "setheader": "~1.0.0", - "vary": "~1.1.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - }, - "dependencies": { - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "asyncemit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/asyncemit/-/asyncemit-3.0.1.tgz", - "integrity": "sha1-zD4P4No5tTzBXls6qGFupqcr1Zk=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", - "requires": { - "bytes": "3.1.1", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001222", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001222.tgz", - "integrity": "sha512-rPmwUK0YMjfMlZVmH6nVB5U3YJ5Wnx3vmT5lnRO3nIKO8bJ+TRWMbGuuiSugDJqESy/lz+1hSrlQEagCtoOAWQ==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "requires": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "config": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/config/-/config-3.3.7.tgz", - "integrity": "sha512-mX/n7GKDYZMqvvkY6e6oBY49W8wxdmQt+ho/5lhwFDXqQW9gI+Ahp8EKp8VAbISPnmf2+Bv5uZK7lKXZ6pf1aA==", - "requires": { - "json5": "^2.1.1" - } - }, - "connected": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/connected/-/connected-0.0.2.tgz", - "integrity": "sha1-e1dVshbOMf+rzMOOn04d/Bw7fG0=" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "create-server": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/create-server/-/create-server-1.0.2.tgz", - "integrity": "sha512-hie+Kyero+jxt6dwKhLKtN23qSNiMn8mNIEjTjwzaZwH2y4tr4nYloeFrpadqV+ZqV9jQ15t3AKotaK8dOo45w==", - "requires": { - "connected": "~0.0.2" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-gvnlQHwkWTOeSM1iRNEwPcUuUwlhovzbuQzalKrTbcJhI5cvhtkRVZZqomwZt4pCl2dvbsugD6yyu+66rtMy3Q==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0", - "storage-engine": "3.0.x" - }, - "dependencies": { - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - } - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", - "dev": true, - "requires": { - "xtend": "^4.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.727", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", - "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==", - "dev": true - }, - "emits": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emits/-/emits-3.0.0.tgz", - "integrity": "sha1-MnUrupXhcHshlWI4Srm7ix/WL3A=" - }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.x" - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "env-variable": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", - "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - } - }, - "express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.6", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extendible": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/extendible/-/extendible-0.1.1.tgz", - "integrity": "sha1-4qN+2HEp+0+VM+io11BiMKU5yQU=" - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "feathers-hooks-common": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/feathers-hooks-common/-/feathers-hooks-common-5.0.6.tgz", - "integrity": "sha512-XxCPxZxUgKdNRSLAt0l8c/ovA5AmYHrD5LVuDNdawUapm3dLmfSIBex2emHHEaLuyscpiAl9AtkK0+MnqR2Y1g==", - "requires": { - "@feathers-plus/batch-loader": "^0.3.6", - "@feathersjs/commons": "^4.5.11", - "@feathersjs/errors": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "ajv": "^6.12.6", - "debug": "^4.3.1", - "graphql": "^15.5.0", - "lodash": "^4.17.21", - "process": "0.11.10", - "traverse": "^0.6.6" - } - }, - "fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "forwarded-for": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/forwarded-for/-/forwarded-for-1.1.0.tgz", - "integrity": "sha512-1Yam9ht7GyMXMBvuwJfUYqpdtLVodtT5ee5JMBzGiSwVVeh37ZN8LuOWkNHd6ho2zUxpSZCHuQrt1Vjl2AxDNA==" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "fusing": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fusing/-/fusing-1.0.0.tgz", - "integrity": "sha1-VQwV12r5Jld4qgUezkTUAAoJjUU=", - "requires": { - "emits": "3.0.x", - "predefine": "0.1.x" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "helmet": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.6.0.tgz", - "integrity": "sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==" - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz", - "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "dependencies": { - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - } - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - } - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - } - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - } - }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - } - }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - } - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { - "colornames": "^1.1.1" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "logform": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.2.tgz", - "integrity": "sha512-V6JiPThZzTsbVRspNO6TmHkR99oqYTs8fivMBYQkjZj6rxW92KxtDCPE6IkAk1DNBnYKNkjm4jYBm6JDUcyhOA==", - "requires": { - "colors": "1.4.0", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^1.1.0", - "triple-beam": "^1.3.0" - }, - "dependencies": { - "safe-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", - "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" - } - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "millisecond": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/millisecond/-/millisecond-0.1.2.tgz", - "integrity": "sha1-bMWtOGJByrjniv+WT4cCjuyS2sU=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" - }, - "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", - "requires": { - "mime-db": "1.47.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nanoid": { - "version": "3.1.32", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.32.tgz", - "integrity": "sha512-F8mf7R3iT9bvThBoW4tGXhXFHCctyCiUUPrWF8WaTqa3h96d9QybkSeba43XVOOE3oiLfkVDe4bT8MeGmkrTxw==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "predefine": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/predefine/-/predefine-0.1.3.tgz", - "integrity": "sha512-Nq6APFC5OtQRl5TmMk6RlGwl6UOCtEqa+5ZTbKFp6tMw4wdMUa7Rief0UNE3fV5BgQahJ70QmDgeOog8RE9FMw==", - "requires": { - "extendible": "0.1.x" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "primus": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/primus/-/primus-8.0.5.tgz", - "integrity": "sha512-gYCzgtKJ+HFGwj3Im5aNHCNHY2egiQYfZHiw/4OLHshdpBzASIMk0RH5qrKc1SqVWaqA4g9GGJJWMrUgCMDb2A==", - "requires": { - "access-control": "~1.0.0", - "asyncemit": "~3.0.1", - "create-server": "~1.0.1", - "diagnostics": "~2.0.0", - "eventemitter3": "~4.0.0", - "forwarded-for": "~1.1.0", - "fusing": "~1.0.0", - "nanoid": "~3.1.10", - "setheader": "~1.0.2", - "ultron": "~1.1.0" - } - }, - "primus-emitter": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/primus-emitter/-/primus-emitter-3.1.1.tgz", - "integrity": "sha1-qFo2NT/oqWl1vl7f69fuZshNzhs=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "radix-router": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/radix-router/-/radix-router-3.0.1.tgz", - "integrity": "sha512-jpHXHgP+ZmVzEfmZ7WVRSvc/EqMoAqYuMtBsHd9s47Hs9Iy8FDJhkweMrDH0wmdxanLzVIWhq0UpomLXNpW8tg==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", - "requires": { - "bytes": "3.1.1", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safe-stable-stringify": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", - "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-favicon": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", - "requires": { - "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - } - } - }, - "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setheader": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/setheader/-/setheader-1.0.2.tgz", - "integrity": "sha512-A704nIwzqGed0CnJZIqDE+0udMPS839ocgf1R9OJ8aq8vw4U980HWeNaD9ec8VnmBni9lyGEWDedOWXT/C5kxA==", - "requires": { - "diagnostics": "1.x.x" - }, - "dependencies": { - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { - "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" - } - } - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", - "dev": true, - "requires": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "storage-engine": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/storage-engine/-/storage-engine-3.0.7.tgz", - "integrity": "sha512-V/jJykpPdsyDImLwu19syIAWn/Tb41tBDikQS+aQPH2h2OgqdLxwOg7wI9nPH3Y0Mh1ce566JZl2u+4eH1nAsg==", - "requires": { - "enabled": "^2.0.0", - "eventemitter3": "^4.0.0" - }, - "dependencies": { - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - } - } - }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - } - }, - "ts-node-dev": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.8.tgz", - "integrity": "sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg==", - "dev": true, - "requires": { - "chokidar": "^3.5.1", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^9.0.0", - "tsconfig": "^7.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "requires": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true - }, - "uberproto": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-2.0.6.tgz", - "integrity": "sha512-68H97HffZoFaa3HFtpstahWorN9dSp5uTU6jo3GjIQ6JkJBR3hC2Nx/e/HFOoYHdUyT/Z1MRWfxN1EiQJZUyCQ==" - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "winston": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.5.1.tgz", - "integrity": "sha512-tbRtVy+vsSSCLcZq/8nXZaOie/S2tPXPFt4be/Q3vI/WtYwm7rrwidxVw2GRa38FIXcJ1kUM6MOZ9Jmnk3F3UA==", - "requires": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.3.2", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.2" - } - }, - "winston-transport": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.2.tgz", - "integrity": "sha512-9jmhltAr5ygt5usgUTQbEiw/7RYXpyUbEAFRCSicIacpUzPkrnQsQZSPGEI12aLK9Jth4zNcYJx3Cvznwrl8pw==", - "requires": { - "logform": "^2.3.2", - "readable-stream": "^3.4.0", - "triple-beam": "^1.2.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/compose/aries-mediator-service/acapy/controller/package.json b/compose/aries-mediator-service/acapy/controller/package.json deleted file mode 100644 index a2750367be2006a66f76e5959be8d1bff676cb09..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "mediator-controller", - "description": "A controller for an instance of Aries Cloud Agent Python mediator agent", - "version": "0.0.0", - "homepage": "", - "private": true, - "main": "src", - "keywords": [ - "feathers" - ], - "author": { - "name": "Ian Costanzo", - "email": "iancostanzo@gmail.com" - }, - "contributors": [ - "Emiliano Suñé" - ], - "bugs": {}, - "directories": { - "lib": "src", - "test": "test/", - "config": "config/" - }, - "engines": { - "node": "^14.0.0", - "npm": ">= 3.0.0" - }, - "scripts": { - "test": "npm run lint && npm run compile && npm run jest", - "lint": "eslint src/. test/. --config .eslintrc.json --ext .ts --fix", - "dev": "ts-node-dev --no-notify src/", - "start": "npm run compile && node lib/", - "jest": "jest --forceExit", - "compile": "shx rm -rf lib/ && tsc" - }, - "standard": { - "env": [ - "jest" - ], - "ignore": [] - }, - "types": "lib/", - "dependencies": { - "@feathersjs/configuration": "^4.5.11", - "@feathersjs/errors": "^4.5.11", - "@feathersjs/express": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/primus": "^4.5.11", - "@feathersjs/transport-commons": "^4.5.11", - "compression": "^1.7.4", - "cors": "^2.8.5", - "feathers-hooks-common": "^5.0.4", - "helmet": "^4.6.0", - "serve-favicon": "^2.5.0", - "winston": "^3.3.3", - "ws": "^7.5.6" - }, - "devDependencies": { - "@types/compression": "^1.7.2", - "@types/cors": "^2.8.12", - "@types/jest": "^26.0.24", - "@types/serve-favicon": "^2.5.3", - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^4.33.0", - "axios": "^0.21.4", - "eslint": "^7.32.0", - "jest": "^26.6.3", - "shx": "^0.3.4", - "ts-jest": "^26.5.6", - "ts-node-dev": "^1.1.8", - "typescript": "^4.5.5" - } -} diff --git a/compose/aries-mediator-service/acapy/controller/public/favicon.ico b/compose/aries-mediator-service/acapy/controller/public/favicon.ico deleted file mode 100644 index 7ed25a60b04996fb9f339aa73cbfd25dd394430e..0000000000000000000000000000000000000000 Binary files a/compose/aries-mediator-service/acapy/controller/public/favicon.ico and /dev/null differ diff --git a/compose/aries-mediator-service/acapy/controller/public/index.html b/compose/aries-mediator-service/acapy/controller/public/index.html deleted file mode 100644 index 73128e5b002639c16140871e0c39dfd4d3791a45..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/public/index.html +++ /dev/null @@ -1,75 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <title>A FeathersJS application</title> - <meta name="description" content="A FeathersJS server"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <style> - * { - margin: 0; - padding: 0; - box-sizing: border-box; - } - - html, body { - font-family: 'Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif'; - font-weight: 400; - font-size: 16px; - color: #2c3e50; - } - - .center-text { - text-align: center; - } - - main { - margin-top: 100px; - padding: 20px; - } - - img.logo { - display: block; - margin: 0 auto; - max-width: 100%; - margin-bottom: 30px; - } - - h2 { - font-size: 2em; - font-weight: 100; - } - - footer { - position: absolute; - bottom: 0; - left: 0; - right: 0; - padding: 20px; - } - - footer p { - font-weight: 300; - font-size: 1.0em; - } - - a { - color: #3cf; - text-decoration: none; - } - - a:hover, - a:focus { - color: #3cf; - } - </style> - </head> - <body> - <main class="container"> - <img class="logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk4AAABkCAMAAABHL0++AAADAFBMVEUAAAD///+AgIBVVVVAQEAzMzNVVVVJSUlAQEA5OTkzMzNGRkZAQEA7Ozs3NzczMzNAQEA8PDw5OTk2NjYzMzM9PT06Ojo3Nzc1NTUzMzM7Ozs5OTk3Nzc1NTUzMzM6Ojo4ODg2NjY1NTUzMzM5OTk3Nzc2NjY0NDQzMzM4ODg3Nzc1NTU0NDQzMzM3Nzc2NjY1NTU0NDQzMzM3Nzc2NjY1NTU0NDQzMzM3Nzc2NjY1NTU0NDQzMzM2NjY1NTU1NTU0NDQzMzM2NjY1NTU1NTU0NDQzMzM2NjY1NTU0NDQ0NDQzMzM2NjY1NTU0NDQ0NDQzMzM2NjY1NTU0NDQ0NDQzMzM1NTU1NTU0NDQ0NDQzMzM1NTU1NTU0NDQ0NDQzMzM1NTU1NTU0NDQ0NDQzMzM1NTU1NTU0NDQzMzMzMzM1NTU0NDQ0NDQzMzMzMzM1NTU0NDQ0NDQzMzMzMzM1NTU0NDQ0NDQzMzMzMzM1NTU0NDQ0NDQzMzMzMzM1NTU0NDQ0NDQzMzMzMzM1NTU0NDQ0NDQzMzMzMzM1NTU0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQ0NDQzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzM0NDQ0NDQzMzMzMzMzMzN4a/VhAAAA/3RSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7rCNk1AAAYtElEQVR4Ae3de5iN5eL/8c9aM8MY50EO5FBCSaW2HEqhHaUk0m4QJZtd2mQcCoVdUeSgEhHalZxzjhByPkcOQs7kwAwGwxxm1nr/fnvNXDWHtdZzmNaM72Vef8/cfzzP+7rnnvt57uuRaaUe7Txi8rwVW37du+nHOV8P6VCvmP4aZMFc/Z+SxEblCnmo/08xZBK9uNcDztyccnOyonCnJbF4nFszZdywgT16DBw+fuq6KDwuzonIp6yBy2vsGpyb0/8lwU/NiAM4Ounl2kWUTnjdjl+dALg86VGHsgDW6CaQm1NY5CkgYU7HSvKhcueFScCBl0Nyc/IrN6fC/aKAja+Fy68S3bYCx7qE5ub0P0+vWdMkN6dMgrpegqT/VpMJNaYkw6kISbk5/RPa5eaUUZ3tED+2gkyqPCERlptqLzenm06hCW6YWkYWVJgDCYPz5OaUm1NG9x+EfY1k4L6OSufJQ7Clkozl5nRTeT2epHfyyL8aC+FZpRM6yMWlljKQm9NNJd9MOF5X/gUPSPS2J93gNIxyykBuTjePoutgQbhRcj8ASRxSRrcsg1l5c3NKkZtT2d0wQAaClwMXrxOlTJxDYGUhGcjN6eZwxzGSO8nIhwDb4bq86O5mewkpN6fcnMoeI66FjDzhBg4cg3h50yaRbQVzc8rNqehu4hrKSLEzANOABHnVNJHleXJzutlzyreO5BYyNAPg15+Aq/KurZvpztycbvKcZkInGfoHAIMBouVDJAzJzenmzul16C9DRc4AnBgDcEq+DMXdNDenmzmn++NZIGPjAOh3AeCwfHGuILpcbk43b06FDnE8XIbqugGudAZgj3wqdZZ1wbk53bQ5TSCprgw5tgAw5kcAv9fmMRd9cnO6WXOq4+YdGWuHR2MXAEvlxxCuVcjN6ebMKWg7+/LIUNjvAKx8E48Z8iPfUebm5nRz5tQVGslYakZtd+ExTv48A0/ldE55CgUpy4IKBgU+J0dBp7LIUSBMfwmnn3FCCuWTkcKXmCpjBaIAuFwLj0MGBS7ggDPHcqrxxoR1Z+OBuPP75n3YvqqdjGr1nrJky+EYN8SeObBsVKd6+WWok9Wcgh/sOXvDgahkXFH71s4Z8HCIrCvU/MN5B664ITnm5PqJPZvYzCr8iYGLdx05f529XhK7/59jlu655AISow5tWzai9R0O+dCP+DIy9jYeXwyEI7MGt3i8lfy6PYmInMnpkUlnyODw6L87ZMFtPRdeJqO42S94KapKlzSmwNdd0qviO6fQV36MJb1rS3sXlxXFuq1PIr34Jd1KyZ88Xbo0VXo1P/+NVJlzavzVeTKJWfZyfnkRFsVYGQs9j0e93UDSORcz5d837HJkf075uh/Ew3V0y8qFyzbsiibFvn/lk0n3TkvGw3XpyPb/P8jan0+78bj2WVFl0Bb/2vnKqcyg83gkHtiyYuHqPWcS8bg2qpzMqjkjAY/Lu9Yt+X7VtkNJeCR8da98KwwL0xXwymY8Lu1dPnPW7E+VVvCLO0lxYeeGFd//sGHPySukuDKhrjKJJKmCjL2Cx/GqpPpA/lVz0Ty7c8rzxhmA05M7VM+rVMXqdV1wFeB8R4dMqLcIIHnH2PZVnH8OXDnikz0AURkHedFeTnk/SAQ4Nr5VlWCluq39F7+6gYSJJWVGjbkASevfe6yUUoVUfXbUXgDmVjSZk6PzBYB9w1qWVmYdTwAc/OKl6vn1hxKP955yDIDFFZVe8Cn+KxNSGx0RSaoIGZjFxmzO6cHdwPXJj2XKJqTZYhewqaaMBA91Awe6FVZm9358HVhdWGlVeCGN8TDmhfQqeM2p1l4gfnJtZXTH6Fjg9MPyzxNkErCnZ+b0yr97GrjeP4+ZnGqsB+LHPihvwucCcePrKDPHw19cAq69Gay0noZqMlabFHV/JFUVGfgb3JmdOQUNcUHcqFLy6ra5QEJX+VduHfBDY4e8KzXODdvCs/yfXf9k4Lsy8qZI7wuQ1EMG7tsP7Ggur4I7RAGbyxvnNDAJWHi7vGrwO7jGlZUPoa/HAD+XUBoz2CgTRuJxskA8KS44ZGQ3H2ZjTkWXAfPLyqdnTwIz8suPx6Ihpq38ePQE7CyRtZwcnwC/N5cvt64Bo5d8nr8GF15yyJfiXwEXnjDIKWgicLCpvGsQD7sflB+lZwE7w9MMHcdrMuY4icfop0n1gwz15oQz23KqeBAuvSB/Cn7igvWF5NMDsfBTeflV+mdY7chKTs6J4B5bSL4FveuC4fLjHWBeSfnT8DdIau03p9C54B6YR97dGwPT8sm/FxLh5yJKpU4khMtYNVI0+4hUA2WojItG2ZVThaOwr4oM1L8MW8Plw62n4UunDITvh85ZyWksuP8l/553Qwf5NADcAxzyL+9UcL3sJyfHInB1lA+lT8N4GXouCdY4lGoJc2RCWzwSC2wg1WMytowx2ZRT2aOwupAM1b4M6/PIq0K7YF6QDFWJJ6a0/ZwiwP2qjPSGhIfkQz9IfF6GgqaAu5nvnN6EpDbyZSIsc8rYC8nQRilCYukoEz7AY3VoAimS8svYG+zLnpxCt8Lq/JK5nibKq69gVahMGALTbedU+Qru12Tsczjuo/tWkNRSMtfTlbt85VQ7iQTfw1R3cbm8TLZxNK88HoJKMqEbHm8/TKrNMqEGlMmWnCbDzvyS2Z5elRc1XEQVlRkFz5Jc3mZOzm0QaSqFTfC6vLknFtpJZns6VNB7TmFHoLV8mgf/kin5T0IvefTnqEwIqpYMwN96kGqITHCcp2125NQJYqvJpMYQW1GZLfJkZkpPeN9mThHwo0x5BE6FKrN8B2GSTApaA2O85xQJs+RT4USiQmROBEQH6X9+YpJMqN9nKsBF5zRSNZAZM5iUDTmVuwwvybQvYZkyeRR+CZI5d8AOezkF7eNaJZmzyPs8NgL2hsmsKnG463vLKfQ0UbfIpxfgU5m1Derpfy7zskwYeunBBOAHHSbFxWCZ8W92ZENOi+EbmVf0DEQooyXQUGYdwl3SVk7tIFIm3ePiXObA67i4frfM6wN7nV5y6goR8u0beERm9YX/SFIpqC0TdjB5MDCwGKm+kSmPEesIeE5Pw/4CsuA5+C0o8+R+SKaNgaa2cvqZTU6ZtRDqKgPHVugkC4K3Q3svOR1hrvzYiquAzLobNqTO8EVkrJgbRv0GTZ4kVQuZUg5uDXROzl3QVJbMgVeUXmv4UKb9G3rayakCPC7TXoWByqAVbJElNZM4HJIpp5pwn/w4zWGZd5TkIpI6c04mNAc4gLvou6S4FiZTHLH8PdA5tYOtsuZOOOhQOjOhpkxrBuPs5NSdQw6ZVgnWK72g/fC0rJkO7TLl9D6b5YfTxRqZ9zk8JGmEuV8agsd+LSPFdzJpO68HOqdf4RlZtJoMmYdc5ZDMuwdm2clpNb1lwQGSCmdaIW+XRQ1gXaac9tJB/rjYYG2B1lzSZKbIhNSKvnJcIkWETJrPu/ILdtSyIZ9S6e+wQ1a1zphDVZgq80rBchs5JboTisuCTzNNRevgWVm1H+7OkFM8l/LJn8vslnkdoaOkeYyTCWfxeL0yHmfmFJBJ3zJSfmFPdaXSAmgpq/JGkVhEaTSF/8i8grDRRk4wRVa0hy5KqybsdMiqSBiWISf4RH4dJ1rmNYO3JK1gmIzlJ0WDCGB9r9dayLTPmRDYnMq62O+QZR9B6wxr67YyL8huTs/JiqYwQGmNgzayLDyOA5lyaiC/lkNZmVYnJdgtDJCxO0lR/CNOzF1xDbeV2zZdfsHvw20omaaDAbLuTpiqNEZBLZkX7LaZUxlZ8WCGvUTnOWLDZN0MqJohp+T88mu0pfRvGT68laR9RMpYLTzO6Xs8Tsq0/nwf2KX4SqgiG85zyak/vfD++wVk3q3Yy+mYLLkNpimN+jBNNnSByAw5bZd//4DvZNVeeshYPTxW6ggei2XaABYGNKfiyeyUHfOhumyrZzOnqbKkEPyoND6GlrKhJnyXIacx8q9wIvGVZNEmBspYeTw+zefCo49MG8bUgObUEkbKjj7wimyLsJlTV1mTyDalsRNXUdkQFMvJDDm9KAMzYaEs+pHhMuaIAuBf95Cilkwbx/iA5jQEnpEdj8IXsm2+zZxqy5qr7NCf8iezQ7b8BGXS51RFBu4FRsuaOYw3k1MfAB5pgcdZh0ybwvCA5vQT7qKyIyyJDbKrqttmThWylNOj8LFsGQyN0+dUQEY+sd7T10yVsYjavwBU6IXHOJm3gIGBzMlxlaOyZyfnZVPIAmzmVDBLOfWGl2RLC+iSLqcEGcq7BZhRVhYMYZ2MvXm0/mVIDh6LRwOZ9wudA5lTGfhe9iyDQrIlbDE2c0pUlnL6AmrJlnowMl1OZ2SsyCYgtn8+mdaBKBkbxPYOCRzXYgAOOmSa4xqPBjKnuvCR7JkO98gG53O/QIy9nM5mLaeluAvIlmowJ11Oe2VC2HiA00OqW6g2XIbeg+iZrjXaDUB3mVceSgYypwjoLHvGQkNZFfxAr8PAqaqJtnL6NWs57ee07LkFVqfLaY1MabIDgO09q8qMYlBXhp4F4FvFAJwNk3mPE6NA5vQWPCN7BkFLCx2Vrf1ct+GrrgGw4XbZy2lT1nK6zg7ZEwy70uX0vcxxtFjuBuDIZ08VkKFoOspQ0GGAwQXB6lOnN9gc0Jw+gNqypwd0lG/BZR5o2vpfbw7+7NuFa3efvMofXKsaSzZz2pilnPLAEtl0hZMZjx6YdcdHJ/BI2jCoUaj8WsxXMlb/GvBqVS6s/qyZrPiOzwKa08fwZA17+kMXeVO6SY9Jm8668ObI9PYlpJzJyVNBDZtOc95eTh61PtxHiviVb9cNlk+9OCETbp8NLRtwt6xxRNMyoDmNJyteU0bOuoN3klnc2QNrpwzp0qCIPHIop9Jkhf2cPMr/c8YFUlxZ2LWqvHsAKsuMV3i4NcVlzX24wwOa02Sy4lWlF9rjDCkSDqyaNrLP6y+1bFy3RsXieZRRjuR0O1lxzjgnA877IudfIsWx8S0LKzPnRTrLjHbc0T3RIWt6sEMBzelr+HqMbQ8rreDOvwPEL+3bvEqQDORETpXg1zG2fWguJwPO+yPnXcAjaV3/6spoDgtkRneKfHBaFv3E8MDm9Cncpb9Gqa1A4n+bhclYzuQUDjNln/mcDDju6frdeTy29yitdCJIKiETBiU7Jv4ia8q7eTCwOb0PD+svcdcxcH19m4zlWE5BsCLnc0p1V9cfEwGSJ5VTGvku000mfB6luctlTT/2K7A59YLm+is8GgMH75Zu5JwUy47A52RekTZzk4G4YUX1p0lslQkz9mvNTFmzj34BzqkTdNBfoGQUbCyuGzyn3zkR0Jysu33MdeD4/eneeqghY8s3atcXsqQu7vIBzukf0Et/gYWwKJ9u9Jz2EhvgnKwrMRa4/qJSyXGAKTK2famOjJQl81miAOfUBD5Q1v0TTofrhs9pA+QNdE7WPXEKiFQqvUxyZRk6OkvnBsmKGm4eCXROtWCSsqz4VWgmK0LJiZwWwa03Xk4KXw7Jf1eqkGNMkKGYSbraT1ZMY60CnVNBN1uUZX1hsiwpnyM5DYOnbsCclH8jRFdUqi4kVpABh+tTubrLgmoungh4TjpIXLCy6gTuKrKkVo7k1AbeuRFzUtHdsEKpQk8xRwYKMjSU12TBUrYo8DnNhLtlR1B4eJhS1IDlsubpHMnpLpgtWwqGhzsCmJNui4OGShUBT8q/0vynKB1k3vO462RDTv2gnexoDm8qRQ+IlDUdcySnoOsckS07uOq0kNMX27Y6LO8nfyulWs6hUIP86FeaNjKtwO9MUDbk9CSMlB1DoZFSTIV7Zc3IHMlJm6GwbCiQzBpZyGkehMuSMsnEhChVtQQGya87efM2npNpHxNdLDtyKg0/yY61uIsoxRaSgmXN3pzJaRw0kA2PwSgrOX0Jd8ialWm3LweT3ED+1KBHdZrJrKZuOio7ctIZ4ovIujxxHFSqixyWNeXImZw6w1DZ0B/aWslpGNSRNR9AaylVni2cvkV+3EfP+2kik8pFM0fZk9NX0FHW1YZpSuGEVbKmYw7lVBFOOGTdD1DNSk59re9ItIbe+kOlSyxz+s2pVz0ayZzgdRwpkk05tYAVsq4v9FSKgvC9rJmZQzlpJ9SXZaExXHZayakzvCRrGsN7+lNLGCLf7qZfQ+rJnM9IqKVsyil/HK7SsspxCFcFpSgJM2VJ+NWcyuk9+FyWtYNJspJTMxgta+pkOPE4Ct6QT1V5twkPyJR3oKuyKydNg0hZ1RiWKFURmC9LBpFTOVWF6BBZtQHqWsop3M2vsqYBDFAazlm428iX0gx/huoyoxMMV/bl9Ahsl1VzoJWUKt7ibS56mRXJOZOTVkJzWXQP7JGlnLQDSsuSZ6G70sq7ksSm8iGUCa24XSa0SuYbRzbmpL0QIWvKJnM+REp1nMOy4l1omJhDOT0Pe4JlzVjobjGnkdBWlvSGlkqn0HYSfQ4SPbcNxWSsUzKLgpWdOXWAE2GyZAwM0x+2kFxI5hWNYY9859Q+oDkFH4SusqRCLPHFLObUDL6VJTOgstIrsQ13pLzbvOlld5AMvQ2LwpStOQXtg/dkRX030bekuxLNZJpjPnT2ldPL0CWgOakNXCwmK5bB+7KYU+EkEm+XBXkucsGpDAouh6FOefPp+U4xMhL8GXwTrOzNSa0grqLMy/db+jmkPYySaW/DtiBfObWAfoHNybETPpcFHWFfXqs5aaLF6ek5+NJLZDNgRUl58STv7pKBcutguEPZnZOWwjyZNwyWKo3wJM6FyaTGLpLula+cGsKwwOakh124asm0MjG4H5LlnCom4rrb2meWHldmziFuzj6mzJxH130p/56KJqGrlP05lb8C/WRWy+SMX9tcAT1lTsVo+EA+c7oPZgQ4J30MJ0rKpPxrYYys56RxsNghsyJhi7xqGo1rSD5l0iKpofwpMMrNkVrKiZzUEdwtZM7zSbg7KJ3WcK6gzKh5En4I8Z1TaCJnA51T2H7YkE+mFFgLuwvayenWePhYJjVJxt3Iz5+so88ok0Ly5/nfYU4R5UxOGg0Jz8mMiCR4XRmsgEVBMtYiFjbnl++ctBXuCnBOuuMCrDKVf6H1sPcW2clJbwFvy5S7YuB9+RLc5xosuF0WVFsK0R2lnMopaAkkd5Sx15KhmzKqEm9qfdvHDfuL63/i2SFvRsGYQOekhomw+RYZKr8J9pWUvZw0BugiE2oex/8D3wrzIOmbajKpxjQX7gnFlHM5Kf8S4Msw+VdpORCpzHoDY0PlV8XvgJXF5XGWKHlTzU3i7YHOSU9fhzON5J/jtSuwv5Ts5uScA8woISOd4+B4cfn11AFwzfqbTKg73w1b6kg5mZNCpgP7GskPZ7dYuNRG3vQBdt4p38JHJAAjgpRiK9SUN/NhT9FA56T6MeAaUVh+VF4FLLxFtnNS6CogKkJ+lZ4CbCtn2GbELmB37zLyq3y/fcDaJ6QczknOtxKBeT6TKNhlL7CkrLzr4oZrg26Rd6G9LwHREVKqIbChiLwodwp21Ql0Tqr6M3D+1bzyodZ/4+DyK1k7yRL8TgKw/LkQ+VJudBzwbaiMOZpvBFzL3qjhkFeO+3qsdIN7ySNSzuck/W0/wPKWIcqsxpgrQOyr8umpo0Dc55WV2f0fnwcSR6bpp/x1OPn2kzXLVKx5n9KpeR7cGz/s1v6Zp5q3atN1RGByUsjQZOD8kNuUWdhLWwBWVsjywah7tgOc+6iKvCjYanICcLm7TLrzw5MA52f8+7Fy6ZpylH/8je+iAfb3Ky/dGDkppGsUQOyiyLrF9IfQh3rNOQsQM+JW+RE6MA7g4IQX0/xY6F0vfXkEwD2vitJqGU+qlUqv5HzSuBqgnKTqCwHYP7pFlZA0nb/wydYkgPWtHMpyTgp+8zgAJ+a83STNNXXc9nSfpQkA14YWk3nORmP34RG7ff63n3/Uf8Cwcd8u+OUaAO4dwx+UFPicTCvU5xApLm5buWDatKVbDl1w4XGwawEZqDjsNB6xJ3eumjt59pL1J9x4nHivkjKoNPKy95yk2tOvZENOUv1ZCXgkHVy3ZPa381bv/v06HolTa/1VxzadT85OIsWVE7vXLZo644cNe6+R4uSIUrKqTNtJO2LJIGbzZy3DlXV9+76ov5KjwcTDZJS4YWhjp0wIemLqeTJw/zrxCae8yF/r+V59+/Zto8yCarX+d9+3er72j3rl9Ie3+raXRb36viJ/SvRYcZ2MTk3vUlb+5O3b93lZUPKNaQfdZLL7/b/JJsetf3/93ZETpn+/cOr44QM7P1pKN7Bybd6bvO7YuZj4xHO/rp3/Zf+G+WRBuWf+M3v1L0cuJF48vHXZ9P88UUQ3tDwPRY5euOf0hdikK0d/Xjbt05dvUyAUbtj7y9nLt/52Lv7amf1bfhj1z7qFlNH/A4tNaQdBINQrAAAAAElFTkSuQmCC" alt="Feathers Logo"> - - <footer> - <p class="center-text">For more information on Feathers see <a href="https://docs.feathersjs.com" title="Feathers Documentation" target="blank">docs.feathersjs.com</a>.</p> - </footer> - </main> - </body> -</html> diff --git a/compose/aries-mediator-service/acapy/controller/src/app.hooks.ts b/compose/aries-mediator-service/acapy/controller/src/app.hooks.ts deleted file mode 100644 index fa7fe02279c41772b1e6917c7f1ddff8ca34f07f..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/app.hooks.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Application hooks that run for every service -// Don't remove this comment. It's needed to format import lines nicely. - -export default { - before: { - all: [], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, - - after: { - all: [], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, - - error: { - all: [], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, -}; diff --git a/compose/aries-mediator-service/acapy/controller/src/app.ts b/compose/aries-mediator-service/acapy/controller/src/app.ts deleted file mode 100644 index e297458e468f77a28d015a6ce7fde58154262286..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/app.ts +++ /dev/null @@ -1,60 +0,0 @@ -import path from 'path'; -import favicon from 'serve-favicon'; -import compress from 'compression'; -import helmet from 'helmet'; -import cors from 'cors'; - -import feathers from '@feathersjs/feathers'; -import configuration from '@feathersjs/configuration'; -import express from '@feathersjs/express'; - -import primus from '@feathersjs/primus'; - -import { Application } from './declarations'; -import logger from './logger'; -import middleware from './middleware'; -import services from './services'; -import appHooks from './app.hooks'; -import channels from './channels'; -import { HookContext as FeathersHookContext } from '@feathersjs/feathers'; -// Don't remove this comment. It's needed to format import lines nicely. - -const app: Application = express(feathers()); -export type HookContext<T = any> = { - app: Application; -} & FeathersHookContext<T>; - -// Load app configuration -app.configure(configuration()); -// Enable security, CORS, compression, favicon and body parsing -app.use( - helmet({ - contentSecurityPolicy: false, - }), -); -app.use(cors()); -app.use(compress()); -app.use(express.json()); -app.use(express.urlencoded({ extended: true })); -app.use(favicon(path.join(app.get('public'), 'favicon.ico'))); -// Host the public folder -app.use('/', express.static(app.get('public'))); - -// Set up Plugins and providers -app.configure(express.rest()); - -app.configure(primus({ transformer: 'websockets' })); -// Configure other middleware (see `middleware/index.ts`) -app.configure(middleware); -// Set up our services (see `services/index.ts`) -app.configure(services); -// Set up event channels (see channels.ts) -app.configure(channels); - -// Configure a middleware for 404s and the error handler -app.use(express.notFound()); -app.use(express.errorHandler({ logger } as any)); - -app.hooks(appHooks); - -export default app; diff --git a/compose/aries-mediator-service/acapy/controller/src/channels.ts b/compose/aries-mediator-service/acapy/controller/src/channels.ts deleted file mode 100644 index fcee5e35d7dc8a228f4f44951a53c8ded7897f0e..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/channels.ts +++ /dev/null @@ -1,65 +0,0 @@ -import '@feathersjs/transport-commons'; -import { HookContext } from '@feathersjs/feathers'; -import { Application } from './declarations'; - -export default function (app: Application): void { - if (typeof app.channel !== 'function') { - // If no real-time functionality has been configured just return - return; - } - - app.on('connection', (connection: any): void => { - // On a new real-time connection, add it to the anonymous channel - app.channel('anonymous').join(connection); - }); - - app.on('login', (authResult: any, { connection }: any): void => { - // connection can be undefined if there is no - // real-time connection, e.g. when logging in via REST - if (connection) { - // Obtain the logged in user from the connection - // const user = connection.user; - - // The connection is no longer anonymous, remove it - app.channel('anonymous').leave(connection); - - // Add it to the authenticated user channel - app.channel('authenticated').join(connection); - - // Channels can be named anything and joined on any condition - - // E.g. to send real-time events only to admins use - // if(user.isAdmin) { app.channel('admins').join(connection); } - - // If the user has joined e.g. chat rooms - // if(Array.isArray(user.rooms)) user.rooms.forEach(room => app.channel(`rooms/${room.id}`).join(connection)); - - // Easily organize users by email and userid for things like messaging - // app.channel(`emails/${user.email}`).join(connection); - // app.channel(`userIds/${user.id}`).join(connection); - } - }); - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - app.publish((data: any, hook: HookContext) => { - // Here you can add event publishers to channels set up in `channels.ts` - // To publish only for a specific event use `app.publish(eventname, () => {})` - - // console.log('Publishing all events to all authenticated users. See `channels.ts` and https://docs.feathersjs.com/api/channels.html for more information.'); // eslint-disable-line - - // e.g. to publish all service events to all authenticated users use - return app.channel('authenticated'); - }); - - // Here you can also add service specific event publishers - // e.g. the publish the `users` service `created` event to the `admins` channel - // app.service('users').publish('created', () => app.channel('admins')); - - // With the userid and email organization from above you can easily select involved users - // app.service('messages').publish(() => { - // return [ - // app.channel(`userIds/${data.createdBy}`), - // app.channel(`emails/${data.recipientEmail}`) - // ]; - // }); -} diff --git a/compose/aries-mediator-service/acapy/controller/src/declarations.d.ts b/compose/aries-mediator-service/acapy/controller/src/declarations.d.ts deleted file mode 100644 index 56550834c63ca51b0587eb9f3ba418755d50751e..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/declarations.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Application as ExpressFeathers } from '@feathersjs/express'; - -// A mapping of service names to types. Will be extended in service files. -export interface ServiceTypes {} -// The application instance type that will be used everywhere else -export type Application = ExpressFeathers<ServiceTypes>; diff --git a/compose/aries-mediator-service/acapy/controller/src/index.ts b/compose/aries-mediator-service/acapy/controller/src/index.ts deleted file mode 100644 index 8c0e7ef8828de1d08ade6a46d352fe8124d90605..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import app from './app'; -import logger from './logger'; - -const port = app.get('port'); -const server = app.listen(port); - -process.on('unhandledRejection', (reason, p) => - logger.error('Unhandled Rejection at: Promise ', p, reason), -); - -process.on('SIGTERM', () => { - logger.warn('SIGTERM received, closing server.'); - server.close(() => { - logger.warn('Server closed, exiting.'); - process.exit(0); - }); -}); - -server.on('listening', () => - logger.info( - 'Feathers application started on http://%s:%d', - app.get('host'), - port, - ), -); diff --git a/compose/aries-mediator-service/acapy/controller/src/logger.ts b/compose/aries-mediator-service/acapy/controller/src/logger.ts deleted file mode 100644 index 2fe5469704ecebba224b38b39de8a0535f20c112..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/logger.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { createLogger, format, transports } from 'winston'; - -// Configure the Winston logger. For the complete documentation see https://github.com/winstonjs/winston -const logger = createLogger({ - // To see more detailed errors, change this to 'debug' - level: (process.env.LOG_LEVEL || 'info').toLowerCase(), - format: format.combine(format.splat(), format.simple()), - transports: [new transports.Console()], -}); - -export default logger; diff --git a/compose/aries-mediator-service/acapy/controller/src/middleware/index.ts b/compose/aries-mediator-service/acapy/controller/src/middleware/index.ts deleted file mode 100644 index 0bad39e08b80f58b7bb133290bef344dccab743c..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/middleware/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Application } from '../declarations'; -// Don't remove this comment. It's needed to format import lines nicely. - -// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function -export default function (app: Application): void {} diff --git a/compose/aries-mediator-service/acapy/controller/src/models/endorser.ts b/compose/aries-mediator-service/acapy/controller/src/models/endorser.ts deleted file mode 100644 index 18ce766a5d62f40eeeed5cc76a54e3797f0c8305..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/models/endorser.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface EndorserMetadataServiceRequest { - connection_id: string; -} diff --git a/compose/aries-mediator-service/acapy/controller/src/models/enums.ts b/compose/aries-mediator-service/acapy/controller/src/models/enums.ts deleted file mode 100644 index 8dce6687df4f0a02f2dbbcd55d4b333ada79ceec..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/models/enums.ts +++ /dev/null @@ -1,20 +0,0 @@ -export enum ServiceType { - Connection = 'Connection', -} - -export enum WebhookTopic { - Connections = 'connections', -} - -export enum ConnectionState { - InvitationSent = 'invitation-sent', - Request = 'request', - Response = 'response', - Active = 'active', - Completed = 'completed', -} - -export enum ConnectionServiceAction { - Accept_Connection_Request = 'Accept-Request', - Send_Connection_Ping = 'Send-Ping', -} diff --git a/compose/aries-mediator-service/acapy/controller/src/models/errors.ts b/compose/aries-mediator-service/acapy/controller/src/models/errors.ts deleted file mode 100644 index e1e199b8155be9378880855a368de857e1eb3bc5..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/models/errors.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { FeathersError } from '@feathersjs/errors'; - -export class UndefinedAppError extends Error {} - -export class DuplicatedProfileError extends Error {} - -export class AriesAgentError extends FeathersError { - constructor( - message: string | Error, - code: number | undefined, - data?: unknown, - ) { - super(message, 'aries-agent-error', code || 500, 'AriesAgentError', data); - } -} diff --git a/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.class.ts b/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.class.ts deleted file mode 100644 index ecdf3499715a742c17d784970917bb15a06fd506..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.class.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { NotImplemented } from '@feathersjs/errors'; -import { Params } from '@feathersjs/feathers'; -import Axios, { AxiosError } from 'axios'; -import { Application } from '../../declarations'; -import logger from '../../logger'; -import { ConnectionServiceAction, ServiceType } from '../../models/enums'; -import { AriesAgentError } from '../../models/errors'; -import { AcaPyUtils } from '../../utils/aca-py'; - -export interface AriesAgentData { - service: ServiceType; - action: ConnectionServiceAction; - data: any; -} - -interface ServiceOptions {} - -export class AriesAgent { - app: Application; - options: ServiceOptions; - acaPyUtils: AcaPyUtils; - - constructor(options: ServiceOptions = {}, app: Application) { - this.options = options; - this.app = app; - this.acaPyUtils = AcaPyUtils.getInstance(app); - this.init(); - } - - private async init() { - await this.acaPyUtils.init(); - logger.info('Aries Agent service initialized'); - } - - //eslint-disable-next-line @typescript-eslint/no-unused-vars - async create(data: AriesAgentData, params?: Params): Promise<any> { - switch (data.service) { - case ServiceType.Connection: - if (data.action === ConnectionServiceAction.Accept_Connection_Request) { - return this.acceptConnectionRequest(data.data.connection_id); - } else if ( - data.action === ConnectionServiceAction.Send_Connection_Ping - ) { - return this.sendConnectionPing(data.data.connection_id); - } - default: - return new NotImplemented( - `The operation ${data.service}/${data.action} is not supported`, - ); - } - } - - private async acceptConnectionRequest( - connection_id: string, - ): Promise<boolean> { - try { - const url = `${this.acaPyUtils.getAdminUrl()}/connections/${connection_id}/accept-request`; - logger.debug( - `Accept connection request for connection with id ${connection_id}`, - ); - const response = await Axios.post( - url, - {}, - this.acaPyUtils.getRequestConfig(), - ); - return response.status === 200 ? true : false; - } catch (e) { - const error = e as AxiosError; - throw new AriesAgentError( - error.response?.statusText || error.message, - error.response?.status, - error.response?.data, - ); - } - } - - private async sendConnectionPing(connection_id: string): Promise<boolean> { - try { - logger.debug(`Ping connection with id ${connection_id}`); - - const url = `${this.acaPyUtils.getAdminUrl()}/connections/${connection_id}/send-ping`; - - const response = await Axios.post( - url, - {}, - this.acaPyUtils.getRequestConfig(), - ); - return response.status === 200 ? true : false; - } catch (e) { - const error = e as AxiosError; - throw new AriesAgentError( - error.response?.statusText || error.message, - error.response?.status, - error.response?.data, - ); - } - } -} diff --git a/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.hooks.ts b/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.hooks.ts deleted file mode 100644 index b6ac9edd129a0ef0b3f2204b7927ac36efb3f5a9..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.hooks.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { HookContext } from '@feathersjs/feathers'; -import { disallow } from 'feathers-hooks-common'; - -export default { - before: { - all: [disallow('external')], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, - - after: { - all: [disallow('external')], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, - - error: { - all: [ - disallow('external'), - async (context: HookContext): Promise<HookContext> => { - console.error( - `Error in ${context.path} calling ${context.method} method`, - context.error, - ); - return context; - }, - ], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, -}; diff --git a/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.service.ts b/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.service.ts deleted file mode 100644 index d028f0499d58bf4cee29e8e0d97c7dbb2bb1d394..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/services/aries-agent/aries-agent.service.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Initializes the `aries-agent` service on path `/aries-agent` -import { ServiceAddons } from '@feathersjs/feathers'; -import { Application } from '../../declarations'; -import { AriesAgent } from './aries-agent.class'; -import hooks from './aries-agent.hooks'; - -// Add this service to the service type index -declare module '../../declarations' { - interface ServiceTypes { - 'aries-agent': AriesAgent & ServiceAddons<any>; - } -} - -export default function (app: Application): void { - const options = {}; - - // Initialize our service with any options it requires - app.use('/aries-agent', new AriesAgent(options, app)); - - // Get our initialized service so that we can register hooks - const service = app.service('aries-agent'); - - service.hooks(hooks); -} diff --git a/compose/aries-mediator-service/acapy/controller/src/services/index.ts b/compose/aries-mediator-service/acapy/controller/src/services/index.ts deleted file mode 100644 index bc1f57147ee9bbec0949fd5a84b2be734aa06b68..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/services/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Application } from '../declarations'; -import ariesAgent from './aries-agent/aries-agent.service'; -import webhooks from './webhooks/webhooks.service'; -// Don't remove this comment. It's needed to format import lines nicely. - -export default function (app: Application): void { - app.configure(ariesAgent); - app.configure(webhooks); -} diff --git a/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.class.ts b/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.class.ts deleted file mode 100644 index 5b35a64fa95d90fcc66a659b9f6bbbb57c373425..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.class.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { NotImplemented } from '@feathersjs/errors'; -import { Params, ServiceMethods } from '@feathersjs/feathers'; -import { Application } from '../../declarations'; -import { - ConnectionState, - ConnectionServiceAction, - ServiceType, - WebhookTopic, -} from '../../models/enums'; -import { AriesAgentData } from '../aries-agent/aries-agent.class'; - -interface Data { - state: ConnectionState; - connection_id?: string; - transaction_id?: string; -} - -interface ServiceOptions {} - -export class Webhooks implements Partial<ServiceMethods<Data>> { - app: Application; - options: ServiceOptions; - - constructor(options: ServiceOptions = {}, app: Application) { - this.options = options; - this.app = app; - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async create(data: Data, params?: Params): Promise<any> { - const topic = params?.route?.topic; - const state = data?.state; - console.log('Received webhook:', topic, state); - switch (topic) { - case WebhookTopic.Connections: - if (state === ConnectionState.Request) { - // auto-accept connection requests - await this.app.service('aries-agent').create({ - service: ServiceType.Connection, - action: ConnectionServiceAction.Accept_Connection_Request, - data: { - connection_id: data.connection_id, - }, - } as AriesAgentData); - } else if (state === ConnectionState.Response) { - // auto-ping completes connections - await this.app.service('aries-agent').create({ - service: ServiceType.Connection, - action: ConnectionServiceAction.Send_Connection_Ping, - data: { - connection_id: data.connection_id, - }, - } as AriesAgentData); - } else if (state === ConnectionState.Completed) { - // No-op I think ... - } - return { result: 'Success' }; - default: - return new NotImplemented(`Webhook ${topic} is not supported`); - } - } -} diff --git a/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.hooks.ts b/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.hooks.ts deleted file mode 100644 index 4d7f94f09c6024fbbc1808e41562df82e57658dd..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.hooks.ts +++ /dev/null @@ -1,31 +0,0 @@ -export default { - before: { - all: [], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, - - after: { - all: [], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, - - error: { - all: [], - find: [], - get: [], - create: [], - update: [], - patch: [], - remove: [], - }, -}; diff --git a/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.service.ts b/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.service.ts deleted file mode 100644 index 85e87698905293816f6e15db8c95a1334cd78ad0..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/services/webhooks/webhooks.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Initializes the `webhooks` service on path `/webhooks/topic/:topic` -import { ServiceAddons } from '@feathersjs/feathers'; -import { Application } from '../../declarations'; -import { Webhooks } from './webhooks.class'; -import hooks from './webhooks.hooks'; - -// Add this service to the service type index -declare module '../../declarations' { - interface ServiceTypes { - 'webhooks/topic/:topic': Webhooks & ServiceAddons<any>; - } -} - -export default function (app: Application): void { - const options = { - paginate: app.get('paginate'), - }; - - // Initialize our service with any options it requires - app.use('/webhooks/topic/:topic', new Webhooks(options, app)); - - // Get our initialized service so that we can register hooks - const service = app.service('webhooks/topic/:topic'); - - service.hooks(hooks); -} diff --git a/compose/aries-mediator-service/acapy/controller/src/utils/aca-py.ts b/compose/aries-mediator-service/acapy/controller/src/utils/aca-py.ts deleted file mode 100644 index 054ee5ea31f3b56df34a77bc6cd6e280f1050f23..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/utils/aca-py.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Application } from '@feathersjs/express'; -import Axios, { AxiosRequestConfig } from 'axios'; -import logger from '../logger'; -import { UndefinedAppError } from '../models/errors'; -import { sleep } from './sleep'; - -export class AcaPyUtils { - static instance: AcaPyUtils; - app: Application; - - private constructor(app: Application) { - this.app = app; - } - - static getInstance(app?: Application): AcaPyUtils { - if (!this.instance) { - if (!app) { - throw new UndefinedAppError( - 'Error creating a new instance of [AcaPyUtils]: no app was provided', - ); - } - this.instance = new AcaPyUtils(app); - logger.debug('Created new instance of [AcaPyUtils]'); - } - return this.instance; - } - - getRequestConfig(): AxiosRequestConfig { - return { - headers: this.app.get('agent').headers, - } as AxiosRequestConfig; - } - - getAdminUrl(): string { - return this.app.get('agent').adminUrl; - } - - async init(): Promise<any> { - // wait for the agent to be ready - while (!(await this.isAgentReady())) { - logger.debug('Agent not ready, retrying in 3s...'); - await sleep(3000); - } - - return Promise.resolve({}); - } - - async isAgentReady(): Promise<boolean> { - const url = `${this.app.get('agent').adminUrl}/status/ready`; - let result; - try { - const response = await Axios.get(url, this.getRequestConfig()); - result = response.status === 200 ? true : false; - } catch (error) { - result = false; - } - return Promise.resolve(result); - } -} diff --git a/compose/aries-mediator-service/acapy/controller/src/utils/sleep.ts b/compose/aries-mediator-service/acapy/controller/src/utils/sleep.ts deleted file mode 100644 index 06b71d576697a676d325ab06a9f590bb26af1d73..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/src/utils/sleep.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function sleep(ms: number): Promise<any> { - return new Promise((resolve) => setTimeout(resolve, ms)); -} diff --git a/compose/aries-mediator-service/acapy/controller/test/app.test.ts b/compose/aries-mediator-service/acapy/controller/test/app.test.ts deleted file mode 100644 index d14c96d4fac8722686e332f0cd1d26266e729f36..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/test/app.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import assert from 'assert'; -import { Server } from 'http'; -import url from 'url'; -import axios from 'axios'; - -import app from '../src/app'; - -const port = app.get('port') || 8998; -const getUrl = (pathname?: string): string => - url.format({ - hostname: app.get('host') || 'localhost', - protocol: 'http', - port, - pathname, - }); - -describe('Feathers application tests (with jest)', () => { - let server: Server; - - beforeAll((done) => { - server = app.listen(port); - server.once('listening', () => done()); - }); - - afterAll((done) => { - server.close(done); - }); - - it('starts and shows the index page', async () => { - expect.assertions(1); - - const { data } = await axios.get(getUrl()); - - expect(data.indexOf('<html lang="en">')).not.toBe(-1); - }); - - describe('404', () => { - it('shows a 404 HTML page', async () => { - expect.assertions(2); - - try { - await axios.get(getUrl('path/to/nowhere'), { - headers: { - Accept: 'text/html', - }, - }); - } catch (error) { - const { response } = error; - - expect(response.status).toBe(404); - expect(response.data.indexOf('<html>')).not.toBe(-1); - } - }); - - it('shows a 404 JSON error without stack trace', async () => { - expect.assertions(4); - - try { - await axios.get(getUrl('path/to/nowhere')); - } catch (error) { - const { response } = error; - - expect(response.status).toBe(404); - expect(response.data.code).toBe(404); - expect(response.data.message).toBe('Page not found'); - expect(response.data.name).toBe('NotFound'); - } - }); - }); -}); diff --git a/compose/aries-mediator-service/acapy/controller/test/services/webhooks.test.ts b/compose/aries-mediator-service/acapy/controller/test/services/webhooks.test.ts deleted file mode 100644 index 62f45b1cf413bb2d46f9138baf6a3b7f77fee007..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/test/services/webhooks.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import app from '../../src/app'; - -describe("'webhooks' service", () => { - it('registered the service', () => { - const service = app.service('webhooks/topic/:topic'); - expect(service).toBeTruthy(); - }); -}); diff --git a/compose/aries-mediator-service/acapy/controller/tsconfig.json b/compose/aries-mediator-service/acapy/controller/tsconfig.json deleted file mode 100644 index f752444027cec93706822e7c7546e05b572a18c0..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/controller/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es2018", - "module": "commonjs", - "outDir": "./lib", - "rootDir": "./", - "strict": true, - "esModuleInterop": true, - "types": ["jest"] - } -} diff --git a/compose/aries-mediator-service/acapy/requirements-latest.txt b/compose/aries-mediator-service/acapy/requirements-latest.txt deleted file mode 100644 index 1cead189ad2c1ad92a6e4cf3556206384b7a0161..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/requirements-latest.txt +++ /dev/null @@ -1,4 +0,0 @@ -# latest aca-py release: -#aries-cloudagent[indy,askar,bbs] -# aca-py main branch in github -git+https://github.com/hyperledger/aries-cloudagent-python.git#egg=aries-cloudagent[indy,askar,bbs] diff --git a/compose/aries-mediator-service/acapy/start.sh b/compose/aries-mediator-service/acapy/start.sh deleted file mode 100644 index 72f5d7f882fa7b373bfd801df11e6acd45f8e775..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/acapy/start.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -euxo pipefail - -MEDIATOR_URL=${MEDIATOR_ENDPOINT_URL} - -echo "Starting agent with endpoint(s): ${MEDIATOR_URL} wss://${MEDIATOR_URL#*://*}" - -aca-py start \ - --auto-provision \ - --arg-file ${MEDIATOR_ARG_FILE} \ - --label "${MEDIATOR_AGENT_LABEL}" \ - --inbound-transport http 0.0.0.0 ${MEDIATOR_AGENT_HTTP_IN_PORT} \ - --inbound-transport ws 0.0.0.0 ${MEDIATOR_AGENT_WS_IN_PORT} \ - --outbound-transport ws \ - --outbound-transport http \ - --wallet-type indy \ - --wallet-storage-type postgres_storage \ - --admin 0.0.0.0 ${MEDIATOR_AGENT_HTTP_ADMIN_PORT} \ - --admin-api-key ${MEDIATOR_AGENT_ADMIN_API_KEY} \ - --endpoint ${MEDIATOR_URL} wss://${MEDIATOR_URL#*://*} diff --git a/compose/aries-mediator-service/caddy/Caddyfile b/compose/aries-mediator-service/caddy/Caddyfile deleted file mode 100644 index e19d47e9e15a69ec942bebb49b5f639f7944978e..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/caddy/Caddyfile +++ /dev/null @@ -1,27 +0,0 @@ -# Listen on all interfaces, default Caddy port -:2015 { - - # This is the pattern that will be used to detect - # WebSockets - @websockets { - header Connection *Upgrade* - header Upgrade websocket - } - - # Handle any traffic that matches the `@websockets` pattern - handle @websockets { - reverse_proxy http://mediator:3001 - } - - # Handle all other traffic. - handle { - reverse_proxy http://mediator:3000 - } - - # What logs should look like. - log { - output stdout - # format single_field common_log - level DEBUG - } -} diff --git a/compose/aries-mediator-service/docker-compose.yml b/compose/aries-mediator-service/docker-compose.yml deleted file mode 100644 index 4cbb954dc51a4f295226a8096ddffd95de86472c..0000000000000000000000000000000000000000 --- a/compose/aries-mediator-service/docker-compose.yml +++ /dev/null @@ -1,132 +0,0 @@ -version: '3' - -networks: - mediator-network: - -volumes: - agency-wallet: - mediator-controller-data: - -# x-env: &defaults -# MEDIATOR_CONTROLLER_PORT: ${MEDIATOR_CONTROLLER_PORT:-3010} - -services: - caddy: - image: caddy - hostname: caddy - networks: - - mediator-network - ports: # Uncomment to access caddy outside of containers - - 8080:2015 - # - 2019:2019 - volumes: - - ./caddy/Caddyfile:/etc/caddy/Caddyfile - healthcheck: - # Port 2019 is an internal Caddy admin port. - test: nc -zv localhost:2019 || exit -1 - interval: 3s - timeout: 3s - retries: 5 - - # ngrok: - # image: ngrok/ngrok - # # restart: unless-stopped - # hostname: ngrok - # depends_on: - # - caddy - # networks: - # - mediator-network - # environment: - # - NGROK_AUTHTOKEN=${NGROK_AUTHTOKEN} - # command: http caddy:2015 --log stdout - # # ports: # Uncomment to access ngrok outside of containers - # # - 4040:4040 # admin port - # healthcheck: - # test: /bin/bash -c "</dev/tcp/ngrok/4040" - # interval: 3s - # timeout: 3s - # retries: 5 - - # mediator-controller: - # image: node:fermium - # # restart: unless-stopped - # environment: - # - PORT=${MEDIATOR_CONTROLLER_PORT:-3010} - # - CONTROLLER_ADMIN_API_KEY=${MEDIATOR_CONTROLLER_ADMIN_API_KEY} - # - MEDIATOR_ADMIN_URL=${MEDIATOR_AGENT_ADMIN_URL-http://mediator:3002} - # - MEDIATOR_ADMIN_API_KEY=${MEDIATOR_AGENT_ADMIN_API_KEY} - # - MEDIATOR_ALIAS=${MEDIATOR_ALIAS} - # - LOG_LEVEL=${LOG_LEVEL} - # volumes: - # - ./acapy/controller:/usr/src/controller - # - mediator-controller-data:/usr/src/controller/node_modules - # # ports: # Uncomment to access controller outside of containers - # # - ${MEDIATOR_CONTROLLER_PORT:-3010}:${MEDIATOR_CONTROLLER_PORT:-3010} - # networks: - # - mediator-network - # working_dir: /usr/src/controller - # entrypoint: /bin/bash - # command: ["-c", "npm install; npm run dev"] - # healthcheck: - # test: /bin/bash -c "</dev/tcp/mediator-controller/3010" - # interval: 5s - # timeout: 5s - # retries: 5 - - mediator: - build: - context: . - dockerfile: acapy/Dockerfile.acapy - depends_on: - # mediator-controller: - # condition: service_healthy - - db - # ngrok: - # condition: service_healthy - restart: unless-stopped - environment: - - ENV=${ENV:-local} - - POSTGRESQL_HOST=${POSTGRESQL_HOST:-db} - - POSTGRESQL_PORT=${POSTGRESQL_PORT:-5435} - - ACAPY_WALLET_STORAGE_CONFIG={"url":"${POSTGRESQL_HOST:-db}:${POSTGRESQL_PORT:-5432}","wallet_scheme":"DatabasePerWallet"} - - ACAPY_WALLET_STORAGE_CREDS={"account":"${POSTGRESQL_USER:-postgres}","password":"${POSTGRESQL_PASSWORD:-development}","admin_account":"${POSTGRESQL_ADMIN_USER:-postgres}","admin_password":"${POSTGRESQL_ADMIN_PASSWORD:-development}"} - - ACAPY_WALLET_NAME=${MEDIATOR_WALLET_NAME:-mediator} - - ACAPY_WALLET_KEY=${MEDIATOR_WALLET_KEY:-testing} - - MEDIATOR_AGENT_HTTP_IN_PORT=${MEDIATOR_AGENT_HTTP_IN_PORT:-3000} - - MEDIATOR_AGENT_WS_IN_PORT=${MEDIATOR_AGENT_WS_IN_PORT:-3001} - - MEDIATOR_AGENT_HTTP_ADMIN_PORT=${MEDIATOR_AGENT_HTTP_ADMIN_PORT:-3002} - - MEDIATOR_AGENT_ADMIN_MODE=${MEDIATOR_AGENT_ADMIN_MODE:-admin-api-key 7gdmVBiJalMj52Oum50yD8neu/nxmv3/DTWcZPyKZ4K2UdNNwSPKgg==} - - MEDIATOR_AGENT_LABEL=${MEDIATOR_AGENT_LABEL:-Mediator} - - MEDIATOR_ENDPOINT_URL=${MEDIATOR_ENDPOINT_URL:-localhost} - - MEDIATOR_ARG_FILE=${MEDIATOR_ARG_FILE:-./configs/mediator-auto-accept.yml} - - MEDIATOR_CONTROLLER_WEBHOOK=${MEDIATOR_CONTROLLER_WEBHOOK:-http://mediator-controller:3010/webhooks} - - MEDIATOR_AGENT_ADMIN_API_KEY=${MEDIATOR_AGENT_ADMIN_API_KEY} - - LOG_LEVEL=${LOG_LEVEL:-INFO} - # ports: # Uncomment to access mediator outside of containers - # - ${MEDIATOR_AGENT_HTTP_ADMIN_PORT:-3002}:${MEDIATOR_AGENT_HTTP_ADMIN_PORT:-3002} - # - ${MEDIATOR_AGENT_HTTP_IN_PORT:-3000}:${MEDIATOR_AGENT_HTTP_IN_PORT:-3000} - # - ${MEDIATOR_AGENT_WS_IN_PORT:-3001}:${MEDIATOR_AGENT_WS_IN_PORT:-3001} - networks: - - mediator-network - healthcheck: - test: /bin/bash -c "</dev/tcp/mediator/3000" - interval: 5s - timeout: 5s - retries: 5 - - db: - image: postgres:14.1-alpine - # restart: always - environment: - POSTGRES_PASSWORD: ${POSTGRESQL_ADMIN_PASSWORD:-development} - ports: # Uncomment to access postgres outside of containers - - '5435:5432' - networks: - - mediator-network - volumes: - - agency-wallet:/var/lib/pgsql/data - healthcheck: - test: pg_isready -U postgres - interval: 3s - timeout: 3s - retries: 5 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99db94e3da2d0a83864460ad15e993994a489098..76b22374c96408a8ee1983c047790e54d4bad2b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,42 +195,33 @@ importers: apps/connection-manager: dependencies: - '@elastic/ecs-winston-format': - specifier: ^1.5.0 - version: 1.5.2 - '@nestjs/axios': - specifier: ^3.0.1 - version: 3.0.1(@nestjs/common@10.3.0)(axios@1.6.5)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/common': - specifier: ^10.2.8 + specifier: ^10.3.0 version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/config': specifier: ^3.1.1 version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) '@nestjs/core': - specifier: ^10.2.8 + specifier: ^10.3.0 version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@nestjs/mapped-types': - specifier: ^2.0.4 - version: 2.0.4(@nestjs/common@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) '@nestjs/microservices': - specifier: ^10.2.8 + specifier: ^10.3.0 version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/platform-express': - specifier: ^10.2.8 + specifier: ^10.3.0 version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0) '@nestjs/schedule': specifier: ^4.0.0 version: 4.0.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(reflect-metadata@0.1.14) '@nestjs/swagger': - specifier: ^7.1.16 + specifier: ^7.1.17 version: 7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) - '@nestjs/terminus': - specifier: ^10.1.1 - version: 10.2.0(@nestjs/axios@3.0.1)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@prisma/client@5.8.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) - '@prisma/client': - specifier: ^5.6.0 - version: 5.8.1(prisma@5.8.1) + '@ocm/shared': + specifier: workspace:* + version: link:../shared + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 class-validator: specifier: ^0.14.0 version: 0.14.1 @@ -240,15 +231,6 @@ importers: joi: specifier: ^17.11.0 version: 17.11.1 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - jwks-rsa: - specifier: ^3.1.0 - version: 3.1.0 - moment: - specifier: ^2.29.4 - version: 2.30.1 nats: specifier: ^2.18.0 version: 2.19.0 @@ -258,12 +240,6 @@ importers: rxjs: specifier: ^7.8.1 version: 7.8.1 - winston: - specifier: ^3.11.0 - version: 3.11.0 - winston-elasticsearch: - specifier: ^0.17.4 - version: 0.17.4 devDependencies: '@jest/globals': specifier: ^29.7.0 @@ -275,13 +251,13 @@ importers: specifier: ^10.0.3 version: 10.1.0(chokidar@3.5.3)(typescript@5.3.3) '@nestjs/testing': - specifier: ^10.2.8 + specifier: ^10.3.0 version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0) '@swc/cli': - specifier: ^0.1.62 + specifier: ^0.1.63 version: 0.1.63(@swc/core@1.3.103) '@swc/core': - specifier: ^1.3.96 + specifier: ^1.3.101 version: 1.3.103 '@swc/jest': specifier: ^0.2.29 @@ -290,49 +266,19 @@ importers: specifier: ^4.17.21 version: 4.17.21 '@types/jest': - specifier: 27.0.2 - version: 27.0.2 - '@types/jsonwebtoken': - specifier: ^9.0.5 - version: 9.0.5 + specifier: 29.5.11 + version: 29.5.11 '@types/node': - specifier: ^20.9.0 + specifier: ^20.10.5 version: 20.11.5 - '@types/simple-oauth2': - specifier: ^5.0.7 - version: 5.0.7 - '@types/supertest': - specifier: ^2.0.16 - version: 2.0.16 - dotenv-cli: - specifier: ^7.3.0 - version: 7.3.0 jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.11.5)(ts-node@10.9.2) - node-mocks-http: - specifier: ^1.13.0 - version: 1.14.1 - prisma: - specifier: ^5.6.0 - version: 5.8.1 rimraf: specifier: ^5.0.5 version: 5.0.5 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - supertest: - specifier: ^6.3.3 - version: 6.3.4 - swagger-ui-express: - specifier: ^5.0.0 - version: 5.0.0(express@4.18.2) - ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.3.103)(@types/node@20.11.5)(typescript@5.3.3) typescript: - specifier: ^5.2.2 + specifier: ^5.3.3 version: 5.3.3 apps/credential-manager: @@ -455,6 +401,9 @@ importers: '@ocm/shared': specifier: workspace:* version: link:../shared + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 class-validator: specifier: ^0.14.0 version: 0.14.1 @@ -629,19 +578,19 @@ importers: specifier: ^3.0.1 version: 3.0.1(@nestjs/common@10.3.0)(axios@1.6.5)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/common': - specifier: ^10.2.10 + specifier: ^10.3.0 version: 10.3.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/config': specifier: ^3.1.1 version: 3.1.1(@nestjs/common@10.3.0)(reflect-metadata@0.1.14) '@nestjs/microservices': - specifier: ^10.2.10 + specifier: ^10.3.0 version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(nats@2.19.0)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/swagger': - specifier: ^7.1.16 + specifier: ^7.1.17 version: 7.2.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) '@nestjs/terminus': - specifier: ^10.1.1 + specifier: ^10.2.0 version: 10.2.0(@nestjs/axios@3.0.1)(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@prisma/client@5.8.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) axios: specifier: ^1.6.2 @@ -669,7 +618,7 @@ importers: specifier: ^10.2.1 version: 10.3.0 '@nestjs/testing': - specifier: ^10.2.10 + specifier: ^10.3.0 version: 10.3.0(@nestjs/common@10.3.0)(@nestjs/core@10.3.0)(@nestjs/microservices@10.3.0)(@nestjs/platform-express@10.3.0) '@types/jest': specifier: ^29.5.9 @@ -693,7 +642,7 @@ importers: specifier: ^4.2.0 version: 4.2.0 typescript: - specifier: ^5.3.2 + specifier: ^5.3.3 version: 5.3.3 apps/ssi-abstraction: @@ -5089,13 +5038,6 @@ packages: dependencies: '@types/istanbul-lib-report': 3.0.3 - /@types/jest@27.0.2: - resolution: {integrity: sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==} - dependencies: - jest-diff: 27.5.1 - pretty-format: 27.5.1 - dev: true - /@types/jest@29.5.11: resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} dependencies: @@ -5197,10 +5139,6 @@ packages: '@types/mime': 3.0.4 '@types/node': 20.11.5 - /@types/simple-oauth2@5.0.7: - resolution: {integrity: sha512-8JbWVJbiTSBQP/7eiyGKyXWAqp3dKQZpaA+pdW16FCi32ujkzRMG8JfjoAzdWt6W8U591ZNdHcPtP2D7ILTKuA==} - dev: true - /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -7406,11 +7344,6 @@ packages: resolution: {integrity: sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==} dev: false - /diff-sequences@27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9918,16 +9851,6 @@ packages: - supports-color dev: true - /jest-diff@27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9967,11 +9890,6 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /jest-get-type@27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - /jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -12458,15 +12376,6 @@ packages: dev: false optional: true - /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: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -12693,6 +12602,8 @@ packages: /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false + optional: true /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -13940,6 +13851,7 @@ packages: /swagger-ui-dist@5.11.0: resolution: {integrity: sha512-j0PIATqQSEFGOLmiJOJZj1X1Jt6bFIur3JpY7+ghliUnfZs0fpWDdHEkn9q7QUlBtKbkn6TepvSxTqnE8l3s0A==} + dev: false /swagger-ui-express@5.0.0(express@4.18.2): resolution: {integrity: sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==} @@ -13949,6 +13861,7 @@ packages: dependencies: express: 4.18.2 swagger-ui-dist: 5.11.0 + dev: false /symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}