diff --git a/packages/bus-sqs/package.json b/packages/bus-sqs/package.json index 68a842e7..c444e7d9 100644 --- a/packages/bus-sqs/package.json +++ b/packages/bus-sqs/package.json @@ -15,8 +15,10 @@ "access": "public" }, "dependencies": { + "@aws-sdk/client-sns": "^3.321.1", + "@aws-sdk/client-sqs": "^3.321.1", + "@aws-sdk/util-arn-parser": "^3.310.0", "@node-ts/bus-messages": "^1.0.4", - "aws-sdk": "^2.1368.0", "tslib": "^1.9.3", "uuid": "^3.3.2" }, diff --git a/packages/bus-sqs/src/queue-resolvers.ts b/packages/bus-sqs/src/queue-resolvers.ts index d9dd7a3c..0aa9943c 100644 --- a/packages/bus-sqs/src/queue-resolvers.ts +++ b/packages/bus-sqs/src/queue-resolvers.ts @@ -1,3 +1,5 @@ +import { SqsTransportConfiguration } from './sqs-transport-configuration' + const invalidSqsSnsCharacters = new RegExp('[^a-zA-Z0-9_-]', 'g') export const normalizeMessageName = (messageName: string) => messageName.replace(invalidSqsSnsCharacters, '-') @@ -24,13 +26,14 @@ export const resolveTopicArn = ( ) => `arn:aws:sns:${awsRegion}:${awsAccountId}:${topicName}` export const resolveQueueUrl = ( - href: string, - awsAccountId: string, + { awsAccountId, awsRegion }: SqsTransportConfiguration, queueName: string -) => `${href}${awsAccountId}/${queueName}` +) => `https://sqs.${awsRegion}.amazonaws.com/${awsAccountId}/${queueName}` + export const resolveQueueArn = ( awsAccountId: string, awsRegion: string, queueName: string ) => `arn:aws:sqs:${awsRegion}:${awsAccountId}:${queueName}` -export const resolveDeadLetterQueueName = () => `dead-letter-queue` + +export const resolveDeadLetterQueueName = () => `dlq` diff --git a/packages/bus-sqs/src/sqs-transport-configuration.ts b/packages/bus-sqs/src/sqs-transport-configuration.ts index 817efeaf..1ae35a31 100644 --- a/packages/bus-sqs/src/sqs-transport-configuration.ts +++ b/packages/bus-sqs/src/sqs-transport-configuration.ts @@ -4,16 +4,23 @@ import { resolveTopicName as defaultResolveTopicName } from './queue-resolvers' -export interface SqsTransportConfiguration extends TransportConfiguration { +export interface SqsTransportConfiguration + extends Omit { /** * The AWS Account Id of the account where queues and topics will be created */ - awsAccountId: string + awsAccountId?: string /** * The AWS region to create queues and topics in */ - awsRegion: string + awsRegion?: string + + /** + * An optional AWS ARN of the dead letter queue to fail messages to + * @default undefined + */ + deadLetterQueueArn?: string /** * The number of seconds to retain messages in the service and dead letter queues @@ -21,6 +28,17 @@ export interface SqsTransportConfiguration extends TransportConfiguration { */ messageRetentionPeriod?: number + /** + * The AWS ARN for the target SQS Queue + */ + queueArn?: string + + /** + * The name of the queue that receives incoming messages + * @example order-booking-service + */ + queueName?: string + /** * An optional custom queue policy to apply to any created SQS queues. * By default a generic policy will be added that grants send permissions to SNS diff --git a/packages/bus-sqs/src/sqs-transport.spec.ts b/packages/bus-sqs/src/sqs-transport.spec.ts index f4ede98b..507c4816 100644 --- a/packages/bus-sqs/src/sqs-transport.spec.ts +++ b/packages/bus-sqs/src/sqs-transport.spec.ts @@ -2,9 +2,14 @@ import { toMessageAttributeMap, SqsMessageAttributes, fromMessageAttributeMap, - SqsTransport + SqsTransport, + SnsMessageAttributeMap } from './sqs-transport' -import { SNS, SQS } from 'aws-sdk' +import { + ChangeMessageVisibilityCommand, + SQSClient, + Message as SQSMessage +} from '@aws-sdk/client-sqs' import { MessageAttributes } from '@node-ts/bus-messages' import * as faker from 'faker' import { SqsTransportConfiguration } from './sqs-transport-configuration' @@ -67,7 +72,7 @@ describe('sqs-transport', () => { } } - let messageAttributes: SNS.MessageAttributeMap + let messageAttributes: SnsMessageAttributeMap beforeEach(() => { messageAttributes = toMessageAttributeMap(messageOptions) @@ -108,8 +113,15 @@ describe('sqs-transport', () => { describe('when returning a message to the queue', () => { it('should use the retry strategy delay', async () => { - const sqs = Mock.ofType(SQS) - const sut = new SqsTransport({} as SqsTransportConfiguration, sqs.object) + const sqs = Mock.ofType(SQSClient) + const sut = new SqsTransport( + { + awsAccountId: '1', + awsRegion: 'us-west-2', + queueName: 'abc' + } as SqsTransportConfiguration, + sqs.object + ) const retryStrategy: RetryStrategy = { calculateRetryDelay() { @@ -124,14 +136,16 @@ describe('sqs-transport', () => { sqs .setup(s => - s.changeMessageVisibility( - It.isObjectWith({ VisibilityTimeout: 3 }) + s.send( + It.is( + x => x.input.VisibilityTimeout === 3 + ) ) ) .returns(() => ({ promise: async () => undefined } as any)) .verifiable(Times.once()) - await sut.returnMessage({ raw: {} } as TransportMessage) + await sut.returnMessage({ raw: {} } as TransportMessage) sqs.verifyAll() }) }) diff --git a/packages/bus-sqs/src/sqs-transport.ts b/packages/bus-sqs/src/sqs-transport.ts index bc19598a..43f3091a 100644 --- a/packages/bus-sqs/src/sqs-transport.ts +++ b/packages/bus-sqs/src/sqs-transport.ts @@ -1,3 +1,26 @@ +import { AssertionError } from 'assert' + +import { + CreateTopicCommand, + MessageAttributeValue, + PublishCommand, + SNSClient, + SubscribeCommand +} from '@aws-sdk/client-sns' +import { + ChangeMessageVisibilityCommand, + CreateQueueCommand, + DeleteMessageCommand, + GetQueueAttributesCommand, + Message as SQSMessage, + ReceiveMessageCommand, + SendMessageCommand, + SetQueueAttributesCommand, + SQSClient, + CreateQueueCommandInput +} from '@aws-sdk/client-sqs' +import { parse } from '@aws-sdk/util-arn-parser' + import { Command, Event, @@ -5,15 +28,12 @@ import { MessageAttributes, MessageAttributeMap } from '@node-ts/bus-messages' -import { SNS, SQS } from 'aws-sdk' -import { QueueAttributeMap } from 'aws-sdk/clients/sqs' import { Transport, TransportMessage, CoreDependencies, Logger } from '@node-ts/bus-core' -import { MessageAttributeValue } from 'aws-sdk/clients/sns' import { SqsTransportConfiguration } from './sqs-transport-configuration' import { generatePolicy } from './generate-policy' import { @@ -25,6 +45,8 @@ import { resolveTopicName as defaultResolveTopicName } from './queue-resolvers' +export type SnsMessageAttributeMap = Record + export const MAX_SQS_DELAY_SECONDS: Seconds = 900 export const MAX_SQS_VISIBILITY_TIMEOUT_SECONDS: Seconds = 43200 const DEFAULT_MESSAGE_RETENTION: Seconds = 1209600 @@ -55,20 +77,22 @@ export interface SQSMessageBody { MessageAttributes: SqsMessageAttributes } -export class SqsTransport implements Transport { +export class SqsTransport implements Transport { /** * A registry that tracks what messages have been sent. Sending a message first asserts that the target SNS queue * exists, so to avoid doing this each time assertion that the topic is created will only happen once per message. */ private registeredMessages: MessageRegistry = {} + private coreDependencies: CoreDependencies + private logger: Logger private readonly queueUrl: string private readonly queueArn: string private readonly deadLetterQueueName: string private readonly deadLetterQueueUrl: string private readonly deadLetterQueueArn: string - private coreDependencies: CoreDependencies - private logger: Logger + private readonly sqs: SQSClient + private readonly sns: SNSClient private readonly resolveTopicName: typeof defaultResolveTopicName private readonly resolveTopicArn: typeof defaultResolveTopicArn @@ -81,36 +105,68 @@ export class SqsTransport implements Transport { */ constructor( private readonly sqsConfiguration: SqsTransportConfiguration, - private readonly sqs: SQS = new SQS(), - private readonly sns: SNS = new SNS() + sqs?: SQSClient, + sns?: SNSClient ) { + if ( + !sqsConfiguration.queueArn && + !( + sqsConfiguration.awsAccountId && + sqsConfiguration.awsRegion && + sqsConfiguration.queueName + ) + ) { + throw new AssertionError({ + message: + 'SqsTransportConfiguration requires one of: awsAccountId and awsRegion and queueName, or queueArn' + }) + } + this.resolveTopicName = - this.sqsConfiguration.resolveTopicName ?? defaultResolveTopicName + sqsConfiguration.resolveTopicName ?? defaultResolveTopicName this.resolveTopicArn = - this.sqsConfiguration.resolveTopicArn ?? defaultResolveTopicArn + sqsConfiguration.resolveTopicArn ?? defaultResolveTopicArn + + if (sqsConfiguration.queueArn) { + const { accountId, region, resource } = parse(sqsConfiguration.queueArn) + sqsConfiguration.awsAccountId = accountId + sqsConfiguration.awsRegion = region + sqsConfiguration.queueName = resource + this.queueArn = sqsConfiguration.queueArn + } else { + this.queueArn = resolveQueueArn( + sqsConfiguration.awsAccountId!, + sqsConfiguration.awsRegion!, + sqsConfiguration.queueName! + ) + } + + this.sqs = sqs || new SQSClient({ region: sqsConfiguration.awsRegion }) + this.sns = sns || new SNSClient({ region: sqsConfiguration.awsRegion }) this.queueUrl = resolveQueueUrl( - sqs.endpoint.href, - sqsConfiguration.awsAccountId, - sqsConfiguration.queueName - ) - this.queueArn = resolveQueueArn( - sqsConfiguration.awsAccountId, - sqsConfiguration.awsRegion, - sqsConfiguration.queueName + sqsConfiguration, + sqsConfiguration.queueName! ) - this.deadLetterQueueName = sqsConfiguration.deadLetterQueueName - ? normalizeMessageName(sqsConfiguration.deadLetterQueueName) - : resolveDeadLetterQueueName() + if (sqsConfiguration.deadLetterQueueArn) { + const { resource } = parse(sqsConfiguration.deadLetterQueueArn) + this.deadLetterQueueArn = sqsConfiguration.deadLetterQueueArn + this.deadLetterQueueName = resource + } else { + this.deadLetterQueueName = sqsConfiguration.deadLetterQueueName + ? normalizeMessageName(sqsConfiguration.deadLetterQueueName) + : resolveDeadLetterQueueName() + + this.deadLetterQueueArn = resolveQueueArn( + sqsConfiguration.awsAccountId!, + sqsConfiguration.awsRegion!, + this.deadLetterQueueName + ) + } + this.deadLetterQueueUrl = resolveQueueUrl( - sqs.endpoint.href, - sqsConfiguration.awsAccountId, - this.deadLetterQueueName - ) - this.deadLetterQueueArn = resolveQueueArn( - sqsConfiguration.awsAccountId, - sqsConfiguration.awsRegion, + sqsConfiguration, this.deadLetterQueueName ) } @@ -136,7 +192,7 @@ export class SqsTransport implements Transport { await this.publishMessage(command, messageAttributes) } - async fail(transportMessage: TransportMessage): Promise { + async fail(transportMessage: TransportMessage): Promise { /* SQS doesn't support forwarding a message to another queue. This approach will copy the message to the dead letter queue and then delete it from the source queue. This changes its message id and other attributes such as receive @@ -146,27 +202,27 @@ export class SqsTransport implements Transport { the redrive policy kicks in. This approach was not preferred due to the additional number of handles that would need to happen. */ - await this.sqs - .sendMessage({ - QueueUrl: this.deadLetterQueueUrl, - MessageBody: transportMessage.raw.Body!, - MessageAttributes: transportMessage.raw.MessageAttributes - }) - .promise() + const command = new SendMessageCommand({ + QueueUrl: this.deadLetterQueueUrl, + MessageBody: transportMessage.raw.Body!, + MessageAttributes: transportMessage.raw.MessageAttributes + }) + await this.sqs.send(command) + await this.deleteMessage(transportMessage) } - async readNextMessage(): Promise | undefined> { - const receiveRequest: SQS.ReceiveMessageRequest = { + async readNextMessage(): Promise | undefined> { + const command = new ReceiveMessageCommand({ QueueUrl: this.queueUrl, WaitTimeSeconds: this.sqsConfiguration.waitTimeSeconds || DEFAULT_WAIT_TIME_SECONDS, MaxNumberOfMessages: 1, MessageAttributeNames: ['.*'], AttributeNames: ['ApproximateReceiveCount'] - } + }) - const result = await this.sqs.receiveMessage(receiveRequest).promise() + const result = await this.sqs.send(command) if (!result.Messages || result.Messages.length === 0) { return undefined } @@ -230,11 +286,11 @@ export class SqsTransport implements Transport { } } - async deleteMessage(message: TransportMessage): Promise { + async deleteMessage(message: TransportMessage): Promise { await this.deleteSqsMessage(message.raw) } - async returnMessage(message: TransportMessage): Promise { + async returnMessage(message: TransportMessage): Promise { await this.makeMessageVisible(message.raw) } @@ -250,7 +306,7 @@ export class SqsTransport implements Transport { ).toString() }) - const serviceQueueAttributes: QueueAttributeMap = { + const serviceQueueAttributes: CreateQueueCommandInput['Attributes'] = { VisibilityTimeout: `${ this.sqsConfiguration.visibilityTimeout || DEFAULT_VISIBILITY_TIMEOUT }`, @@ -262,15 +318,15 @@ export class SqsTransport implements Transport { } await this.assertSqsQueue( - this.sqsConfiguration.queueName, + this.sqsConfiguration.queueName!, serviceQueueAttributes ) await this.subscribeQueueToMessages() await this.attachPolicyToQueue( this.queueUrl, - this.sqsConfiguration.awsAccountId, - this.sqsConfiguration.awsRegion + this.sqsConfiguration.awsAccountId!, + this.sqsConfiguration.awsRegion! ) await this.syncQueueAttributes(this.queueUrl, serviceQueueAttributes) } @@ -284,8 +340,8 @@ export class SqsTransport implements Transport { if (!this.registeredMessages[messageName]) { const snsTopicName = this.resolveTopicName(messageName) const snsTopicArn = this.resolveTopicArn( - this.sqsConfiguration.awsAccountId, - this.sqsConfiguration.awsRegion, + this.sqsConfiguration.awsAccountId!, + this.sqsConfiguration.awsRegion!, messageName ) await this.createSnsTopic(snsTopicName) @@ -298,17 +354,17 @@ export class SqsTransport implements Transport { */ private async assertSqsQueue( queueName: string, - queueAttributes?: QueueAttributeMap + queueAttributes?: CreateQueueCommandInput['Attributes'] ): Promise { this.logger.info('Asserting sqs queue...', { queueName, queueAttributes }) - const createQueueRequest: SQS.CreateQueueRequest = { + const command = new CreateQueueCommand({ QueueName: queueName, Attributes: queueAttributes - } + }) try { - await this.sqs.createQueue(createQueueRequest).promise() + await this.sqs.send(command) } catch (err) { const error = err as { code: string } if (error.code === 'QueueAlreadyExists') { @@ -334,8 +390,8 @@ export class SqsTransport implements Transport { const topicName = this.resolveTopicName(message.$name) const topicArn = this.resolveTopicArn( - this.sqsConfiguration.awsAccountId, - this.sqsConfiguration.awsRegion, + this.sqsConfiguration.awsAccountId!, + this.sqsConfiguration.awsRegion!, topicName ) this.logger.trace('Publishing message to sns', { message, topicArn }) @@ -343,14 +399,16 @@ export class SqsTransport implements Transport { const attributeMap = toMessageAttributeMap(messageAttributes) this.logger.debug('Resolved message attributes', { attributeMap }) - const snsMessage: SNS.PublishInput = { + const command = new PublishCommand({ TopicArn: topicArn, Subject: message.$name, Message: this.coreDependencies.messageSerializer.serialize(message), MessageAttributes: attributeMap - } - this.logger.debug('Sending message to SNS', { snsMessage }) - await this.sns.publish(snsMessage).promise() + }) + + this.logger.debug('Sending message to SNS', { command }) + + await this.sns.send(command) } private async subscribeQueueToMessages(): Promise { @@ -386,7 +444,8 @@ export class SqsTransport implements Transport { This action is idempotent, so if the topic exists then this will just return. This is preferable to checking `sns.listTopics` first as it can't be run in a transaction. */ - const result = await this.sns.createTopic({ Name: topicName }).promise() + const command = new CreateTopicCommand({ Name: topicName }) + const result = await this.sns.send(command) return result.TopicArn! } @@ -394,37 +453,37 @@ export class SqsTransport implements Transport { queueArn: string, topicArn: string ): Promise { - const subscribeRequest: SNS.SubscribeInput = { + const command = new SubscribeCommand({ TopicArn: topicArn, Protocol: 'sqs', Endpoint: queueArn - } + }) + this.logger.info('Subscribing sqs queue to sns topic', { serviceQueueArn: queueArn, topicArn }) - await this.sns.subscribe(subscribeRequest).promise() + + await this.sns.send(command) } - private async makeMessageVisible(sqsMessage: SQS.Message): Promise { - const changeVisibilityRequest: SQS.ChangeMessageVisibilityRequest = { + private async makeMessageVisible(sqsMessage: SQSMessage): Promise { + const command = new ChangeMessageVisibilityCommand({ QueueUrl: this.queueUrl, ReceiptHandle: sqsMessage.ReceiptHandle!, VisibilityTimeout: this.calculateVisibilityTimeout(sqsMessage) - } + }) - await this.sqs.changeMessageVisibility(changeVisibilityRequest).promise() + await this.sqs.send(command) } - private async deleteSqsMessage(sqsMessage: SQS.Message): Promise { - const deleteMessageRequest: SQS.DeleteMessageRequest = { + private async deleteSqsMessage(sqsMessage: SQSMessage): Promise { + const command = new DeleteMessageCommand({ QueueUrl: this.queueUrl, ReceiptHandle: sqsMessage.ReceiptHandle! - } - this.logger.debug('Deleting message from sqs queue', { - deleteMessageRequest }) - await this.sqs.deleteMessage(deleteMessageRequest).promise() + this.logger.debug('Deleting message from sqs queue', { command }) + await this.sqs.send(command) } private async attachPolicyToQueue( @@ -435,39 +494,42 @@ export class SqsTransport implements Transport { const policy = this.sqsConfiguration.queuePolicy || generatePolicy(awsAccountId, awsRegion) - const setQueuePolicyRequest: SQS.SetQueueAttributesRequest = { + const command = new SetQueueAttributesCommand({ QueueUrl: queueUrl, Attributes: { Policy: policy } - } + }) this.logger.info('Attaching IAM policy to queue', { policy, serviceQueueUrl: queueUrl }) - await this.sqs.setQueueAttributes(setQueuePolicyRequest).promise() + await this.sqs.send(command) } private async syncQueueAttributes( queueUrl: string, - attributes: QueueAttributeMap + attributes: CreateQueueCommandInput['Attributes'] ): Promise { // Check equality first to avoid potential API rate limit - const existingAttributes = await this.sqs - .getQueueAttributes({ QueueUrl: queueUrl }) - .promise() - if (existingAttributes.Attributes !== attributes) { - await this.sqs - .setQueueAttributes({ + const existingQueueAttributes = await this.sqs.send( + new GetQueueAttributesCommand({ + QueueUrl: queueUrl + }) + ) + + if (existingQueueAttributes.Attributes !== attributes) { + await this.sqs.send( + new SetQueueAttributesCommand({ QueueUrl: queueUrl, Attributes: attributes }) - .promise() + ) } } - private calculateVisibilityTimeout(sqsMessage: SQS.Message): Seconds { + private calculateVisibilityTimeout(sqsMessage: SQSMessage): Seconds { const currentReceiveCount = parseInt( (sqsMessage.Attributes && sqsMessage.Attributes.ApproximateReceiveCount) || @@ -485,8 +547,8 @@ export class SqsTransport implements Transport { export function toMessageAttributeMap( messageOptions: MessageAttributes -): SNS.MessageAttributeMap { - const map: SNS.MessageAttributeMap = {} +): SnsMessageAttributeMap { + const map: SnsMessageAttributeMap = {} const toAttributeValue = (value: string | number | boolean) => { const attribute: MessageAttributeValue = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61a20a01..81d6087f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -185,6 +185,9 @@ importers: packages/bus-sqs: specifiers: + '@aws-sdk/client-sns': ^3.321.1 + '@aws-sdk/client-sqs': ^3.321.1 + '@aws-sdk/util-arn-parser': ^3.310.0 '@node-ts/bus-core': ^1.0.15 '@node-ts/bus-messages': ^1.0.4 '@node-ts/bus-test': ^0.0.20 @@ -192,7 +195,6 @@ importers: '@types/amqplib': ^0.5.11 '@types/faker': ^4.1.5 '@types/uuid': ^3.4.4 - aws-sdk: ^2.1368.0 class-transformer: ^0.5.1 faker: ^4.1.0 reflect-metadata: ^0.1.13 @@ -201,8 +203,10 @@ importers: typescript: ^4.3.5 uuid: ^3.3.2 dependencies: + '@aws-sdk/client-sns': 3.321.1 + '@aws-sdk/client-sqs': 3.321.1 + '@aws-sdk/util-arn-parser': 3.310.0 '@node-ts/bus-messages': link:../bus-messages - aws-sdk: 2.1368.0 tslib: 1.14.1 uuid: 3.4.0 devDependencies: @@ -259,6 +263,786 @@ packages: - supports-color dev: false + /@aws-crypto/ie11-detection/3.0.0: + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-browser/3.0.0: + resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-locate-window': 3.310.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-js/3.0.0: + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.310.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/supports-web-crypto/3.0.0: + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/util/3.0.0: + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-sdk/abort-controller/3.310.0: + resolution: {integrity: sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/client-sns/3.321.1: + resolution: {integrity: sha512-JoRqxbsne2THqDZXazCiTdqkzyh43hGAWkN4MGb/PRCKXgZamRUngS6l7dD0p55nJtLcpnvnaQJSqJyWWLDRhQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.321.1 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-node': 3.321.1 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.319.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.321.1 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.319.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + fast-xml-parser: 4.1.2 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sqs/3.321.1: + resolution: {integrity: sha512-WpISQDL2ZHlRWFWc8TQcbAtkbk699V+kxTugUGlDQTx/R78R18A0figIO4VWnEQuDXrrMTY+i+hCivqYQKxrcQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.321.1 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-node': 3.321.1 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/md5-js': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-sdk-sqs': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.319.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.321.1 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.319.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + fast-xml-parser: 4.1.2 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso-oidc/3.321.1: + resolution: {integrity: sha512-PBVfHQbyrsfzbnO6u9d9Sik8JlXGLhHj3zLd87iBkYXBdHwD5NuvwWu7OtjUtrHjP4SfzodVwfjmTbDAFqbtzw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.319.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.321.1 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.319.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso/3.321.1: + resolution: {integrity: sha512-ecoT4tBGtRJR5G7oLBTMXZmgZZlff1amhSdKPEtkWxv6kWc8VPb5rRuRgVPsDR9HuesI6ZVlODptvGtnfkIJwA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.319.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.321.1 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.319.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sts/3.321.1: + resolution: {integrity: sha512-AB+N4a1TVEKl9Sd5O2TxTprEZp7Va6zPZLMraFAYMdmJVBmCmmwyBs7ygju685DpQ1dos5PRsKCRcossyY5pDQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-node': 3.321.1 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-sdk-sts': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.319.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.321.1 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.319.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + fast-xml-parser: 4.1.2 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/config-resolver/3.310.0: + resolution: {integrity: sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-config-provider': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/credential-provider-env/3.310.0: + resolution: {integrity: sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/credential-provider-imds/3.310.0: + resolution: {integrity: sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/credential-provider-ini/3.321.1: + resolution: {integrity: sha512-prndSVQhiikNaI40bYnM2Q8PkC35FCwhbQnBk6KXNvdtfo9RqatMC639F+6oryb3BuMy++Ij4Yoi8WnPBs5Sww==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/credential-provider-process': 3.310.0 + '@aws-sdk/credential-provider-sso': 3.321.1 + '@aws-sdk/credential-provider-web-identity': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node/3.321.1: + resolution: {integrity: sha512-5B1waOwSvY2JMLGRebo7IUqnTaGoCnby9cRbG/dhi7Ke97M3V8380S9THDJ/bktjL8zHEVfBVZy7HhXHzhSjEg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/credential-provider-ini': 3.321.1 + '@aws-sdk/credential-provider-process': 3.310.0 + '@aws-sdk/credential-provider-sso': 3.321.1 + '@aws-sdk/credential-provider-web-identity': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-process/3.310.0: + resolution: {integrity: sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/credential-provider-sso/3.321.1: + resolution: {integrity: sha512-kg0rc1OacJFgAvmZj0TOu+BSc+yRdnC5dO/RAag3XU6+hlQI5/C080RQp9Qj6V7ga0HtAJMRwJcUlCPA3RJPug==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.321.1 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/token-providers': 3.321.1 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-web-identity/3.310.0: + resolution: {integrity: sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/fetch-http-handler/3.310.0: + resolution: {integrity: sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw==} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/querystring-builder': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/hash-node/3.310.0: + resolution: {integrity: sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-buffer-from': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/invalid-dependency/3.310.0: + resolution: {integrity: sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/is-array-buffer/3.310.0: + resolution: {integrity: sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/md5-js/3.310.0: + resolution: {integrity: sha512-x5sRBUrEfLWAS1EhwbbDQ7cXq6uvBxh3qR2XAsnGvFFceTeAadk7cVogWxlk3PC+OCeeym7c3/6Bv2HQ2f1YyQ==} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-content-length/3.310.0: + resolution: {integrity: sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-endpoint/3.310.0: + resolution: {integrity: sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-host-header/3.310.0: + resolution: {integrity: sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-logger/3.310.0: + resolution: {integrity: sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-recursion-detection/3.310.0: + resolution: {integrity: sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-retry/3.310.0: + resolution: {integrity: sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/service-error-classification': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + tslib: 2.5.0 + uuid: 8.3.2 + dev: false + + /@aws-sdk/middleware-sdk-sqs/3.310.0: + resolution: {integrity: sha512-p0TCoU/toRZxEAVdRZbtNVmkP36JCSoHMk1qbyPBycM3DL+kCNCsC1gSx5cbC0M6/U/zwUS783UPO0OwvyqimA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-hex-encoding': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-sdk-sts/3.310.0: + resolution: {integrity: sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-serde/3.310.0: + resolution: {integrity: sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-signing/3.310.0: + resolution: {integrity: sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/signature-v4': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-stack/3.310.0: + resolution: {integrity: sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/middleware-user-agent/3.319.0: + resolution: {integrity: sha512-ytaLx2dlR5AdMSne6FuDCISVg8hjyKj+cHU20b2CRA/E/z+XXrLrssp4JrCgizRKPPUep0psMIa22Zd6osTT5Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-endpoints': 3.319.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/node-config-provider/3.310.0: + resolution: {integrity: sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/node-http-handler/3.321.1: + resolution: {integrity: sha512-DdQBrtFFDNtzphJIN3s93Vf+qd9LHSzH6WTQRrWoXhTDMHDzSI2Cn+c5KWfk89Nggp/n3+OTwUPQeCiBT5EBuw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/abort-controller': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/querystring-builder': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/property-provider/3.310.0: + resolution: {integrity: sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/protocol-http/3.310.0: + resolution: {integrity: sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/querystring-builder/3.310.0: + resolution: {integrity: sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-uri-escape': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/querystring-parser/3.310.0: + resolution: {integrity: sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/service-error-classification/3.310.0: + resolution: {integrity: sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw==} + engines: {node: '>=14.0.0'} + dev: false + + /@aws-sdk/shared-ini-file-loader/3.310.0: + resolution: {integrity: sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/signature-v4/3.310.0: + resolution: {integrity: sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/is-array-buffer': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-hex-encoding': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + '@aws-sdk/util-uri-escape': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/smithy-client/3.316.0: + resolution: {integrity: sha512-6YXOKbRnXeS8r8RWzuL6JMBolDYM5Wa4fD/VY6x/wK78i2xErHOvqzHgyyeLI1MMw4uqyd4wRNJNWC9TMPduXw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/token-providers/3.321.1: + resolution: {integrity: sha512-I1sXS4qXirSvgvrOIPf+e1D7GvC83DdeyMxHZvuhHgeMCqDAzToS8OLxOX0enN9xZRHWAQYja8xyeGbDL2I0Zw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso-oidc': 3.321.1 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/types/3.310.0: + resolution: {integrity: sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/url-parser/3.310.0: + resolution: {integrity: sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==} + dependencies: + '@aws-sdk/querystring-parser': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-arn-parser/3.310.0: + resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-base64/3.310.0: + resolution: {integrity: sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/util-buffer-from': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-body-length-browser/3.310.0: + resolution: {integrity: sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-body-length-node/3.310.0: + resolution: {integrity: sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-buffer-from/3.310.0: + resolution: {integrity: sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/is-array-buffer': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-config-provider/3.310.0: + resolution: {integrity: sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-defaults-mode-browser/3.316.0: + resolution: {integrity: sha512-6FSqLhYmaihtH2n1s4b2rlLW0ABU8N6VZIfzLfe2ING4PF0MzfaMMhnTFUHVXfKCVGoR8yP6iyFTRCyHGVEL1w==} + engines: {node: '>= 10.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + bowser: 2.11.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-defaults-mode-node/3.316.0: + resolution: {integrity: sha512-dkYy10hdjPSScXXvnjGpZpnJxllkb6ICHgLMwZ4JczLHhPM12T/4PQ758YN8HS+muiYDGX1Bl2z1jd/bMcewBQ==} + engines: {node: '>= 10.0.0'} + dependencies: + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-endpoints/3.319.0: + resolution: {integrity: sha512-3I64UMoYA2e2++oOUJXRcFtYLpLylnZFRltWfPo1B3dLlf+MIWat9djT+mMus+hW1ntLsvAIVu1hLVePJC0gvw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-hex-encoding/3.310.0: + resolution: {integrity: sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-locate-window/3.310.0: + resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-middleware/3.310.0: + resolution: {integrity: sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-retry/3.310.0: + resolution: {integrity: sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA==} + engines: {node: '>= 14.0.0'} + dependencies: + '@aws-sdk/service-error-classification': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-uri-escape/3.310.0: + resolution: {integrity: sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-user-agent-browser/3.310.0: + resolution: {integrity: sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw==} + dependencies: + '@aws-sdk/types': 3.310.0 + bowser: 2.11.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-user-agent-node/3.310.0: + resolution: {integrity: sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-utf8-browser/3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + dependencies: + tslib: 2.5.0 + dev: false + + /@aws-sdk/util-utf8/3.310.0: + resolution: {integrity: sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/util-buffer-from': 3.310.0 + tslib: 2.5.0 + dev: false + /@babel/code-frame/7.15.8: resolution: {integrity: sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==} engines: {node: '>=6.9.0'} @@ -1256,27 +2040,6 @@ packages: hasBin: true dev: true - /available-typed-arrays/1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: false - - /aws-sdk/2.1368.0: - resolution: {integrity: sha512-Yc3s8PqdcYG4wyCOpDj4TwXacGZGDgZBJ/XAtzMLKW2wN2c4uu7GwSosLxZ8ejzbAbcqjf080odPuD8P0819tw==} - engines: {node: '>= 10.0.0'} - dependencies: - buffer: 4.9.2 - events: 1.1.1 - ieee754: 1.1.13 - jmespath: 0.16.0 - querystring: 0.2.0 - sax: 1.2.1 - url: 0.10.3 - util: 0.12.5 - uuid: 8.0.0 - xml2js: 0.5.0 - dev: false - /babel-jest/26.6.3_nlxlja6qxy5m5p2hwquah33e7u: resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} engines: {node: '>= 10.14.2'} @@ -1413,8 +2176,8 @@ packages: pascalcase: 0.1.1 dev: true - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /bowser/2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} dev: false /brace-expansion/1.1.11: @@ -1489,14 +2252,6 @@ packages: engines: {node: '>=4'} dev: false - /buffer/4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.1.13 - isarray: 1.0.0 - dev: false - /builtin-modules/1.1.1: resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} engines: {node: '>=0.10.0'} @@ -1522,6 +2277,7 @@ packages: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 + dev: true /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -2019,11 +2775,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /events/1.1.1: - resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} - engines: {node: '>=0.4.x'} - dev: false - /exec-sh/0.3.6: resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} dev: true @@ -2149,6 +2900,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser/4.1.2: + resolution: {integrity: sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fb-watchman/2.0.1: resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} dependencies: @@ -2180,12 +2938,6 @@ packages: path-exists: 4.0.0 dev: true - /for-each/0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: false - /for-in/1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} @@ -2221,6 +2973,7 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} @@ -2238,6 +2991,7 @@ packages: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 + dev: true /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -2277,12 +3031,6 @@ packages: engines: {node: '>=4'} dev: true - /gopd/1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.0 - dev: false - /graceful-fs/4.2.8: resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} dev: true @@ -2310,13 +3058,7 @@ packages: /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - - /has-tostringtag/1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: false + dev: true /has-value/0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} @@ -2354,6 +3096,7 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 + dev: true /html-encoding-sniffer/2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} @@ -2410,10 +3153,6 @@ packages: safer-buffer: 2.1.2 dev: true - /ieee754/1.1.13: - resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} - dev: false - /import-local/3.0.3: resolution: {integrity: sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==} engines: {node: '>=8'} @@ -2461,23 +3200,10 @@ packages: kind-of: 6.0.3 dev: true - /is-arguments/1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: false - /is-buffer/1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true - /is-callable/1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: false - /is-ci/2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true @@ -2557,13 +3283,6 @@ packages: engines: {node: '>=6'} dev: true - /is-generator-function/1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: false - /is-number/3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} @@ -2602,17 +3321,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-typed-array/1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: false - /is-typedarray/1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true @@ -2628,6 +3336,7 @@ packages: /isarray/1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3234,11 +3943,6 @@ packages: - utf-8-validate dev: true - /jmespath/0.16.0: - resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} - engines: {node: '>= 0.6.0'} - dev: false - /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -3991,10 +4695,6 @@ packages: once: 1.4.0 dev: true - /punycode/1.3.2: - resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} - dev: false - /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} @@ -4005,12 +4705,6 @@ packages: engines: {node: '>=6'} dev: true - /querystring/0.2.0: - resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: false - /querystringify/2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: false @@ -4175,10 +4869,6 @@ packages: dev: false optional: true - /sax/1.2.1: - resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} - dev: false - /saxes/5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} @@ -4484,6 +5174,10 @@ packages: engines: {node: '>=12'} dev: true + /strnum/1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -4619,6 +5313,10 @@ packages: /tslib/2.3.1: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false + /tslint/6.1.3_typescript@4.4.3: resolution: {integrity: sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==} engines: {node: '>=4.8.0'} @@ -4728,13 +5426,6 @@ packages: requires-port: 1.0.0 dev: false - /url/0.10.3: - resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - dev: false - /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -4744,27 +5435,12 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false - /util/0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.10 - which-typed-array: 1.1.9 - dev: false - /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: false - /uuid/8.0.0: - resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} - hasBin: true - dev: false - /uuid/8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -4840,18 +5516,6 @@ packages: webidl-conversions: 6.1.0 dev: true - /which-typed-array/1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - dev: false - /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -4920,19 +5584,6 @@ packages: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} dev: true - /xml2js/0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.2.1 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder/11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - dev: false - /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true