From 9fee97fbbb87029f65aad3c665f4b8640ff3a66e Mon Sep 17 00:00:00 2001 From: Andrew Richardson Date: Thu, 29 Dec 2022 12:17:54 -0500 Subject: [PATCH 1/3] Split token listener into a separate file Signed-off-by: Andrew Richardson --- .../eventstream-proxy.base.ts | 2 +- src/tokens/tokens.listener.ts | 343 ++++++++++++++++++ src/tokens/tokens.service.ts | 321 +--------------- 3 files changed, 348 insertions(+), 318 deletions(-) create mode 100644 src/tokens/tokens.listener.ts diff --git a/src/eventstream-proxy/eventstream-proxy.base.ts b/src/eventstream-proxy/eventstream-proxy.base.ts index eb0ab6c..bb4d928 100644 --- a/src/eventstream-proxy/eventstream-proxy.base.ts +++ b/src/eventstream-proxy/eventstream-proxy.base.ts @@ -190,7 +190,7 @@ export abstract class EventStreamProxyBase extends WebSocketEventsBase { return; } - const inflight = this.awaitingAck.find(msg => msg.id === data.id) + const inflight = this.awaitingAck.find(msg => msg.id === data.id); this.logger.log(`Received ack ${data.id} inflight=${!!inflight}`); if (this.socket !== undefined && inflight !== undefined) { this.awaitingAck = this.awaitingAck.filter(msg => msg.id !== data.id); diff --git a/src/tokens/tokens.listener.ts b/src/tokens/tokens.listener.ts new file mode 100644 index 0000000..86977a4 --- /dev/null +++ b/src/tokens/tokens.listener.ts @@ -0,0 +1,343 @@ +// Copyright © 2021 Kaleido, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Logger } from '@nestjs/common'; +import { abi as ERC1155MixedFungibleAbi } from '../abi/ERC1155MixedFungible.json'; +import { Event } from '../event-stream/event-stream.interfaces'; +import { EventListener, EventProcessor } from '../eventstream-proxy/eventstream-proxy.interfaces'; +import { WebSocketMessage } from '../websocket-events/websocket-events.base'; +import { + ApprovalForAllEvent, + TokenApprovalEvent, + TokenBurnEvent, + TokenPoolCreationEvent, + TokenMintEvent, + TokenPoolEvent, + TokenTransferEvent, + TokenType, + TransferBatchEvent, + TransferSingleEvent, + TokenPoolEventInfo, +} from './tokens.interfaces'; +import { + decodeHex, + encodeHexIDForURI, + packPoolLocator, + unpackPoolLocator, + unpackSubscriptionName, + unpackTokenId, +} from './tokens.util'; +import { BASE_SUBSCRIPTION_NAME, TokensService } from './tokens.service'; + +const TOKEN_STANDARD = 'ERC1155'; +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; + +const tokenCreateEventSignatureOld = 'TokenCreate(address,uint256,bytes)'; +const tokenCreateEventSignature = 'TokenPoolCreation(address,uint256,bytes)'; +const transferSingleEventSignature = 'TransferSingle(address,address,address,uint256,uint256)'; +const transferBatchEventSignature = 'TransferBatch(address,address,address,uint256[],uint256[])'; +const approvalForAllEventSignature = 'ApprovalForAll(address,address,bool)'; + +export class TokenListener implements EventListener { + private readonly logger = new Logger(TokenListener.name); + + constructor(private readonly service: TokensService) {} + + async onEvent(subName: string, event: Event, process: EventProcessor) { + switch (this.trimEventSignature(event.signature)) { + case tokenCreateEventSignatureOld: + case tokenCreateEventSignature: + process(await this.transformTokenPoolCreationEvent(subName, event)); + break; + case transferSingleEventSignature: + process(await this.transformTransferSingleEvent(subName, event)); + break; + case approvalForAllEventSignature: + process(this.transformApprovalForAllEvent(subName, event)); + break; + case transferBatchEventSignature: + for (const msg of await this.transformTransferBatchEvent(subName, event)) { + process(msg); + } + break; + default: + this.logger.error(`Unknown event signature: ${event.signature}`); + return undefined; + } + } + + /** + * Generate an event ID in the recognized FireFly format for Ethereum + * (zero-padded block number, transaction index, and log index) + */ + private formatBlockchainEventId(event: Event) { + const blockNumber = event.blockNumber ?? '0'; + const txIndex = BigInt(event.transactionIndex).toString(10); + const logIndex = event.logIndex ?? '0'; + return [ + blockNumber.padStart(12, '0'), + txIndex.padStart(6, '0'), + logIndex.padStart(6, '0'), + ].join('/'); + } + + private stripParamsFromSignature(signature: string) { + return signature.substring(0, signature.indexOf('(')); + } + + private trimEventSignature(signature: string) { + const firstColon = signature.indexOf(':'); + if (firstColon > 0) { + return signature.substring(firstColon + 1); + } + return signature; + } + + private async transformTokenPoolCreationEvent( + subName: string, + event: TokenPoolCreationEvent, + ): Promise { + const { data: output } = event; + const unpackedId = unpackTokenId(output.type_id); + const unpackedSub = unpackSubscriptionName(subName); + const decodedData = decodeHex(output.data ?? ''); + + if (unpackedSub.poolLocator === undefined) { + // should not happen + return undefined; + } + + let packedPoolLocator = unpackedSub.poolLocator; + const poolLocator = unpackPoolLocator(packedPoolLocator); + if (poolLocator.poolId === BASE_SUBSCRIPTION_NAME) { + packedPoolLocator = packPoolLocator( + event.address.toLowerCase(), + unpackedId.poolId, + event.blockNumber, + ); + } else if (poolLocator.poolId !== unpackedId.poolId) { + return undefined; + } + + const eventInfo: TokenPoolEventInfo = { + address: event.address, + typeId: '0x' + encodeHexIDForURI(output.type_id), + }; + + if (await this.service.isCustomUriSupported(event.address)) { + eventInfo.baseUri = await this.service.queryBaseUri(event.address); + } + + return { + event: 'token-pool', + data: { + standard: TOKEN_STANDARD, + poolLocator: packedPoolLocator, + type: unpackedId.isFungible ? TokenType.FUNGIBLE : TokenType.NONFUNGIBLE, + signer: output.operator, + data: decodedData, + info: eventInfo, + blockchain: { + id: this.formatBlockchainEventId(event), + name: this.stripParamsFromSignature(this.trimEventSignature(event.signature)), + location: 'address=' + event.address, + signature: this.trimEventSignature(event.signature), + timestamp: event.timestamp, + output, + info: { + blockNumber: event.blockNumber, + transactionIndex: event.transactionIndex, + transactionHash: event.transactionHash, + logIndex: event.logIndex, + address: event.address, + signature: this.trimEventSignature(event.signature), + }, + }, + }, + }; + } + + private async transformTransferSingleEvent( + subName: string, + event: TransferSingleEvent, + eventIndex?: number, + ): Promise { + const { data: output } = event; + const unpackedId = unpackTokenId(output.id); + const unpackedSub = unpackSubscriptionName(subName); + const decodedData = decodeHex(event.inputArgs?.data ?? ''); + + if (unpackedSub.poolLocator === undefined) { + // should not happen + return undefined; + } + + const poolLocator = unpackPoolLocator(unpackedSub.poolLocator); + if (poolLocator.poolId !== unpackedId.poolId) { + // this transfer is not from the subscribed pool + return undefined; + } + if (output.from === ZERO_ADDRESS && output.to === ZERO_ADDRESS) { + // should not happen + return undefined; + } + + const uri = unpackedId.isFungible + ? undefined + : await this.getTokenUri(event.address, output.id); + const eventId = this.formatBlockchainEventId(event); + const transferId = + eventIndex === undefined ? eventId : eventId + '/' + eventIndex.toString(10).padStart(6, '0'); + + const commonData = { + id: transferId, + poolData: unpackedSub.poolData, + poolLocator: unpackedSub.poolLocator, + tokenIndex: unpackedId.tokenIndex, + uri, + amount: output.value, + signer: output.operator, + data: decodedData, + blockchain: { + id: eventId, + name: this.stripParamsFromSignature(this.trimEventSignature(event.signature)), + location: 'address=' + event.address, + signature: this.trimEventSignature(event.signature), + timestamp: event.timestamp, + output, + info: { + blockNumber: event.blockNumber, + transactionIndex: event.transactionIndex, + transactionHash: event.transactionHash, + logIndex: event.logIndex, + address: event.address, + signature: this.trimEventSignature(event.signature), + }, + }, + }; + + if (output.from === ZERO_ADDRESS) { + return { + event: 'token-mint', + data: { ...commonData, to: output.to }, + }; + } else if (output.to === ZERO_ADDRESS) { + return { + event: 'token-burn', + data: { ...commonData, from: output.from }, + }; + } else { + return { + event: 'token-transfer', + data: { ...commonData, from: output.from, to: output.to }, + }; + } + } + + private async transformTransferBatchEvent( + subName: string, + event: TransferBatchEvent, + ): Promise { + const messages: WebSocketMessage[] = []; + for (let i = 0; i < event.data.ids.length; i++) { + const message = await this.transformTransferSingleEvent( + subName, + { + ...event, + data: { + from: event.data.from, + to: event.data.to, + operator: event.data.operator, + id: event.data.ids[i], + value: event.data.values[i], + }, + }, + i, + ); + if (message !== undefined) { + messages.push(message); + } + } + return messages; + } + + private transformApprovalForAllEvent( + subName: string, + event: ApprovalForAllEvent, + ): WebSocketMessage | undefined { + const { data: output } = event; + const unpackedSub = unpackSubscriptionName(subName); + const decodedData = decodeHex(event.inputArgs?.data ?? ''); + + if (unpackedSub.poolLocator === undefined) { + // should not happen + return undefined; + } + const poolLocator = unpackPoolLocator(unpackedSub.poolLocator); + + // One event may apply across multiple pools + // Include the poolId to generate a unique approvalId per pool + const eventId = this.formatBlockchainEventId(event); + const approvalId = eventId + '/' + poolLocator.poolId; + + return { + event: 'token-approval', + data: { + id: approvalId, + poolData: unpackedSub.poolData, + subject: `${output.account}:${output.operator}`, + poolLocator: unpackedSub.poolLocator, + operator: output.operator, + approved: output.approved, + signer: output.account, + data: decodedData, + blockchain: { + id: eventId, + name: this.stripParamsFromSignature(this.trimEventSignature(event.signature)), + location: 'address=' + event.address, + signature: this.trimEventSignature(event.signature), + timestamp: event.timestamp, + output, + info: { + blockNumber: event.blockNumber, + transactionIndex: event.transactionIndex, + transactionHash: event.transactionHash, + logIndex: event.logIndex, + address: event.address, + signature: this.trimEventSignature(event.signature), + }, + }, + }, + }; + } + + private async getTokenUri(address: string, id: string): Promise { + try { + const response = await this.service.query( + address, + ERC1155MixedFungibleAbi.find(m => m.name === 'uri'), + [id], + ); + const output = response.output as string; + if (output.includes('{id}') === true) { + return output.replace('{id}', encodeHexIDForURI(id)); + } + return output; + } catch (err) { + return ''; + } + } +} diff --git a/src/tokens/tokens.service.ts b/src/tokens/tokens.service.ts index 55a4858..2d53e12 100644 --- a/src/tokens/tokens.service.ts +++ b/src/tokens/tokens.service.ts @@ -26,69 +26,47 @@ import { import { lastValueFrom } from 'rxjs'; import { abi as ERC1155MixedFungibleAbi } from '../abi/ERC1155MixedFungible.json'; import { EventStreamService } from '../event-stream/event-stream.service'; -import { Event, EventStream, EventStreamReply } from '../event-stream/event-stream.interfaces'; +import { EventStream, EventStreamReply } from '../event-stream/event-stream.interfaces'; import { EventStreamProxyGateway } from '../eventstream-proxy/eventstream-proxy.gateway'; -import { EventListener, EventProcessor } from '../eventstream-proxy/eventstream-proxy.interfaces'; -import { WebSocketMessage } from '../websocket-events/websocket-events.base'; import { basicAuth } from '../utils'; import { - ApprovalForAllEvent, AsyncResponse, ContractInfoResponse, EthConnectAsyncResponse, EthConnectReturn, IAbiMethod, TokenApproval, - TokenApprovalEvent, TokenBalance, TokenBalanceQuery, TokenBurn, - TokenBurnEvent, - TokenPoolCreationEvent, TokenMint, - TokenMintEvent, TokenPool, TokenPoolActivate, - TokenPoolEvent, TokenTransfer, - TokenTransferEvent, TokenType, - TransferBatchEvent, - TransferSingleEvent, - TokenPoolEventInfo, - TokenPoolConfig, } from './tokens.interfaces'; import { - decodeHex, encodeHex, - encodeHexIDForURI, isFungible, - packPoolLocator, packStreamName, packSubscriptionName, packTokenId, unpackPoolLocator, unpackSubscriptionName, - unpackTokenId, } from './tokens.util'; +import { TokenListener } from './tokens.listener'; + +export const BASE_SUBSCRIPTION_NAME = 'base'; -const TOKEN_STANDARD = 'ERC1155'; -const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; -const BASE_SUBSCRIPTION_NAME = 'base'; const CUSTOM_URI_IID = '0xa1d87d57'; const sendTransactionHeader = 'SendTransaction'; const queryHeader = 'Query'; const tokenCreateFunctionName = 'create'; const tokenCreateEvent = 'TokenPoolCreation'; -const tokenCreateEventSignatureOld = 'TokenCreate(address,uint256,bytes)'; -const tokenCreateEventSignature = 'TokenPoolCreation(address,uint256,bytes)'; const transferSingleEvent = 'TransferSingle'; -const transferSingleEventSignature = 'TransferSingle(address,address,address,uint256,uint256)'; const transferBatchEvent = 'TransferBatch'; -const transferBatchEventSignature = 'TransferBatch(address,address,address,uint256[],uint256[])'; const approvalForAllEvent = 'ApprovalForAll'; -const approvalForAllEventSignature = 'ApprovalForAll(address,address,bool)'; const ALL_SUBSCRIBED_EVENTS = [ tokenCreateEvent, @@ -610,294 +588,3 @@ export class TokensService { return { balance: response.output }; } } - -class TokenListener implements EventListener { - private readonly logger = new Logger(TokenListener.name); - - constructor(private readonly service: TokensService) {} - - async onEvent(subName: string, event: Event, process: EventProcessor) { - switch (this.trimEventSignature(event.signature)) { - case tokenCreateEventSignatureOld: - case tokenCreateEventSignature: - process(await this.transformTokenPoolCreationEvent(subName, event)); - break; - case transferSingleEventSignature: - process(await this.transformTransferSingleEvent(subName, event)); - break; - case approvalForAllEventSignature: - process(this.transformApprovalForAllEvent(subName, event)); - break; - case transferBatchEventSignature: - for (const msg of await this.transformTransferBatchEvent(subName, event)) { - process(msg); - } - break; - default: - this.logger.error(`Unknown event signature: ${event.signature}`); - return undefined; - } - } - - /** - * Generate an event ID in the recognized FireFly format for Ethereum - * (zero-padded block number, transaction index, and log index) - */ - private formatBlockchainEventId(event: Event) { - const blockNumber = event.blockNumber ?? '0'; - const txIndex = BigInt(event.transactionIndex).toString(10); - const logIndex = event.logIndex ?? '0'; - return [ - blockNumber.padStart(12, '0'), - txIndex.padStart(6, '0'), - logIndex.padStart(6, '0'), - ].join('/'); - } - - private stripParamsFromSignature(signature: string) { - return signature.substring(0, signature.indexOf('(')); - } - - private trimEventSignature(signature: string) { - const firstColon = signature.indexOf(':'); - if (firstColon > 0) { - return signature.substring(firstColon + 1); - } - return signature; - } - - private async transformTokenPoolCreationEvent( - subName: string, - event: TokenPoolCreationEvent, - ): Promise { - const { data: output } = event; - const unpackedId = unpackTokenId(output.type_id); - const unpackedSub = unpackSubscriptionName(subName); - const decodedData = decodeHex(output.data ?? ''); - - if (unpackedSub.poolLocator === undefined) { - // should not happen - return undefined; - } - - let packedPoolLocator = unpackedSub.poolLocator; - const poolLocator = unpackPoolLocator(packedPoolLocator); - if (poolLocator.poolId === BASE_SUBSCRIPTION_NAME) { - packedPoolLocator = packPoolLocator( - event.address.toLowerCase(), - unpackedId.poolId, - event.blockNumber, - ); - } else if (poolLocator.poolId !== unpackedId.poolId) { - return undefined; - } - - const eventInfo: TokenPoolEventInfo = { - address: event.address, - typeId: '0x' + encodeHexIDForURI(output.type_id), - }; - - if (await this.service.isCustomUriSupported(event.address)) { - eventInfo.baseUri = await this.service.queryBaseUri(event.address); - } - - return { - event: 'token-pool', - data: { - standard: TOKEN_STANDARD, - poolLocator: packedPoolLocator, - type: unpackedId.isFungible ? TokenType.FUNGIBLE : TokenType.NONFUNGIBLE, - signer: output.operator, - data: decodedData, - info: eventInfo, - blockchain: { - id: this.formatBlockchainEventId(event), - name: this.stripParamsFromSignature(this.trimEventSignature(event.signature)), - location: 'address=' + event.address, - signature: this.trimEventSignature(event.signature), - timestamp: event.timestamp, - output, - info: { - blockNumber: event.blockNumber, - transactionIndex: event.transactionIndex, - transactionHash: event.transactionHash, - logIndex: event.logIndex, - address: event.address, - signature: this.trimEventSignature(event.signature), - }, - }, - }, - }; - } - - private async transformTransferSingleEvent( - subName: string, - event: TransferSingleEvent, - eventIndex?: number, - ): Promise { - const { data: output } = event; - const unpackedId = unpackTokenId(output.id); - const unpackedSub = unpackSubscriptionName(subName); - const decodedData = decodeHex(event.inputArgs?.data ?? ''); - - if (unpackedSub.poolLocator === undefined) { - // should not happen - return undefined; - } - - const poolLocator = unpackPoolLocator(unpackedSub.poolLocator); - if (poolLocator.poolId !== unpackedId.poolId) { - // this transfer is not from the subscribed pool - return undefined; - } - if (output.from === ZERO_ADDRESS && output.to === ZERO_ADDRESS) { - // should not happen - return undefined; - } - - const uri = unpackedId.isFungible - ? undefined - : await this.getTokenUri(event.address, output.id); - const eventId = this.formatBlockchainEventId(event); - const transferId = - eventIndex === undefined ? eventId : eventId + '/' + eventIndex.toString(10).padStart(6, '0'); - - const commonData = { - id: transferId, - poolData: unpackedSub.poolData, - poolLocator: unpackedSub.poolLocator, - tokenIndex: unpackedId.tokenIndex, - uri, - amount: output.value, - signer: output.operator, - data: decodedData, - blockchain: { - id: eventId, - name: this.stripParamsFromSignature(this.trimEventSignature(event.signature)), - location: 'address=' + event.address, - signature: this.trimEventSignature(event.signature), - timestamp: event.timestamp, - output, - info: { - blockNumber: event.blockNumber, - transactionIndex: event.transactionIndex, - transactionHash: event.transactionHash, - logIndex: event.logIndex, - address: event.address, - signature: this.trimEventSignature(event.signature), - }, - }, - }; - - if (output.from === ZERO_ADDRESS) { - return { - event: 'token-mint', - data: { ...commonData, to: output.to }, - }; - } else if (output.to === ZERO_ADDRESS) { - return { - event: 'token-burn', - data: { ...commonData, from: output.from }, - }; - } else { - return { - event: 'token-transfer', - data: { ...commonData, from: output.from, to: output.to }, - }; - } - } - - private async transformTransferBatchEvent( - subName: string, - event: TransferBatchEvent, - ): Promise { - const messages: WebSocketMessage[] = []; - for (let i = 0; i < event.data.ids.length; i++) { - const message = await this.transformTransferSingleEvent( - subName, - { - ...event, - data: { - from: event.data.from, - to: event.data.to, - operator: event.data.operator, - id: event.data.ids[i], - value: event.data.values[i], - }, - }, - i, - ); - if (message !== undefined) { - messages.push(message); - } - } - return messages; - } - - private transformApprovalForAllEvent( - subName: string, - event: ApprovalForAllEvent, - ): WebSocketMessage | undefined { - const { data: output } = event; - const unpackedSub = unpackSubscriptionName(subName); - const decodedData = decodeHex(event.inputArgs?.data ?? ''); - - if (unpackedSub.poolLocator === undefined) { - // should not happen - return undefined; - } - const poolLocator = unpackPoolLocator(unpackedSub.poolLocator); - - // One event may apply across multiple pools - // Include the poolId to generate a unique approvalId per pool - const eventId = this.formatBlockchainEventId(event); - const approvalId = eventId + '/' + poolLocator.poolId; - - return { - event: 'token-approval', - data: { - id: approvalId, - poolData: unpackedSub.poolData, - subject: `${output.account}:${output.operator}`, - poolLocator: unpackedSub.poolLocator, - operator: output.operator, - approved: output.approved, - signer: output.account, - data: decodedData, - blockchain: { - id: eventId, - name: this.stripParamsFromSignature(this.trimEventSignature(event.signature)), - location: 'address=' + event.address, - signature: this.trimEventSignature(event.signature), - timestamp: event.timestamp, - output, - info: { - blockNumber: event.blockNumber, - transactionIndex: event.transactionIndex, - transactionHash: event.transactionHash, - logIndex: event.logIndex, - address: event.address, - signature: this.trimEventSignature(event.signature), - }, - }, - }, - }; - } - - private async getTokenUri(address: string, id: string): Promise { - try { - const response = await this.service.query( - address, - ERC1155MixedFungibleAbi.find(m => m.name === 'uri'), - [id], - ); - const output = response.output as string; - if (output.includes('{id}') === true) { - return output.replace('{id}', encodeHexIDForURI(id)); - } - return output; - } catch (err) { - return ''; - } - } -} From bc7038f6779a53cf19a0a73899d26b2fc3d34032 Mon Sep 17 00:00:00 2001 From: Andrew Richardson Date: Thu, 29 Dec 2022 12:33:38 -0500 Subject: [PATCH 2/3] Split blockchain invocation logic into new file Signed-off-by: Andrew Richardson --- .env | 1 - src/health/health.controller.spec.ts | 4 +- src/health/health.controller.ts | 10 +- src/main.ts | 15 +-- src/tokens/blockchain.service.ts | 133 +++++++++++++++++++++++++ src/tokens/tokens.controller.spec.ts | 5 + src/tokens/tokens.controller.ts | 5 +- src/tokens/tokens.listener.ts | 5 +- src/tokens/tokens.module.ts | 5 +- src/tokens/tokens.service.spec.ts | 2 + src/tokens/tokens.service.ts | 144 ++++----------------------- test/app.e2e-context.ts | 7 +- 12 files changed, 180 insertions(+), 156 deletions(-) create mode 100644 src/tokens/blockchain.service.ts diff --git a/.env b/.env index 0256946..bbdf78a 100644 --- a/.env +++ b/.env @@ -3,5 +3,4 @@ ETHCONNECT_URL=http://127.0.0.1:5102 ETHCONNECT_INSTANCE=/contracts/erc1155 CONTRACT_ADDRESS= ETHCONNECT_TOPIC=token -ETHCONNECT_PREFIX=fly AUTO_INIT=true diff --git a/src/health/health.controller.spec.ts b/src/health/health.controller.spec.ts index bcce69e..0277994 100644 --- a/src/health/health.controller.spec.ts +++ b/src/health/health.controller.spec.ts @@ -16,7 +16,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { HealthCheckService, HttpHealthIndicator } from '@nestjs/terminus'; -import { TokensService } from '../tokens/tokens.service'; +import { BlockchainConnectorService } from '../tokens/blockchain.service'; import { HealthController } from './health.controller'; describe('HealthController', () => { @@ -35,7 +35,7 @@ describe('HealthController', () => { useValue: jest.fn(), }, { - provide: TokensService, + provide: BlockchainConnectorService, useValue: jest.fn(), }, ], diff --git a/src/health/health.controller.ts b/src/health/health.controller.ts index 2cc5777..4ea1740 100644 --- a/src/health/health.controller.ts +++ b/src/health/health.controller.ts @@ -16,7 +16,7 @@ import { Controller, Get } from '@nestjs/common'; import { HealthCheckService, HealthCheck, HttpHealthIndicator } from '@nestjs/terminus'; -import { TokensService } from '../tokens/tokens.service'; +import { BlockchainConnectorService } from '../tokens/blockchain.service'; import { basicAuth } from '../utils'; @Controller('health') @@ -24,7 +24,7 @@ export class HealthController { constructor( private health: HealthCheckService, private http: HttpHealthIndicator, - private readonly tokensService: TokensService, + private blockchain: BlockchainConnectorService, ) {} @Get('/liveness') @@ -39,9 +39,9 @@ export class HealthController { return this.health.check([ () => this.http.pingCheck( - 'ethconnect-contract', - this.tokensService.instanceUrl, - basicAuth(this.tokensService.username, this.tokensService.password), + 'ethconnect', + this.blockchain.baseUrl, + basicAuth(this.blockchain.username, this.blockchain.password), ), ]); } diff --git a/src/main.ts b/src/main.ts index e23c2f4..e072a91 100644 --- a/src/main.ts +++ b/src/main.ts @@ -32,6 +32,7 @@ import { TokenTransferEvent, } from './tokens/tokens.interfaces'; import { EventStreamService } from './event-stream/event-stream.service'; +import { BlockchainConnectorService } from './tokens/blockchain.service'; const API_DESCRIPTION = `

All POST APIs are asynchronous. Listen for websocket notifications on /api/ws. @@ -71,24 +72,14 @@ async function bootstrap() { const ethConnectUrl = config.get('ETHCONNECT_URL', ''); const instancePath = config.get('ETHCONNECT_INSTANCE', ''); const topic = config.get('ETHCONNECT_TOPIC', 'token'); - const shortPrefix = config.get('ETHCONNECT_PREFIX', 'fly'); const autoInit = config.get('AUTO_INIT', 'true'); const username = config.get('ETHCONNECT_USERNAME', ''); const password = config.get('ETHCONNECT_PASSWORD', ''); const contractAddress = config.get('CONTRACT_ADDRESS', ''); app.get(EventStreamService).configure(ethConnectUrl, username, password); - app - .get(TokensService) - .configure( - ethConnectUrl, - instancePath, - topic, - shortPrefix, - username, - password, - contractAddress, - ); + app.get(TokensService).configure(ethConnectUrl, instancePath, topic, contractAddress); + app.get(BlockchainConnectorService).configure(ethConnectUrl, username, password); if (autoInit.toLowerCase() !== 'false') { await app.get(TokensService).init(); diff --git a/src/tokens/blockchain.service.ts b/src/tokens/blockchain.service.ts new file mode 100644 index 0000000..16840dd --- /dev/null +++ b/src/tokens/blockchain.service.ts @@ -0,0 +1,133 @@ +// Copyright © 2021 Kaleido, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { ClientRequest } from 'http'; +import { HttpService } from '@nestjs/axios'; +import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; +import { + Injectable, + InternalServerErrorException, + Logger, + NotFoundException, +} from '@nestjs/common'; +import { lastValueFrom } from 'rxjs'; +import { EventStreamReply } from '../event-stream/event-stream.interfaces'; +import { basicAuth } from '../utils'; +import { + ContractInfoResponse, + EthConnectAsyncResponse, + EthConnectReturn, + IAbiMethod, +} from './tokens.interfaces'; + +const sendTransactionHeader = 'SendTransaction'; +const queryHeader = 'Query'; + +@Injectable() +export class BlockchainConnectorService { + private readonly logger = new Logger(BlockchainConnectorService.name); + + baseUrl: string; + username: string; + password: string; + + constructor(private http: HttpService) {} + + configure(baseUrl: string, username: string, password: string) { + this.baseUrl = baseUrl; + this.username = username; + this.password = password; + } + + private requestOptions(): AxiosRequestConfig { + return basicAuth(this.username, this.password); + } + + private async wrapError(response: Promise>) { + return response.catch(err => { + if (axios.isAxiosError(err)) { + const request: ClientRequest | undefined = err.request; + const response: AxiosResponse | undefined = err.response; + const errorMessage = response?.data?.error ?? err.message; + this.logger.warn( + `${request?.path} <-- HTTP ${response?.status} ${response?.statusText}: ${errorMessage}`, + ); + throw new InternalServerErrorException(errorMessage); + } + throw err; + }); + } + + async getContractInfo(url: string) { + const response = await this.wrapError( + lastValueFrom(this.http.get(url, this.requestOptions())), + ); + return response.data; + } + + async query(to: string, method?: IAbiMethod, params?: any[]) { + const response = await this.wrapError( + lastValueFrom( + this.http.post( + this.baseUrl, + { headers: { type: queryHeader }, to, method, params }, + this.requestOptions(), + ), + ), + ); + return response.data; + } + + async sendTransaction( + from: string, + to: string, + id?: string, + method?: IAbiMethod, + params?: any[], + ) { + const response = await this.wrapError( + lastValueFrom( + this.http.post( + this.baseUrl, + { + headers: { id, type: sendTransactionHeader }, + from, + to, + method, + params, + }, + this.requestOptions(), + ), + ), + ); + return response.data; + } + + async getReceipt(id: string): Promise { + const response = await this.wrapError( + lastValueFrom( + this.http.get(new URL(`/reply/${id}`, this.baseUrl).href, { + validateStatus: status => status < 300 || status === 404, + ...basicAuth(this.username, this.password), + }), + ), + ); + if (response.status === 404) { + throw new NotFoundException(); + } + return response.data; + } +} diff --git a/src/tokens/tokens.controller.spec.ts b/src/tokens/tokens.controller.spec.ts index 605c085..0874654 100644 --- a/src/tokens/tokens.controller.spec.ts +++ b/src/tokens/tokens.controller.spec.ts @@ -15,6 +15,7 @@ // limitations under the License. import { Test, TestingModule } from '@nestjs/testing'; +import { BlockchainConnectorService } from './blockchain.service'; import { TokensController } from './tokens.controller'; import { TokensService } from './tokens.service'; @@ -29,6 +30,10 @@ describe('TokensController', () => { provide: TokensService, useValue: jest.fn(), }, + { + provide: BlockchainConnectorService, + useValue: jest.fn(), + }, ], }).compile(); diff --git a/src/tokens/tokens.controller.ts b/src/tokens/tokens.controller.ts index 05d0b70..a06cc29 100644 --- a/src/tokens/tokens.controller.ts +++ b/src/tokens/tokens.controller.ts @@ -17,6 +17,7 @@ import { Body, Controller, Get, HttpCode, Param, Post, Query } from '@nestjs/common'; import { ApiBody, ApiOperation, ApiResponse } from '@nestjs/swagger'; import { EventStreamReply } from '../event-stream/event-stream.interfaces'; +import { BlockchainConnectorService } from './blockchain.service'; import { AsyncResponse, TokenApproval, @@ -32,7 +33,7 @@ import { TokensService } from './tokens.service'; @Controller() export class TokensController { - constructor(private readonly service: TokensService) {} + constructor(private service: TokensService, private blockchain: BlockchainConnectorService) {} @Post('init') @HttpCode(204) @@ -127,6 +128,6 @@ export class TokensController { @ApiOperation({ summary: 'Retrieve the result of an async operation' }) @ApiResponse({ status: 200, type: EventStreamReply }) getReceipt(@Param('id') id: string) { - return this.service.getReceipt(id); + return this.blockchain.getReceipt(id); } } diff --git a/src/tokens/tokens.listener.ts b/src/tokens/tokens.listener.ts index 86977a4..df84a78 100644 --- a/src/tokens/tokens.listener.ts +++ b/src/tokens/tokens.listener.ts @@ -41,6 +41,7 @@ import { unpackTokenId, } from './tokens.util'; import { BASE_SUBSCRIPTION_NAME, TokensService } from './tokens.service'; +import { BlockchainConnectorService } from './blockchain.service'; const TOKEN_STANDARD = 'ERC1155'; const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; @@ -54,7 +55,7 @@ const approvalForAllEventSignature = 'ApprovalForAll(address,address,bool)'; export class TokenListener implements EventListener { private readonly logger = new Logger(TokenListener.name); - constructor(private readonly service: TokensService) {} + constructor(private service: TokensService, private blockchain: BlockchainConnectorService) {} async onEvent(subName: string, event: Event, process: EventProcessor) { switch (this.trimEventSignature(event.signature)) { @@ -326,7 +327,7 @@ export class TokenListener implements EventListener { private async getTokenUri(address: string, id: string): Promise { try { - const response = await this.service.query( + const response = await this.blockchain.query( address, ERC1155MixedFungibleAbi.find(m => m.name === 'uri'), [id], diff --git a/src/tokens/tokens.module.ts b/src/tokens/tokens.module.ts index d621d8b..9c45518 100644 --- a/src/tokens/tokens.module.ts +++ b/src/tokens/tokens.module.ts @@ -20,6 +20,7 @@ import { EventStreamProxyModule } from '../eventstream-proxy/eventstream-proxy.m import { EventStreamModule } from '../event-stream/event-stream.module'; import { TokensController } from './tokens.controller'; import { TokensService } from './tokens.service'; +import { BlockchainConnectorService } from './blockchain.service'; @Module({ imports: [ HttpModule.register({ @@ -29,7 +30,7 @@ import { TokensService } from './tokens.service'; EventStreamProxyModule, ], controllers: [TokensController], - providers: [TokensService], - exports: [TokensService], + providers: [TokensService, BlockchainConnectorService], + exports: [TokensService, BlockchainConnectorService], }) export class TokensModule {} diff --git a/src/tokens/tokens.service.spec.ts b/src/tokens/tokens.service.spec.ts index 4350d49..1a24f54 100644 --- a/src/tokens/tokens.service.spec.ts +++ b/src/tokens/tokens.service.spec.ts @@ -18,6 +18,7 @@ import { HttpService } from '@nestjs/axios'; import { Test, TestingModule } from '@nestjs/testing'; import { EventStreamService } from '../event-stream/event-stream.service'; import { EventStreamProxyGateway } from '../eventstream-proxy/eventstream-proxy.gateway'; +import { BlockchainConnectorService } from './blockchain.service'; import { TokensService } from './tokens.service'; describe('TokensService', () => { @@ -38,6 +39,7 @@ describe('TokensService', () => { const module: TestingModule = await Test.createTestingModule({ providers: [ TokensService, + BlockchainConnectorService, { provide: HttpService, useValue: jest.fn(), diff --git a/src/tokens/tokens.service.ts b/src/tokens/tokens.service.ts index 2d53e12..923886b 100644 --- a/src/tokens/tokens.service.ts +++ b/src/tokens/tokens.service.ts @@ -14,27 +14,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { ClientRequest } from 'http'; -import { HttpService } from '@nestjs/axios'; -import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; -import { - Injectable, - InternalServerErrorException, - Logger, - NotFoundException, -} from '@nestjs/common'; -import { lastValueFrom } from 'rxjs'; +import { Injectable, Logger } from '@nestjs/common'; import { abi as ERC1155MixedFungibleAbi } from '../abi/ERC1155MixedFungible.json'; import { EventStreamService } from '../event-stream/event-stream.service'; -import { EventStream, EventStreamReply } from '../event-stream/event-stream.interfaces'; +import { EventStream } from '../event-stream/event-stream.interfaces'; import { EventStreamProxyGateway } from '../eventstream-proxy/eventstream-proxy.gateway'; -import { basicAuth } from '../utils'; import { AsyncResponse, - ContractInfoResponse, - EthConnectAsyncResponse, - EthConnectReturn, - IAbiMethod, TokenApproval, TokenBalance, TokenBalanceQuery, @@ -55,13 +41,12 @@ import { unpackSubscriptionName, } from './tokens.util'; import { TokenListener } from './tokens.listener'; +import { BlockchainConnectorService } from './blockchain.service'; export const BASE_SUBSCRIPTION_NAME = 'base'; const CUSTOM_URI_IID = '0xa1d87d57'; -const sendTransactionHeader = 'SendTransaction'; -const queryHeader = 'Query'; const tokenCreateFunctionName = 'create'; const tokenCreateEvent = 'TokenPoolCreation'; const transferSingleEvent = 'TransferSingle'; @@ -85,36 +70,22 @@ export class TokensService { instancePath: string; instanceUrl: string; topic: string; - shortPrefix: string; stream: EventStream | undefined; - username: string; - password: string; constructor( - private http: HttpService, private eventstream: EventStreamService, private proxy: EventStreamProxyGateway, + private blockchain: BlockchainConnectorService, ) {} - configure( - baseUrl: string, - instancePath: string, - topic: string, - shortPrefix: string, - username: string, - password: string, - contractAddress: string, - ) { + configure(baseUrl: string, instancePath: string, topic: string, contractAddress: string) { this.baseUrl = baseUrl; this.instancePath = instancePath; this.instanceUrl = new URL(this.instancePath, this.baseUrl).href; this.topic = topic; - this.shortPrefix = shortPrefix; - this.username = username; - this.password = password; this.contractAddress = contractAddress.toLowerCase(); this.proxy.addConnectionListener(this); - this.proxy.addEventListener(new TokenListener(this)); + this.proxy.addEventListener(new TokenListener(this, this.blockchain)); } async onConnect() { @@ -153,24 +124,17 @@ export class TokensService { this.logger.debug( `CONTRACT_ADDRESS is not set, fetching the address using instance url: ${this.instanceUrl}`, ); - const response = await this.wrapError( - lastValueFrom( - this.http.get(this.instanceUrl, { - ...basicAuth(this.username, this.password), - }), - ), - ); - this.contractAddress = '0x' + response.data.address.toLowerCase(); + const data = await this.blockchain.getContractInfo(this.instanceUrl); + this.contractAddress = '0x' + data.address.toLowerCase(); this.logger.debug(`Contract address: ${this.contractAddress}`); } - return this.contractAddress; } async isCustomUriSupported(address: string) { if (this.supportsCustomUri === undefined) { try { - const result = await this.query( + const result = await this.blockchain.query( address, ERC1155MixedFungibleAbi.find(m => m.name === 'supportsInterface'), [CUSTOM_URI_IID], @@ -191,7 +155,7 @@ export class TokensService { async queryBaseUri(address: string) { try { - const result = await this.query( + const result = await this.blockchain.query( address, ERC1155MixedFungibleAbi.find(m => m.name === 'baseTokenUri'), [CUSTOM_URI_IID], @@ -293,78 +257,6 @@ export class TokensService { return false; } - private requestOptions(): AxiosRequestConfig { - return basicAuth(this.username, this.password); - } - - private async wrapError(response: Promise>) { - return response.catch(err => { - if (axios.isAxiosError(err)) { - const request: ClientRequest | undefined = err.request; - const response: AxiosResponse | undefined = err.response; - const errorMessage = response?.data?.error ?? err.message; - this.logger.warn( - `${request?.path} <-- HTTP ${response?.status} ${response?.statusText}: ${errorMessage}`, - ); - throw new InternalServerErrorException(errorMessage); - } - throw err; - }); - } - - async query(to: string, method?: IAbiMethod, params?: any[]) { - const response = await this.wrapError( - lastValueFrom( - this.http.post( - this.baseUrl, - { headers: { type: queryHeader }, to, method, params }, - this.requestOptions(), - ), - ), - ); - return response.data; - } - - async sendTransaction( - from: string, - to: string, - id?: string, - method?: IAbiMethod, - params?: any[], - ) { - const response = await this.wrapError( - lastValueFrom( - this.http.post( - this.baseUrl, - { - headers: { id, type: sendTransactionHeader }, - from, - to, - method, - params, - }, - this.requestOptions(), - ), - ), - ); - return response.data; - } - - async getReceipt(id: string): Promise { - const response = await this.wrapError( - lastValueFrom( - this.http.get(new URL(`/reply/${id}`, this.baseUrl).href, { - validateStatus: status => status < 300 || status === 404, - ...basicAuth(this.username, this.password), - }), - ), - ); - if (response.status === 404) { - throw new NotFoundException(); - } - return response.data; - } - async createPool(dto: TokenPool): Promise { if (dto.config?.address !== undefined && dto.config.address !== '') { await this.createPoolSubscription(dto.config.address, dto.config.blockNumber); @@ -375,7 +267,7 @@ export class TokensService { async createWithAddress(address: string, dto: TokenPool) { this.logger.log(`Create token pool from contract: '${address}'`); - const response = await this.sendTransaction( + const response = await this.blockchain.sendTransaction( dto.signer, address, dto.requestId, @@ -486,7 +378,7 @@ export class TokensService { const address = poolLocator.address ?? (await this.getContractAddress()); const typeId = packTokenId(poolLocator.poolId); if (isFungible(poolLocator.poolId)) { - const response = await this.sendTransaction( + const response = await this.blockchain.sendTransaction( dto.signer, address, dto.requestId, @@ -505,7 +397,7 @@ export class TokensService { } if (dto.uri !== undefined && (await this.isCustomUriSupported(address))) { - const response = await this.sendTransaction( + const response = await this.blockchain.sendTransaction( dto.signer, address, dto.requestId, @@ -514,7 +406,7 @@ export class TokensService { ); return { id: response.id }; } else { - const response = await this.sendTransaction( + const response = await this.blockchain.sendTransaction( dto.signer, address, dto.requestId, @@ -529,7 +421,7 @@ export class TokensService { async approval(dto: TokenApproval): Promise { const poolLocator = unpackPoolLocator(dto.poolLocator); const address = poolLocator.address ?? (await this.getContractAddress()); - const response = await this.sendTransaction( + const response = await this.blockchain.sendTransaction( dto.signer, address, dto.requestId, @@ -542,7 +434,7 @@ export class TokensService { async transfer(dto: TokenTransfer): Promise { const poolLocator = unpackPoolLocator(dto.poolLocator); const address = poolLocator.address ?? (await this.getContractAddress()); - const response = await this.sendTransaction( + const response = await this.blockchain.sendTransaction( dto.signer, address, dto.requestId, @@ -561,7 +453,7 @@ export class TokensService { async burn(dto: TokenBurn): Promise { const poolLocator = unpackPoolLocator(dto.poolLocator); const address = poolLocator.address ?? (await this.getContractAddress()); - const response = await this.sendTransaction( + const response = await this.blockchain.sendTransaction( dto.signer, address, dto.requestId, @@ -580,7 +472,7 @@ export class TokensService { async balance(dto: TokenBalanceQuery): Promise { const poolLocator = unpackPoolLocator(dto.poolLocator); const address = poolLocator.address ?? (await this.getContractAddress()); - const response = await this.query( + const response = await this.blockchain.query( address, ERC1155MixedFungibleAbi.find(m => m.name === 'balanceOf'), [dto.account, packTokenId(poolLocator.poolId, dto.tokenIndex)], diff --git a/test/app.e2e-context.ts b/test/app.e2e-context.ts index 760a9c8..c8e2eb7 100644 --- a/test/app.e2e-context.ts +++ b/test/app.e2e-context.ts @@ -11,10 +11,10 @@ import { EventStreamReply, EventBatch } from '../src/event-stream/event-stream.i import { EventStreamService } from '../src/event-stream/event-stream.service'; import { EventStreamProxyGateway } from '../src/eventstream-proxy/eventstream-proxy.gateway'; import { TokensService } from '../src/tokens/tokens.service'; +import { BlockchainConnectorService } from '../src/tokens/blockchain.service'; export const BASE_URL = 'http://eth'; export const INSTANCE_PATH = '/tokens'; -export const PREFIX = 'fly'; export const TOPIC = 'tokentest'; export const CONTRACT_ADDRESS = '0x888'; @@ -71,9 +71,8 @@ export class TestContext { await this.app.init(); this.app.get(EventStreamProxyGateway).configure('url', TOPIC); - this.app - .get(TokensService) - .configure(BASE_URL, INSTANCE_PATH, TOPIC, PREFIX, '', '', CONTRACT_ADDRESS); + this.app.get(TokensService).configure(BASE_URL, INSTANCE_PATH, TOPIC, CONTRACT_ADDRESS); + this.app.get(BlockchainConnectorService).configure(BASE_URL, '', ''); (this.app.getHttpServer() as Server).listen(); this.server = request(this.app.getHttpServer()); From 321cb60356db958966dc650671093f3aa761f85d Mon Sep 17 00:00:00 2001 From: Andrew Richardson Date: Thu, 29 Dec 2022 12:38:42 -0500 Subject: [PATCH 3/3] Update some package dependencies Signed-off-by: Andrew Richardson --- package-lock.json | 1237 ++++++++++++++++++--------------------------- package.json | 4 +- 2 files changed, 481 insertions(+), 760 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf9af6e..9f0c660 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "ts-jest": "^27.0.5", "ts-loader": "^9.2.6", "ts-node": "^10.2.1", - "tsconfig-paths": "^3.11.0", + "tsconfig-paths": "^4.1.1", "typescript": "^4.4.3" } }, @@ -1353,6 +1353,20 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", @@ -1362,6 +1376,25 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", @@ -1449,6 +1482,39 @@ "acorn": "^8" } }, + "node_modules/@nestjs/cli/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@nestjs/cli/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nestjs/cli/node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/@nestjs/cli/node_modules/typescript": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", @@ -1567,9 +1633,9 @@ } }, "node_modules/@nestjs/core": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.4.4.tgz", - "integrity": "sha512-Ef3yJPuzAttpNfehnGqIV5kHIL9SHptB5F4ERxoU7pT61H3xiYpZw6hSjx68cJO7cc6rm7/N+b4zeuJvFHtvBg==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.4.7.tgz", + "integrity": "sha512-XB9uexHqzr2xkPo6QSiQWJJttyYYLmvQ5My64cFvWFi7Wk2NIus0/xUNInwX3kmFWB6pF1ab5Y2ZBvWdPwGBhw==", "hasInstallScript": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", @@ -1577,7 +1643,7 @@ "iterare": "1.2.1", "object-hash": "3.0.0", "path-to-regexp": "3.2.0", - "tslib": "2.3.1", + "tslib": "2.4.0", "uuid": "8.3.2" }, "funding": { @@ -1604,6 +1670,11 @@ } } }, + "node_modules/@nestjs/core/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/@nestjs/mapped-types": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.1.tgz", @@ -1624,15 +1695,15 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.4.4.tgz", - "integrity": "sha512-n/H83uzw154v6NVVSg6mniZIvYWtYp0dtNpU9O1qdEmDO030p0tBkeIRoDtpeOVvL2fW5PsHiUYS7HY4tNfykQ==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.4.7.tgz", + "integrity": "sha512-lPE5Ltg2NbQGRQIwXWY+4cNrXhJdycbxFDQ8mNxSIuv+LbrJBIdEB/NONk+LLn9N/8d2+I2LsIETGQrPvsejBg==", "dependencies": { "body-parser": "1.20.0", "cors": "2.8.5", - "express": "4.17.3", - "multer": "1.4.4", - "tslib": "2.3.1" + "express": "4.18.1", + "multer": "1.4.4-lts.1", + "tslib": "2.4.0" }, "funding": { "type": "opencollective", @@ -1643,222 +1714,10 @@ "@nestjs/core": "^8.0.0" } }, - "node_modules/@nestjs/platform-express/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nestjs/platform-express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@nestjs/platform-express/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nestjs/platform-express/node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/@nestjs/platform-express/node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "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.7", - "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" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/@nestjs/platform-express/node_modules/express/node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "dependencies": { - "bytes": "3.1.2", - "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.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nestjs/platform-express/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nestjs/platform-express/node_modules/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==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nestjs/platform-express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/@nestjs/platform-express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nestjs/platform-express/node_modules/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=" - }, - "node_modules/@nestjs/platform-express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nestjs/platform-express/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nestjs/platform-express/node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nestjs/platform-express/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/@nestjs/platform-express/node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@nestjs/platform-express/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } + "node_modules/@nestjs/platform-express/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@nestjs/platform-ws": { "version": "8.4.4", @@ -1940,9 +1799,9 @@ } }, "node_modules/@nestjs/terminus": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@nestjs/terminus/-/terminus-8.0.6.tgz", - "integrity": "sha512-HevQNlJzIkiZ5S1Yb+ll4pwiqg8qB5M6G+2LD0hIkUHzWFvVdCAZDIhLhtwjjRGJ76dwC8BFE/YyUC/4reGAzQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/terminus/-/terminus-8.1.1.tgz", + "integrity": "sha512-C+Pm1LZse8ZSfXeZXMTmUIGAmDpov1WRury/cyWj50ceCCCWz7csACNouGBEvjDmBklzfbkxgDH9mOSbm1r54A==", "dependencies": { "check-disk-space": "3.3.0" }, @@ -1954,13 +1813,12 @@ } }, "node_modules/@nestjs/testing": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-8.4.4.tgz", - "integrity": "sha512-eGj0Lbi0ONMkjDKbKQHoGX+ecGdrGRZ81I8i6fH4dx9jIR0p4MsBlW964f6Swn1MGkPm/xxomJmBWLPqZEjF7g==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-8.4.7.tgz", + "integrity": "sha512-aedpeJFicTBeiTCvJWUG45WMMS53f5eu8t2fXsfjsU1t+WdDJqYcZyrlCzA4dL1B7MfbqaTURdvuVVHTmJO8ag==", "dev": true, "dependencies": { - "optional": "0.1.4", - "tslib": "2.3.1" + "tslib": "2.4.0" }, "funding": { "type": "opencollective", @@ -1981,14 +1839,20 @@ } } }, + "node_modules/@nestjs/testing/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/@nestjs/websockets": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-8.4.4.tgz", - "integrity": "sha512-c7GPbdxDaAR9uTfZHibIIyhFli+YopUVC0nrKGisS8rSsId1wuEIvWo73RLcRekcO85LPGZGf2f+wsP/SxD3yw==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-8.4.7.tgz", + "integrity": "sha512-UeXKTR7s2vQTGsSFhFR1dunptiICNf24nkLWoBud0kKx8HCRnhsNycyXbtwtAkioTjYXqm+vWeb9eb1Nv6+r2w==", "dependencies": { "iterare": "1.2.1", "object-hash": "3.0.0", - "tslib": "2.3.1" + "tslib": "2.4.0" }, "peerDependencies": { "@nestjs/common": "^8.0.0", @@ -2003,6 +1867,11 @@ } } }, + "node_modules/@nestjs/websockets/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2288,7 +2157,7 @@ "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/mime": { @@ -2885,7 +2754,7 @@ "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, "node_modules/arg": { "version": "4.1.3", @@ -2956,7 +2825,7 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, "node_modules/astral-regex": { @@ -3303,15 +3172,14 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" + "streamsearch": "^1.1.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=10.16.0" } }, "node_modules/bytes": { @@ -3623,38 +3491,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/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==" - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -3909,27 +3745,15 @@ } }, "node_modules/dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "dependencies": { "asap": "^2.0.0", "wrappy": "1" } }, - "node_modules/dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "dependencies": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -4428,12 +4252,45 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/eslint-plugin-prettier": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", @@ -5066,25 +4923,28 @@ } }, "node_modules/formidable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", - "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz", + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==", "dev": true, "dependencies": { - "dezalgo": "1.0.3", - "hexoid": "1.0.0", - "once": "1.4.0", - "qs": "6.9.3" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } }, "node_modules/formidable/node_modules/qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" }, @@ -5914,9 +5774,9 @@ } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", @@ -7016,9 +6876,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -7126,12 +6986,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -7377,21 +7231,20 @@ "dev": true }, "node_modules/multer": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", - "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", "dependencies": { "append-field": "^1.0.0", - "busboy": "^0.2.11", + "busboy": "^1.0.0", "concat-stream": "^1.5.2", "mkdirp": "^0.5.4", "object-assign": "^4.1.1", - "on-finished": "^2.3.0", "type-is": "^1.6.4", "xtend": "^4.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 6.0.0" } }, "node_modules/mute-stream": { @@ -7620,12 +7473,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -8147,16 +7994,24 @@ "dev": true }, "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/node_modules/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==" + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -8678,17 +8533,25 @@ } }, "node_modules/streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { - "node": ">=0.8.0" + "node": ">=10.0.0" } }, "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/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==" }, "node_modules/string-length": { "version": "4.0.2", @@ -8994,14 +8857,14 @@ } }, "node_modules/terser": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.0.tgz", - "integrity": "sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "bin": { @@ -9072,44 +8935,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/terser/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/terser/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/terser/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/terser/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9376,15 +9201,17 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.1.tgz", + "integrity": "sha512-VgPrtLKpRgEAJsMj5Q/I/mXouC6A/7eJ/X4Nuk6o0cRPwBtznYxTCU4FodbexbzH9somBPEXYi0ZkUViUpJ21Q==", "dev": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.1", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths-webpack-plugin": { @@ -9414,16 +9241,37 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/tsconfig-paths/node_modules/json5": { + "node_modules/tsconfig-paths-webpack-plugin/node_modules/json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { @@ -9509,7 +9357,7 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", @@ -9954,9 +9802,9 @@ } }, "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "engines": { "node": ">=10.0.0" }, @@ -11054,12 +10902,39 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@jridgewell/resolve-uri": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", "dev": true }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", @@ -11127,6 +11002,33 @@ "dev": true, "requires": {} }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "typescript": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", @@ -11200,17 +11102,24 @@ } }, "@nestjs/core": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.4.4.tgz", - "integrity": "sha512-Ef3yJPuzAttpNfehnGqIV5kHIL9SHptB5F4ERxoU7pT61H3xiYpZw6hSjx68cJO7cc6rm7/N+b4zeuJvFHtvBg==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.4.7.tgz", + "integrity": "sha512-XB9uexHqzr2xkPo6QSiQWJJttyYYLmvQ5My64cFvWFi7Wk2NIus0/xUNInwX3kmFWB6pF1ab5Y2ZBvWdPwGBhw==", "requires": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", "object-hash": "3.0.0", "path-to-regexp": "3.2.0", - "tslib": "2.3.1", + "tslib": "2.4.0", "uuid": "8.3.2" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "@nestjs/mapped-types": { @@ -11220,198 +11129,21 @@ "requires": {} }, "@nestjs/platform-express": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.4.4.tgz", - "integrity": "sha512-n/H83uzw154v6NVVSg6mniZIvYWtYp0dtNpU9O1qdEmDO030p0tBkeIRoDtpeOVvL2fW5PsHiUYS7HY4tNfykQ==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.4.7.tgz", + "integrity": "sha512-lPE5Ltg2NbQGRQIwXWY+4cNrXhJdycbxFDQ8mNxSIuv+LbrJBIdEB/NONk+LLn9N/8d2+I2LsIETGQrPvsejBg==", "requires": { "body-parser": "1.20.0", "cors": "2.8.5", - "express": "4.17.3", - "multer": "1.4.4", - "tslib": "2.3.1" + "express": "4.18.1", + "multer": "1.4.4-lts.1", + "tslib": "2.4.0" }, "dependencies": { - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - }, - "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" - } - }, - "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=" - }, - "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "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.7", - "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": { - "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "requires": { - "bytes": "3.1.2", - "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.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - } - } - } - }, - "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" - } - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "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" - } - }, - "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=" - }, - "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" - }, - "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "requires": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.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": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "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" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -11456,31 +11188,45 @@ } }, "@nestjs/terminus": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@nestjs/terminus/-/terminus-8.0.6.tgz", - "integrity": "sha512-HevQNlJzIkiZ5S1Yb+ll4pwiqg8qB5M6G+2LD0hIkUHzWFvVdCAZDIhLhtwjjRGJ76dwC8BFE/YyUC/4reGAzQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/terminus/-/terminus-8.1.1.tgz", + "integrity": "sha512-C+Pm1LZse8ZSfXeZXMTmUIGAmDpov1WRury/cyWj50ceCCCWz7csACNouGBEvjDmBklzfbkxgDH9mOSbm1r54A==", "requires": { "check-disk-space": "3.3.0" } }, "@nestjs/testing": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-8.4.4.tgz", - "integrity": "sha512-eGj0Lbi0ONMkjDKbKQHoGX+ecGdrGRZ81I8i6fH4dx9jIR0p4MsBlW964f6Swn1MGkPm/xxomJmBWLPqZEjF7g==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-8.4.7.tgz", + "integrity": "sha512-aedpeJFicTBeiTCvJWUG45WMMS53f5eu8t2fXsfjsU1t+WdDJqYcZyrlCzA4dL1B7MfbqaTURdvuVVHTmJO8ag==", "dev": true, "requires": { - "optional": "0.1.4", - "tslib": "2.3.1" + "tslib": "2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "@nestjs/websockets": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-8.4.4.tgz", - "integrity": "sha512-c7GPbdxDaAR9uTfZHibIIyhFli+YopUVC0nrKGisS8rSsId1wuEIvWo73RLcRekcO85LPGZGf2f+wsP/SxD3yw==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-8.4.7.tgz", + "integrity": "sha512-UeXKTR7s2vQTGsSFhFR1dunptiICNf24nkLWoBud0kKx8HCRnhsNycyXbtwtAkioTjYXqm+vWeb9eb1Nv6+r2w==", "requires": { "iterare": "1.2.1", "object-hash": "3.0.0", - "tslib": "2.3.1" + "tslib": "2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "@nodelib/fs.scandir": { @@ -11745,7 +11491,7 @@ "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/mime": { @@ -12214,7 +11960,7 @@ "append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, "arg": { "version": "4.1.3", @@ -12270,7 +12016,7 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, "astral-regex": { @@ -12533,12 +12279,11 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" + "streamsearch": "^1.1.0" } }, "bytes": { @@ -12764,40 +12509,6 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "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==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "consola": { @@ -13004,24 +12715,15 @@ "dev": true }, "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "requires": { "asap": "^2.0.0", "wrappy": "1" } }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - } - }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -13471,11 +13173,38 @@ "esutils": "^2.0.2" } }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } } } }, @@ -13905,22 +13634,25 @@ } }, "formidable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", - "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz", + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==", "dev": true, "requires": { - "dezalgo": "1.0.3", - "hexoid": "1.0.0", - "once": "1.4.0", - "qs": "6.9.3" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" }, "dependencies": { "qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", - "dev": true + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, @@ -14493,9 +14225,9 @@ } }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", @@ -15338,9 +15070,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", "dev": true }, "jsonc-parser": { @@ -15425,12 +15157,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -15614,16 +15340,15 @@ "dev": true }, "multer": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", - "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "version": "1.4.4-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", + "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", "requires": { "append-field": "^1.0.0", - "busboy": "^0.2.11", + "busboy": "^1.0.0", "concat-stream": "^1.5.2", "mkdirp": "^0.5.4", "object-assign": "^4.1.1", - "on-finished": "^2.3.0", "type-is": "^1.6.4", "xtend": "^4.0.0" } @@ -15797,12 +15522,6 @@ "mimic-fn": "^2.1.0" } }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -16175,14 +15894,24 @@ "dev": true }, "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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==" + } } }, "readdirp": { @@ -16571,14 +16300,24 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" }, "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "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==" + } + } }, "string-length": { "version": "4.0.2", @@ -16807,14 +16546,14 @@ } }, "terser": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.0.tgz", - "integrity": "sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.8.0-beta.0", "source-map-support": "~0.5.20" }, "dependencies": { @@ -16829,41 +16568,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "requires": { - "whatwg-url": "^7.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } } } }, @@ -17062,26 +16766,16 @@ } }, "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.1.tgz", + "integrity": "sha512-VgPrtLKpRgEAJsMj5Q/I/mXouC6A/7eJ/X4Nuk6o0cRPwBtznYxTCU4FodbexbzH9somBPEXYi0ZkUViUpJ21Q==", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.1", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -17110,6 +16804,33 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } } } }, @@ -17168,7 +16889,7 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typedarray-to-buffer": { "version": "3.1.5", @@ -17506,9 +17227,9 @@ } }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "requires": {} }, "xml-name-validator": { diff --git a/package.json b/package.json index fef3020..167b256 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "tokens", + "name": "tokens-erc1155", "version": "0.0.1", "description": "", "author": "", @@ -63,7 +63,7 @@ "ts-jest": "^27.0.5", "ts-loader": "^9.2.6", "ts-node": "^10.2.1", - "tsconfig-paths": "^3.11.0", + "tsconfig-paths": "^4.1.1", "typescript": "^4.4.3" }, "jest": {