From 2ff08c13b49590f38ec866993394c14b95805135 Mon Sep 17 00:00:00 2001 From: Eric Bach <43318858+eric-bach@users.noreply.github.com> Date: Wed, 1 Jan 2025 12:14:16 -0700 Subject: [PATCH] Update positions on investment-transaction changes (#214) * Update yahoo finance * Fix updatePosition * Fix * Update queue * Update logs * Add tests * Update schema * Update gitignore --------- Co-authored-by: Eric Bach --- .gitignore | 3 + README.md | 49 + TODO.md | 10 +- backend/jest.config.js | 2 +- backend/lib/api-stack.ts | 140 +- backend/package-lock.json | 32 +- backend/package.json | 2 + .../src/appsync/Mutation.createCategory.ts | 3 +- backend/src/appsync/Mutation.createPayee.ts | 3 +- backend/src/appsync/Mutation.createSymbol.ts | 3 +- backend/src/lambda/updateMarketValue/main.ts | 166 -- .../updateMarketValue/package-lock.json | 2000 ----------------- .../main.ts | 70 +- .../package-lock.json | 1075 ++++----- .../package.json | 7 +- .../tsconfig.json | 0 .../types/PositionReadModel.ts} | 23 +- .../utils/dynamoDbClient.ts} | 0 .../utils}/yahooFinance.ts | 0 .../helpers/dynamoDbCommand.ts | 21 - .../helpers/eventBridgePublishEvent.ts | 35 - .../src/lambda/updatePositions/package.json | 22 - .../src/lambda/updatePositions/tsconfig.json | 15 - .../appsync/Mutation.createCategory.test.ts | 2 +- .../test/appsync/Mutation.createPayee.test.ts | 2 +- .../appsync/Mutation.createSymbol.test.ts | 2 +- backend/test/cdk/api-stack.test.ts | 16 +- .../test/lambda/updatePosition/main.test.ts | 126 ++ references/ACB Unit Tests.xlsx | Bin 0 -> 9663 bytes references/Tables.xlsx | Bin 16539 -> 16689 bytes 30 files changed, 813 insertions(+), 3016 deletions(-) delete mode 100644 backend/src/lambda/updateMarketValue/main.ts delete mode 100644 backend/src/lambda/updateMarketValue/package-lock.json rename backend/src/lambda/{updatePositions => updatePosition}/main.ts (69%) rename backend/src/lambda/{updatePositions => updatePosition}/package-lock.json (64%) rename backend/src/lambda/{updateMarketValue => updatePosition}/package.json (68%) rename backend/src/lambda/{updateMarketValue => updatePosition}/tsconfig.json (100%) rename backend/src/lambda/{types/Position.ts => updatePosition/types/PositionReadModel.ts} (53%) rename backend/src/lambda/{updateMarketValue/helpers/dynamoDbCommand.ts => updatePosition/utils/dynamoDbClient.ts} (100%) rename backend/src/lambda/{updateMarketValue => updatePosition/utils}/yahooFinance.ts (100%) delete mode 100644 backend/src/lambda/updatePositions/helpers/dynamoDbCommand.ts delete mode 100644 backend/src/lambda/updatePositions/helpers/eventBridgePublishEvent.ts delete mode 100644 backend/src/lambda/updatePositions/package.json delete mode 100644 backend/src/lambda/updatePositions/tsconfig.json create mode 100644 backend/test/lambda/updatePosition/main.test.ts create mode 100644 references/ACB Unit Tests.xlsx diff --git a/.gitignore b/.gitignore index d668b7e0..239374a2 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,6 @@ yarn-error.log* !tailwind.config.js !next.config.js !postcss.config.js + +# reference +~*.xlsx diff --git a/README.md b/README.md index 2e5e183e..e383e11d 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,55 @@ Ensure to configure the GitHub Secrets to include: CYPRESS_PASSWORD - The Cognito password for Cypress integration testing ``` +# Troubleshooting + +## Lambda DLQ + +To retry the Lambda function + +1. Get the message from the SQS DLQ + +``` +aws sqs receive-message --queue-url https://sqs.us-east-1.amazonaws.com/524849261220/pecuniary-dev-updatePosition-DLQ --profile bach-dev +``` + +2. Save the DLQ message event to a json file + +``` +{ + "version": "0", + "id": "26b8f7d1-b141-9baf-8a01-f625b7c3b0bc", + "detail-type": "InvestmentTransactionSavedEvent", + "source": "custom.pecuniary", + "account": "524849261220", + "time": "2024-12-31T20:29:49Z", + "region": "us-east-1", + "resources": [], + "detail": { + "accountId": "c8df14ba-0bf9-43dc-a92f-0185714336a7", + "transactionDate": "2024-12-31", + "type": "Buy", + "symbol": "FNMA", + "shares": 123.0, + "price": 12.0, + "commission": 12.0, + "userId": "a4e824d8-2021-7008-6807-ec5d9400debb" + } +} +``` + +3. Run the CLI command to invoke lambda + +``` +aws lambda invoke --function-name pecuniary-dev-UpdatePosition --payload fileb://request.json response.json --profile bach-dev +``` + +4. Run the CLI command to remove the message from the SQS DLQ + +``` +aws sqs delete-message --queue-url https://sqs.us-east-1.amazonaws.com/524849261220/pecuniary-dev-updatePosition-DLQ --receipt-handle --profile bach-dev +``` + # Event Sourcing and CQRS Architecture For more detailed information about the event-driven nature of the Pecuniary application and it's architecture, please see the [Architecture.md](ARCHITECTURE.md) diff --git a/TODO.md b/TODO.md index 4126edce..dd818505 100644 --- a/TODO.md +++ b/TODO.md @@ -43,10 +43,14 @@ X Switch transactionsResolver to use AppSync JS pipeline resolvers ##### Current Task -- Rearchitect updatePositions/updateBalances to use AppSync JS Resolvers - - Add Python Lambda function to updatePositionMakretPrice -- Ensure updatePositions updates on investment transactions create/update - FAILING, add tests to Lambdas +X Rearchitect updatePositions/updateBalances to use AppSync JS Resolvers +X BUG: Creates multiple symbols in drop down +X Ensure updatePositions updates on investment transactions create/update + - Create updateBalances updates on bank transactions create/update +- simulate failure in updatePosition Lambda to ensure it goes to DLQ (i.e. set the pk to undefined L133) +- add tests to updatePosition Lambda +- Update dashboard to pull positions and totals - requires new API getPositions(userId) ##### Future Task diff --git a/backend/jest.config.js b/backend/jest.config.js index 44ead854..099a0ff6 100644 --- a/backend/jest.config.js +++ b/backend/jest.config.js @@ -1,6 +1,6 @@ module.exports = { testEnvironment: 'node', - roots: ['/test'], + roots: ['/test', '/src/lambda'], testMatch: ['**/*.test.ts'], transform: { '^.+\\.tsx?$': 'ts-jest', diff --git a/backend/lib/api-stack.ts b/backend/lib/api-stack.ts index 4a09c2cd..f52d3f1f 100644 --- a/backend/lib/api-stack.ts +++ b/backend/lib/api-stack.ts @@ -5,7 +5,7 @@ import { UserPool } from 'aws-cdk-lib/aws-cognito'; import { PolicyStatement, Effect, Role, ServicePrincipal, PolicyDocument } from 'aws-cdk-lib/aws-iam'; import { Topic } from 'aws-cdk-lib/aws-sns'; import { EmailSubscription } from 'aws-cdk-lib/aws-sns-subscriptions'; -import { Alarm, Metric, ComparisonOperator } from 'aws-cdk-lib/aws-cloudwatch'; +import { Alarm, Metric, ComparisonOperator, TreatMissingData } from 'aws-cdk-lib/aws-cloudwatch'; import { SnsAction } from 'aws-cdk-lib/aws-cloudwatch-actions'; import { Code, @@ -25,8 +25,8 @@ import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets'; import { Queue } from 'aws-cdk-lib/aws-sqs'; import { Table } from 'aws-cdk-lib/aws-dynamodb'; import { PecuniaryApiStackProps } from './types/PecuniaryStackProps'; -import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { LayerVersion, Runtime, Tracing } from 'aws-cdk-lib/aws-lambda'; +import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; const dotenv = require('dotenv'); dotenv.config(); @@ -43,20 +43,20 @@ export class ApiStack extends Stack { ***/ // Event handler DLQ - const eventHandlerQueue = new Queue(this, 'EventHandlerQueue', { - queueName: `${props.appName}-eventHandler-DeadLetterQueue-${props.envName}`, + const updatePositionDLQ = new Queue(this, 'UpdatePositionDLQ', { + queueName: `${props.appName}-${props.envName}-updatePosition-DLQ`, }); /*** *** AWS SNS - Topics ***/ - const eventHandlerTopic = new Topic(this, 'EventHandlerTopic', { - topicName: `${props.appName}-eventHandler-Topic-${props.envName}`, - displayName: 'Event Handler Topic', + const updatePositionNotification = new Topic(this, 'UpdatePositionNotification', { + topicName: `${props.appName}-${props.envName}-updatePosition-Notification`, + displayName: 'Update Postion DLQ Notification', }); if (props.params.dlqNotifications) { - eventHandlerTopic.addSubscription(new EmailSubscription(props.params.dlqNotifications)); + updatePositionNotification.addSubscription(new EmailSubscription(props.params.dlqNotifications)); } /*** @@ -64,26 +64,27 @@ export class ApiStack extends Stack { ***/ // Generic metric - const metric = new Metric({ + const dlqMetric = new Metric({ namespace: 'AWS/SQS', - metricName: 'NumberOfMessagesSent', - }); - // TODO Doesn't seem to work - metric.with({ + metricName: 'ApproximateNumberOfMessagesVisible', + dimensionsMap: { + QueueName: updatePositionDLQ.queueName, + }, + period: Duration.minutes(1), statistic: 'Sum', - period: Duration.seconds(300), }); - const eventHandlerAlarm = new Alarm(this, 'EventHandlerAlarm', { - alarmName: `${props.appName}-eventHandler-Alarm-${props.envName}`, - alarmDescription: 'One or more failed EventHandler messages', - metric: metric, + const updatePositionAlarm = new Alarm(this, 'UpdatePositionAlarm', { + alarmName: `${props.appName}-${props.envName}-updatePosition-Alarm`, + alarmDescription: 'Unable to update one or more positions', + metric: dlqMetric, datapointsToAlarm: 1, - evaluationPeriods: 2, + evaluationPeriods: 1, threshold: 1, comparisonOperator: ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, + treatMissingData: TreatMissingData.NOT_BREACHING, }); - eventHandlerAlarm.addAlarmAction(new SnsAction(eventHandlerTopic)); + updatePositionAlarm.addAlarmAction(new SnsAction(updatePositionNotification)); /*** *** AWS EventBridge - Event Bus @@ -541,38 +542,38 @@ export class ApiStack extends Stack { ***/ // AWS ADOT Lambda layer - const adotLayer = LayerVersion.fromLayerVersionArn( + const adotJavscriptLayer = LayerVersion.fromLayerVersionArn( this, - 'adotLayer', + 'adotJavascriptLayer', `arn:aws:lambda:${Stack.of(this).region}:901920570463:layer:aws-otel-nodejs-amd64-ver-1-18-1:4` ); - const updatePositionsFunction = new NodejsFunction(this, 'UpdatePositions', { - runtime: Runtime.NODEJS_18_X, - functionName: `${props.appName}-${props.envName}-UpdatePositions`, + const updatePositionFunction = new NodejsFunction(this, 'UpdatePosition', { + runtime: Runtime.NODEJS_22_X, + functionName: `${props.appName}-${props.envName}-UpdatePosition`, handler: 'handler', - entry: path.resolve(__dirname, '../src/lambda/updatePositions/main.ts'), + entry: path.resolve(__dirname, '../src/lambda/updatePosition/main.ts'), memorySize: 1024, timeout: Duration.seconds(10), tracing: Tracing.ACTIVE, - layers: [adotLayer], + layers: [adotJavscriptLayer], environment: { REGION: Stack.of(this).region, DATA_TABLE_NAME: dataTable.tableName, EVENTBUS_PECUNIARY_NAME: eventBus.eventBusName, AWS_LAMBDA_EXEC_WRAPPER: '/opt/otel-handler', }, - deadLetterQueue: eventHandlerQueue, + deadLetterQueue: updatePositionDLQ, }); // Add permissions to call DynamoDB - updatePositionsFunction.addToRolePolicy( + updatePositionFunction.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ['dynamodb:Query'], resources: [dataTable.tableArn, dataTable.tableArn + '/index/accountId-gsi', dataTable.tableArn + '/index/transaction-gsi'], }) ); - updatePositionsFunction.addToRolePolicy( + updatePositionFunction.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ['dynamodb:GetItem', 'dynamodb:PutItem', 'dynamodb:UpdateItem'], @@ -580,7 +581,7 @@ export class ApiStack extends Stack { }) ); // Add permission to send to EventBridge - updatePositionsFunction.addToRolePolicy( + updatePositionFunction.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ['events:PutEvents'], @@ -588,52 +589,11 @@ export class ApiStack extends Stack { }) ); // Add permission send message to SQS - updatePositionsFunction.addToRolePolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ['SQS:SendMessage', 'SNS:Publish'], - resources: [eventHandlerQueue.queueArn], - }) - ); - - // TODO: Switch to python and use yfinance - const updatePositionMarketValueFunction = new NodejsFunction(this, 'UpdatePositionMarketValue', { - runtime: Runtime.NODEJS_22_X, - functionName: `${props.appName}-${props.envName}-UpdatePositionMarketValue`, - handler: 'handler', - entry: path.resolve(__dirname, '../src/lambda/updateMarketValue/main.ts'), - memorySize: 1024, - timeout: Duration.seconds(10), - tracing: Tracing.ACTIVE, - layers: [adotLayer], - environment: { - REGION: Stack.of(this).region, - DATA_TABLE_NAME: dataTable.tableName, - AWS_LAMBDA_EXEC_WRAPPER: '/opt/otel-handler', - }, - deadLetterQueue: eventHandlerQueue, - }); - // Add permissions to call DynamoDB - updatePositionMarketValueFunction.addToRolePolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ['dynamodb:Query'], - resources: [dataTable.tableArn, dataTable.tableArn + '/index/accountId-gsi'], - }) - ); - updatePositionMarketValueFunction.addToRolePolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ['dynamodb:GetItem', 'dynamodb:PutItem', 'dynamodb:UpdateItem'], - resources: [dataTable.tableArn], - }) - ); - // Add permission send message to SQS - updatePositionMarketValueFunction.addToRolePolicy( + updatePositionFunction.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ['SQS:SendMessage', 'SNS:Publish'], - resources: [eventHandlerQueue.queueArn], + resources: [updatePositionDLQ.queueArn], }) ); @@ -652,25 +612,7 @@ export class ApiStack extends Stack { }, }); investmentTransactionSavedRule.addTarget( - new LambdaFunction(updatePositionsFunction, { - //deadLetterQueue: SqsQueue, - maxEventAge: Duration.hours(2), - retryAttempts: 2, - }) - ); - - // EventBus Rule - PositionUpdatedEventRule - const positionUpdatedEventRule = new Rule(this, 'PositionUpdatedEventRule', { - ruleName: `${props.appName}-PositionUpdatedEventRule-${props.envName}`, - description: 'PositionUpdatedEvent', - eventBus: eventBus, - eventPattern: { - source: ['custom.pecuniary'], - detailType: ['PositionUpdatedEvent'], - }, - }); - positionUpdatedEventRule.addTarget( - new LambdaFunction(updatePositionMarketValueFunction, { + new LambdaFunction(updatePositionFunction, { //deadLetterQueue: SqsQueue, maxEventAge: Duration.hours(2), retryAttempts: 2, @@ -682,13 +624,13 @@ export class ApiStack extends Stack { ***/ // Dead Letter Queues - new CfnOutput(this, 'EventHandlerQueueArn', { - value: eventHandlerQueue.queueArn, - exportName: `${props.appName}-${props.envName}-eventHandlerQueueArn`, + new CfnOutput(this, 'UpdatePositionDLQArn', { + value: updatePositionDLQ.queueArn, + exportName: `${props.appName}-${props.envName}-updatePositionDLQArn`, }); // SNS Topics - new CfnOutput(this, 'EventHandlerTopicArn', { value: eventHandlerTopic.topicArn }); + new CfnOutput(this, 'UpdatePositionNotificationArn', { value: updatePositionNotification.topicArn }); // AppSync API new CfnOutput(this, 'GraphQLApiUrl', { value: api.graphqlUrl }); @@ -700,8 +642,8 @@ export class ApiStack extends Stack { }); // Lambda functions - new CfnOutput(this, 'UpdatePositionsFunctionArn', { - value: updatePositionsFunction.functionArn, + new CfnOutput(this, 'UpdatePositionFunctionArn', { + value: updatePositionFunction.functionArn, }); } } diff --git a/backend/package-lock.json b/backend/package-lock.json index 42e71c4c..0752d419 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -10,7 +10,9 @@ "license": "MIT", "dependencies": { "@apollo/client": "^3.10.4", + "@aws-cdk/aws-lambda-python-alpha": "^2.173.4-alpha.0", "aws-cdk-lib": "^2.173.1", + "cdk-aws-lambda-powertools-layer": "^3.7.0", "constructs": "^10.3.0", "esbuild": "^0.21.5", "graphql": "^16.10.0", @@ -288,6 +290,18 @@ "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz", "integrity": "sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==" }, + "node_modules/@aws-cdk/aws-lambda-python-alpha": { + "version": "2.173.4-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda-python-alpha/-/aws-lambda-python-alpha-2.173.4-alpha.0.tgz", + "integrity": "sha512-al5dI3LSupkrc4r7eReRzV65dohslGATJUhIQ/zhM0wSSs/pxp/cBeCZs6iBOulqTnUo1Sha5ndPzp0VvjDe9g==", + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.173.4", + "constructs": "^10.0.0" + } + }, "node_modules/@aws-cdk/cloud-assembly-schema": { "version": "38.0.1", "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-38.0.1.tgz", @@ -5774,9 +5788,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.173.2", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.173.2.tgz", - "integrity": "sha512-cL9+z8Pl3VZGoO7BwdsrFAOeud/vSl3at7OvmhihbNprMN15XuFUx/rViAU5OI1m92NbV4NBzYSLbSeCwYLNyw==", + "version": "2.173.4", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.173.4.tgz", + "integrity": "sha512-0reN94TzkWmyVZDDBlYB4qzJUig8wTHEe82YLHlWRUhrU78fT+drVGUr+lYZwwETaZ+8fLdCOl9ULvFNq7iczQ==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -6485,6 +6499,18 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/cdk-aws-lambda-powertools-layer": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/cdk-aws-lambda-powertools-layer/-/cdk-aws-lambda-powertools-layer-3.7.0.tgz", + "integrity": "sha512-elQfX0M88m39JDgac4z+vZRKiLWC0Uo5WEyRMgvuS5WrRpi/ZkqvMfBUCuUqaLDTYM248U6GvoBW5gBmm3XNFQ==", + "engines": { + "node": ">= 16.19.1" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.108.1", + "constructs": "^10.0.5" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", diff --git a/backend/package.json b/backend/package.json index 3be9172e..9fb21d27 100644 --- a/backend/package.json +++ b/backend/package.json @@ -51,7 +51,9 @@ }, "dependencies": { "@apollo/client": "^3.10.4", + "@aws-cdk/aws-lambda-python-alpha": "^2.173.4-alpha.0", "aws-cdk-lib": "^2.173.1", + "cdk-aws-lambda-powertools-layer": "^3.7.0", "constructs": "^10.3.0", "esbuild": "^0.21.5", "graphql": "^16.10.0", diff --git a/backend/src/appsync/Mutation.createCategory.ts b/backend/src/appsync/Mutation.createCategory.ts index 2647a921..2e773610 100644 --- a/backend/src/appsync/Mutation.createCategory.ts +++ b/backend/src/appsync/Mutation.createCategory.ts @@ -4,13 +4,12 @@ import { Category, MutationCreateCategoryArgs } from './api/codegen/appsync'; export function request(ctx: Context): DynamoDBPutItemRequest { console.log('🔔 CreateCategory Request: ', ctx); - const categoryId = util.autoId(); const datetime = util.time.nowISO8601(); return { operation: 'PutItem', key: { - pk: util.dynamodb.toDynamoDB(`cat#${categoryId}`), + pk: util.dynamodb.toDynamoDB(`cat#${ctx.args.name}`), }, attributeValues: { entity: util.dynamodb.toDynamoDB('category'), diff --git a/backend/src/appsync/Mutation.createPayee.ts b/backend/src/appsync/Mutation.createPayee.ts index 44db56ff..09e93df2 100644 --- a/backend/src/appsync/Mutation.createPayee.ts +++ b/backend/src/appsync/Mutation.createPayee.ts @@ -4,13 +4,12 @@ import { Payee, MutationCreatePayeeArgs } from './api/codegen/appsync'; export function request(ctx: Context): DynamoDBPutItemRequest { console.log('🔔 CreatePayee Request: ', ctx); - const payeeId = util.autoId(); const datetime = util.time.nowISO8601(); return { operation: 'PutItem', key: { - pk: util.dynamodb.toDynamoDB(`pay#${payeeId}`), + pk: util.dynamodb.toDynamoDB(`pay#${ctx.args.name}`), }, attributeValues: { entity: util.dynamodb.toDynamoDB('payee'), diff --git a/backend/src/appsync/Mutation.createSymbol.ts b/backend/src/appsync/Mutation.createSymbol.ts index 30d38aef..246eb958 100644 --- a/backend/src/appsync/Mutation.createSymbol.ts +++ b/backend/src/appsync/Mutation.createSymbol.ts @@ -4,13 +4,12 @@ import { MutationCreateSymbolArgs, Symbol } from './api/codegen/appsync'; export function request(ctx: Context): DynamoDBPutItemRequest { console.log('🔔 CreateSymbol Request: ', ctx); - const symbolId = util.autoId(); const datetime = util.time.nowISO8601(); return { operation: 'PutItem', key: { - pk: util.dynamodb.toDynamoDB(`symb#${symbolId}`), + pk: util.dynamodb.toDynamoDB(`symb#${ctx.args.name}`), }, attributeValues: { entity: util.dynamodb.toDynamoDB('symbol'), diff --git a/backend/src/lambda/updateMarketValue/main.ts b/backend/src/lambda/updateMarketValue/main.ts deleted file mode 100644 index 355d1503..00000000 --- a/backend/src/lambda/updateMarketValue/main.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { EventBridgeEvent } from 'aws-lambda'; -import { QueryCommand, QueryCommandInput, PutItemCommand, PutItemCommandInput } from '@aws-sdk/client-dynamodb'; -import { marshall, unmarshall } from '@aws-sdk/util-dynamodb'; - -import { getQuoteSummary } from './yahooFinance'; -import { PositionReadModel } from '../types/Position'; -import { CreateInvestmentTransactionInput, InvestmentTransaction } from '../../appsync/api/codegen/appsync'; -import dynamoDbCommand from './helpers/dynamoDbCommand'; - -type CreateTransactionInputV2 = { - userId: string; - symbol: string; -} & CreateInvestmentTransactionInput; - -exports.handler = async (event: EventBridgeEvent) => { - const detail = parseEvent(event); - - // Get all transactions - const transactions = await getTransactions(detail); - - // Calculate ACB - const { shares, acb, bookValue } = calculateAdjustedCostBase(transactions); - - // Save Position - create if not exists, update if exists - return await savePosition(detail, shares, acb, bookValue); -}; - -// Returns all transactions for the symbol sorted in ascending order -async function getTransactions(detail: CreateTransactionInputV2): Promise { - const params: QueryCommandInput = { - TableName: process.env.DATA_TABLE_NAME, - IndexName: 'transaction-gsi', - ScanIndexForward: true, - KeyConditionExpression: 'accountId = :v1', - FilterExpression: 'userId = :v2 AND entity = :v3 AND symbol = :v4', - ExpressionAttributeValues: { - ':v1': { S: detail.accountId }, - ':v2': { S: detail.userId }, - ':v3': { S: 'investment-transaction' }, - ':v4': { S: detail.symbol }, - }, - }; - const result = await dynamoDbCommand(new QueryCommand(params)); - - if (result.$metadata.httpStatusCode === 200) { - const transactions = result.Items?.map((Item: Record) => unmarshall(Item)); - - console.log(`🔔 Found ${transactions.length} Transactions: ${JSON.stringify(transactions)}`); - - return transactions; - } - - console.log(`🛑 Could not find transactions: ${result}`); - return [] as InvestmentTransaction[]; -} - -async function getPosition(detail: CreateTransactionInputV2): Promise { - const params: QueryCommandInput = { - TableName: process.env.DATA_TABLE_NAME, - IndexName: 'accountId-gsi', - KeyConditionExpression: 'accountId = :v1', - FilterExpression: 'userId = :v2 AND entity = :v3 AND symbol = :v4', - ExpressionAttributeValues: { - ':v1': { S: detail.accountId }, - ':v2': { S: detail.userId }, - ':v3': { S: 'position' }, - ':v4': { S: detail.symbol }, - }, - }; - const result = await dynamoDbCommand(new QueryCommand(params)); - - if (result.$metadata.httpStatusCode === 200) { - const position = result.Items?.map((Item: Record) => unmarshall(Item))[0]; - console.log(`🔔 Found Position: ${JSON.stringify(position)}`); - - return position; - } - - console.log(`🛑 Could not find Position: ${result}`); - return {} as PositionReadModel; -} - -function calculateAdjustedCostBase(transactions: InvestmentTransaction[]) { - let acb = 0; - let shares = 0; - let bookValue = 0; - - for (const t of transactions) { - const transactionType = t.type.toUpperCase(); - - console.debug(`START-${transactionType} acb: $${acb} positions: ${shares}`); - - if (transactionType.localeCompare('buy', undefined, { sensitivity: 'base' }) === 0) { - // BUY: acb = prevAcb + (shares * price + commission) - acb = acb + (t.shares * t.price + t.commission); - - shares = shares + t.shares; - bookValue = bookValue + (t.shares * t.price - t.commission); - } else if (transactionType.localeCompare('sell', undefined, { sensitivity: 'base' }) === 0) { - // SELL: acb = prevAcb * ((prevPositions - shares) / prevPositions) - acb = acb * ((shares - t.shares) / shares); - - shares = shares - t.shares; - bookValue = bookValue - (t.shares * t.price - t.commission); - } - - console.debug(`END-${transactionType} acb: $${acb} positions: ${shares}`); - } - - return { shares, acb, bookValue }; -} - -async function savePosition(detail: CreateTransactionInputV2, shares: number, acb: number, bookValue: number) { - // Get current position (if exists) - const position = await getPosition(detail); - - // Get quote for symbol - const quote = await getQuoteSummary(detail.symbol); - - let result; - - if (quote && quote.close) { - // Calculate market value - const marketValue = quote.close * shares; - - const item = { - pk: position ? position.pk : 'pos#' + detail.accountId, - userId: detail.userId, - //sk: position ? position.sk : "ACCPOS#" + new Date().toISOString(), - createdAt: position ? position.createdAt : new Date().toISOString(), - updatedAt: new Date().toISOString(), - accountId: detail.accountId, - entity: 'position', - symbol: quote.symbol, - description: quote.description, - exchange: quote.exchange, - currency: quote.currency, - shares: shares, - acb: acb, - bookValue: bookValue, - marketValue: marketValue, - }; - - const putItemCommandInput: PutItemCommandInput = { - TableName: process.env.DATA_TABLE_NAME, - Item: marshall(item), - }; - result = await dynamoDbCommand(new PutItemCommand(putItemCommandInput)); - - if (result.$metadata.httpStatusCode === 200) { - console.log(`✅ Saved Position: { result: ${JSON.stringify(result)}, items: ${JSON.stringify(item)} }`); - return result.Items; - } - } - - console.log(`🛑 Could not save Position ${detail.symbol}:`, result); - return {}; -} - -function parseEvent(event: EventBridgeEvent): CreateTransactionInputV2 { - const eventString: string = JSON.stringify(event); - - console.debug(`🕧 Received event: ${eventString}`); - - return JSON.parse(eventString).detail; -} diff --git a/backend/src/lambda/updateMarketValue/package-lock.json b/backend/src/lambda/updateMarketValue/package-lock.json deleted file mode 100644 index c802f349..00000000 --- a/backend/src/lambda/updateMarketValue/package-lock.json +++ /dev/null @@ -1,2000 +0,0 @@ -{ - "name": "update-positions-market-value", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "update-positions-market-value", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@aws-sdk/client-dynamodb": "^3.624.0", - "@aws-sdk/client-eventbridge": "^3.626.0", - "@aws-sdk/util-dynamodb": "^3.577.0", - "@types/aws-lambda": "^8.10.138", - "aws-lambda": "^1.0.7", - "yahoo-finance2": "^2.13.3" - }, - "devDependencies": { - "@types/node": "^20.12.12" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.624.0.tgz", - "integrity": "sha512-/xssTNmwL+au3JIRQLHwz6O1kF8R9lfmL1PocQ+9sxcL4titU9TGslUotvZjdbklp3LzfusQh9Svx5g8EaONSw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-endpoint-discovery": "3.620.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-eventbridge": { - "version": "3.626.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-eventbridge/-/client-eventbridge-3.626.0.tgz", - "integrity": "sha512-xQKP7zzRVmrkVnSdXOzble63hckof0cDzBlYD27dtM7hsLK2DIWyTgqbX08hLzjMaTOofNGfFBRFu8Fao0JfZQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/signature-v4-multi-region": "3.626.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.624.0.tgz", - "integrity": "sha512-EX6EF+rJzMPC5dcdsu40xSi2To7GSvdGQNIpe97pD9WvZwM9tRNQnNM4T6HA4gjV1L6Jwk8rBlG/CnveXtLEMw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.624.0.tgz", - "integrity": "sha512-Ki2uKYJKKtfHxxZsiMTOvJoVRP6b2pZ1u3rcUb2m/nVgBPUfLdl8ZkGpqE29I+t5/QaS/sEdbn6cgMUZwl+3Dg==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.624.0.tgz", - "integrity": "sha512-k36fLZCb2nfoV/DKK3jbRgO/Yf7/R80pgYfMiotkGjnZwDmRvNN08z4l06L9C+CieazzkgRxNUzyppsYcYsQaw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.624.0.tgz", - "integrity": "sha512-WyFmPbhRIvtWi7hBp8uSFy+iPpj8ccNV/eX86hwF4irMjfc/FtsGVIAeBXxXM/vGCjkdfEzOnl+tJ2XACD4OXg==", - "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.624.0.tgz", - "integrity": "sha512-mMoNIy7MO2WTBbdqMyLpbt6SZpthE6e0GkRYpsd0yozPt0RZopcBhEh+HG1U9Y1PVODo+jcMk353vAi61CfnhQ==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.624.0.tgz", - "integrity": "sha512-A02bayIjU9APEPKr3HudrFHEx0WfghoSPsPopckDkW7VBqO4wizzcxr75Q9A3vNX+cwg0wCN6UitTNe6pVlRaQ==", - "dependencies": { - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "node_modules/@aws-sdk/endpoint-cache": { - "version": "3.572.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.572.0.tgz", - "integrity": "sha512-CzuRWMj/xtN9p9eP915nlPmlyniTzke732Ow/M60++gGgB3W+RtZyFftw3TEx+NzNhd1tH54dEcGiWdiNaBz3Q==", - "dependencies": { - "mnemonist": "0.38.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.620.0.tgz", - "integrity": "sha512-T6kuydHBF4BPP5CVH53Fze7c2b9rqxWP88XrGtmNMXXdY4sXur1v/itGdS2l3gqRjxKo0LsmjmuQm9zL4vGneQ==", - "dependencies": { - "@aws-sdk/endpoint-cache": "3.572.0", - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.626.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.626.0.tgz", - "integrity": "sha512-frFh6GQ1OEGueB0fL6Ft5rdHF+eu8JZUREjeBNEcg1qRqtMpPOlYkKzJ434d4zo+JHSK5xKFeb/Gu/kvB4LxEA==", - "dependencies": { - "@aws-sdk/core": "3.624.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", - "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.626.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.626.0.tgz", - "integrity": "sha512-n3yN668b2XLY6155y2KRCCDfA67Acxf/wUS60wGPNrJKk9O5AZzGQzZF8tLfMSng5YBS/CCHN40ooMhRwSLWUg==", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.626.0", - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", - "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.577.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.577.0.tgz", - "integrity": "sha512-GGzUZ1saDcP052jFpZ6HfukMwBM2Jtxq1H0fzfWV1YPLikjNJaXt8j/Eng2cNNH0RUdTkPGVAF+mlHjNirosKA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.577.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", - "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.32.35", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.32.35.tgz", - "integrity": "sha512-Ul3YyOTU++to8cgNkttakC0dWvpERr6RYoHO2W47DLbFvrwBDJUY31B1sImH6JZSYc4Kt4PyHtoPNu+vL2r2dA==" - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", - "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", - "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", - "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", - "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", - "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@types/aws-lambda": { - "version": "8.10.138", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.138.tgz", - "integrity": "sha512-71EHMl70TPWIAsFuHd85NHq6S6T2OOjiisPTrH7RgcjzpJpPh4RQJv7PvVvIxc6PIp8CLV7F9B+TdjcAES5vcA==" - }, - "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-lambda": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/aws-lambda/-/aws-lambda-1.0.7.tgz", - "integrity": "sha512-9GNFMRrEMG5y3Jvv+V4azWvc+qNWdWLTjDdhf/zgMlz8haaaLWv0xeAIWxz9PuWUBawsVxy0zZotjCdR3Xq+2w==", - "dependencies": { - "aws-sdk": "^2.814.0", - "commander": "^3.0.2", - "js-yaml": "^3.14.1", - "watchpack": "^2.0.0-beta.10" - }, - "bin": { - "lambda": "bin/lambda" - } - }, - "node_modules/aws-sdk": { - "version": "2.1625.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1625.0.tgz", - "integrity": "sha512-Q96jKdo9PtBYPNOXoGTYvOt78TSRouLOeeFpcVfsN38O0Lc3LmuIMz3GHMofdLZGKRSa22RnpiDTCnpp6Xx1jw==", - "hasInstallScript": true, - "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.4", - "uuid": "8.0.0", - "xml2js": "0.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aws-sdk/node_modules/uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mnemonist": { - "version": "0.38.3", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", - "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", - "dependencies": { - "obliterator": "^1.6.1" - } - }, - "node_modules/obliterator": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", - "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==" - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/psl/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie-file-store": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tough-cookie-file-store/-/tough-cookie-file-store-2.0.3.tgz", - "integrity": "sha512-sMpZVcmFf6EYFHFFl+SYH4W1/OnXBYMGDsv2IlbQ2caHyFElW/UR/gpj/KYU1JwmP4dE9xqwv2+vWcmlXHojSw==", - "dependencies": { - "tough-cookie": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/yahoo-finance2": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-2.13.3.tgz", - "integrity": "sha512-ZECy6wQ7ymT08nVrxqQf+gwmINJ4/ECLyq+vM3SQmH3HWzje5DX1WX5YcZpWpWi4KXdmo2Vuk9OAdrTP09nE4g==", - "dependencies": { - "@sinclair/typebox": "^0.32.27", - "@types/tough-cookie": "^4.0.2", - "tough-cookie": "^4.1.2", - "tough-cookie-file-store": "^2.0.3" - }, - "bin": { - "yahoo-finance": "bin/yahoo-finance.js" - }, - "engines": { - "node": ">=18.0.0" - } - } - } -} diff --git a/backend/src/lambda/updatePositions/main.ts b/backend/src/lambda/updatePosition/main.ts similarity index 69% rename from backend/src/lambda/updatePositions/main.ts rename to backend/src/lambda/updatePosition/main.ts index 50de1885..4818a2a6 100644 --- a/backend/src/lambda/updatePositions/main.ts +++ b/backend/src/lambda/updatePosition/main.ts @@ -3,9 +3,9 @@ import { QueryCommand, QueryCommandInput, PutItemCommand, PutItemCommandInput } import { marshall, unmarshall } from '@aws-sdk/util-dynamodb'; import { InvestmentTransaction } from '../../appsync/api/codegen/appsync'; -import dynamoDbCommand from './helpers/dynamoDbCommand'; -import publishEventAsync from './helpers/eventBridgePublishEvent'; -import { PositionReadModel } from '../types/Position'; +import dynamoDbCommand from './utils/dynamoDbClient'; +import { getQuoteSummary } from './utils/yahooFinance'; +import { PositionReadModel } from './types/PositionReadModel'; exports.handler = async (event: EventBridgeEvent) => { const detail = parseEvent(event); @@ -16,17 +16,17 @@ exports.handler = async (event: EventBridgeEvent) // Calculate ACB const { shares, acb, bookValue } = calculateAdjustedCostBase(transactions); - // Save Position - create if not exists, update if exists - const position = await savePosition(detail, shares, acb, bookValue); + // Get current position (if exists) + let position = await getPosition(detail); - // Publish PositionUpdatedEvent to trigger updatePositionMarketValue - await publishEventAsync('PositionUpdatedEvent', position); + // Save Position - create if not exists, update if exists + position = await savePosition(position, detail, shares, acb, bookValue); return position; }; // Returns all transactions for the symbol sorted in ascending order -async function getTransactions(detail: InvestmentTransaction): Promise { +export async function getTransactions(detail: InvestmentTransaction): Promise { const params: QueryCommandInput = { TableName: process.env.DATA_TABLE_NAME, IndexName: 'transaction-gsi', @@ -45,13 +45,12 @@ async function getTransactions(detail: InvestmentTransaction): Promise) => unmarshall(Item)); - console.log(`🔔 Found ${transactions.length} Transactions: ${JSON.stringify(transactions)}`); + console.info(`🔔 Found ${transactions.length} Transactions: ${JSON.stringify(transactions)}`); return transactions; } - console.log(`🛑 Could not find transactions: ${result}`); - return [] as InvestmentTransaction[]; + throw new Error(`🛑 Could not find any transactions: ${result}`); } async function getPosition(detail: InvestmentTransaction): Promise { @@ -69,18 +68,19 @@ async function getPosition(detail: InvestmentTransaction): Promise) => unmarshall(Item))[0]; - console.log(`🔔 Found Position: ${JSON.stringify(position)}`); - - return position; + position = result.Items?.map((Item: Record) => unmarshall(Item))[0]; } - console.log(`🛑 Could not find Position: ${result}`); - return {} as PositionReadModel; + position + ? console.log(`🔔 Found existing Position: ${JSON.stringify(position)}`) + : console.log(`🔔 No existing Position found: ${result}`); + + return position as PositionReadModel; } -function calculateAdjustedCostBase(transactions: InvestmentTransaction[]) { +export function calculateAdjustedCostBase(transactions: InvestmentTransaction[]) { let acb = 0; let shares = 0; let bookValue = 0; @@ -110,11 +110,21 @@ function calculateAdjustedCostBase(transactions: InvestmentTransaction[]) { return { shares, acb, bookValue }; } -async function savePosition(detail: InvestmentTransaction, shares: number, acb: number, bookValue: number): Promise { - // Get current position (if exists) - const position = await getPosition(detail); +async function savePosition( + position: PositionReadModel, + detail: InvestmentTransaction, + shares: number, + acb: number, + bookValue: number +): Promise { + const quote = await getQuoteSummary(detail.symbol); + + if (!quote || !quote.close || !quote.currency) { + throw new Error(`🛑 Could not get quote for ${detail.symbol}`); + } - let result; + // Calculate market value + const marketValue = quote.close ?? 0 * position.shares; const item: PositionReadModel = { pk: position ? position.pk : 'pos#' + detail.accountId, @@ -124,10 +134,10 @@ async function savePosition(detail: InvestmentTransaction, shares: number, acb: accountId: detail.accountId, entity: 'position', symbol: detail.symbol, - description: '', // To be set downstream - exchange: '', // To be set downstream - currency: '', // To be set downstream - marketValue: 0, // To be set downstream + description: quote.description ?? '', + exchange: quote.exchange ?? '', + currency: quote.currency, + marketValue: marketValue, shares: shares, acb: acb, bookValue: bookValue, @@ -139,15 +149,15 @@ async function savePosition(detail: InvestmentTransaction, shares: number, acb: TableName: process.env.DATA_TABLE_NAME, Item: marshall(item), }; - result = await dynamoDbCommand(new PutItemCommand(putItemCommandInput)); + + let result = await dynamoDbCommand(new PutItemCommand(putItemCommandInput)); if (result.$metadata.httpStatusCode === 200) { - console.log(`✅ Saved Position: { result: ${JSON.stringify(result)}`); + console.log(`✅ Saved/Updated Position: { result: ${JSON.stringify(result)}`); return item; } - console.log(`🛑 Could not save Position ${detail.symbol}:`, result); - return {} as PositionReadModel; + throw new Error(`🛑 Could not save Position ${detail.symbol}: ${result}`); } function parseEvent(event: EventBridgeEvent): InvestmentTransaction { diff --git a/backend/src/lambda/updatePositions/package-lock.json b/backend/src/lambda/updatePosition/package-lock.json similarity index 64% rename from backend/src/lambda/updatePositions/package-lock.json rename to backend/src/lambda/updatePosition/package-lock.json index d8f67404..4cf142ff 100644 --- a/backend/src/lambda/updatePositions/package-lock.json +++ b/backend/src/lambda/updatePosition/package-lock.json @@ -1,17 +1,16 @@ { - "name": "update-positions", + "name": "update-position", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "update-positions", + "name": "update-position", "version": "1.0.0", "license": "ISC", "dependencies": { - "@aws-sdk/client-dynamodb": "^3.624.0", - "@aws-sdk/client-eventbridge": "^3.626.0", - "@aws-sdk/util-dynamodb": "^3.577.0", + "@aws-sdk/client-dynamodb": "^3.716.0", + "@aws-sdk/util-dynamodb": "^3.716.0", "@types/aws-lambda": "^8.10.138", "aws-lambda": "^1.0.7", "yahoo-finance2": "^2.13.3" @@ -136,52 +135,53 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.624.0.tgz", - "integrity": "sha512-/xssTNmwL+au3JIRQLHwz6O1kF8R9lfmL1PocQ+9sxcL4titU9TGslUotvZjdbklp3LzfusQh9Svx5g8EaONSw==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.716.0.tgz", + "integrity": "sha512-/brlrkp5ShSgxSmzj1b7S6ds7iYpqnTlwxdX0ld+bIRrFJH2PS91CAuT1rZiqLG9rarWfk3Of5G0BrclroVnhA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-endpoint-discovery": "3.620.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-sdk/client-sso-oidc": "3.716.0", + "@aws-sdk/client-sts": "3.716.0", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/credential-provider-node": "3.716.0", + "@aws-sdk/middleware-endpoint-discovery": "3.714.0", + "@aws-sdk/middleware-host-header": "3.714.0", + "@aws-sdk/middleware-logger": "3.714.0", + "@aws-sdk/middleware-recursion-detection": "3.714.0", + "@aws-sdk/middleware-user-agent": "3.716.0", + "@aws-sdk/region-config-resolver": "3.714.0", + "@aws-sdk/types": "3.714.0", + "@aws-sdk/util-endpoints": "3.714.0", + "@aws-sdk/util-user-agent-browser": "3.714.0", + "@aws-sdk/util-user-agent-node": "3.716.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/core": "^2.5.5", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/hash-node": "^3.0.11", + "@smithy/invalid-dependency": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.13", + "@smithy/middleware-endpoint": "^3.2.6", + "@smithy/middleware-retry": "^3.0.31", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.1", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/util-defaults-mode-browser": "^3.0.31", + "@smithy/util-defaults-mode-node": "^3.0.31", + "@smithy/util-endpoints": "^2.1.7", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", + "@smithy/util-waiter": "^3.2.0", + "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -189,99 +189,47 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-eventbridge": { - "version": "3.626.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-eventbridge/-/client-eventbridge-3.626.0.tgz", - "integrity": "sha512-xQKP7zzRVmrkVnSdXOzble63hckof0cDzBlYD27dtM7hsLK2DIWyTgqbX08hLzjMaTOofNGfFBRFu8Fao0JfZQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/signature-v4-multi-region": "3.626.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.624.0.tgz", - "integrity": "sha512-EX6EF+rJzMPC5dcdsu40xSi2To7GSvdGQNIpe97pD9WvZwM9tRNQnNM4T6HA4gjV1L6Jwk8rBlG/CnveXtLEMw==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.716.0.tgz", + "integrity": "sha512-5Nb0jJXce2TclbjG7WVPufwhgV1TRydz1QnsuBtKU0AdViEpr787YrZhPpGnNIM1Dx+R1H/tmAHZnOoohS6D8g==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/middleware-host-header": "3.714.0", + "@aws-sdk/middleware-logger": "3.714.0", + "@aws-sdk/middleware-recursion-detection": "3.714.0", + "@aws-sdk/middleware-user-agent": "3.716.0", + "@aws-sdk/region-config-resolver": "3.714.0", + "@aws-sdk/types": "3.714.0", + "@aws-sdk/util-endpoints": "3.714.0", + "@aws-sdk/util-user-agent-browser": "3.714.0", + "@aws-sdk/util-user-agent-node": "3.716.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/core": "^2.5.5", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/hash-node": "^3.0.11", + "@smithy/invalid-dependency": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.13", + "@smithy/middleware-endpoint": "^3.2.6", + "@smithy/middleware-retry": "^3.0.31", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.1", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/util-defaults-mode-browser": "^3.0.31", + "@smithy/util-defaults-mode-node": "^3.0.31", + "@smithy/util-endpoints": "^2.1.7", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -290,47 +238,47 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.624.0.tgz", - "integrity": "sha512-Ki2uKYJKKtfHxxZsiMTOvJoVRP6b2pZ1u3rcUb2m/nVgBPUfLdl8ZkGpqE29I+t5/QaS/sEdbn6cgMUZwl+3Dg==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.716.0.tgz", + "integrity": "sha512-lA4IB9FzR2KjH7EVCo+mHGFKqdViVyeBQEIX9oVratL/l7P0bMS1fMwgfHOc3ACazqNxBxDES7x08ZCp32y6Lw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/credential-provider-node": "3.716.0", + "@aws-sdk/middleware-host-header": "3.714.0", + "@aws-sdk/middleware-logger": "3.714.0", + "@aws-sdk/middleware-recursion-detection": "3.714.0", + "@aws-sdk/middleware-user-agent": "3.716.0", + "@aws-sdk/region-config-resolver": "3.714.0", + "@aws-sdk/types": "3.714.0", + "@aws-sdk/util-endpoints": "3.714.0", + "@aws-sdk/util-user-agent-browser": "3.714.0", + "@aws-sdk/util-user-agent-node": "3.716.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/core": "^2.5.5", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/hash-node": "^3.0.11", + "@smithy/invalid-dependency": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.13", + "@smithy/middleware-endpoint": "^3.2.6", + "@smithy/middleware-retry": "^3.0.31", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.1", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/util-defaults-mode-browser": "^3.0.31", + "@smithy/util-defaults-mode-node": "^3.0.31", + "@smithy/util-endpoints": "^2.1.7", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -338,52 +286,52 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" + "@aws-sdk/client-sts": "^3.716.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.624.0.tgz", - "integrity": "sha512-k36fLZCb2nfoV/DKK3jbRgO/Yf7/R80pgYfMiotkGjnZwDmRvNN08z4l06L9C+CieazzkgRxNUzyppsYcYsQaw==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.716.0.tgz", + "integrity": "sha512-i4SVNsrdXudp8T4bkm7Fi3YWlRnvXCSwvNDqf6nLqSJxqr4CN3VlBELueDyjBK7TAt453/qSif+eNx+bHmwo4Q==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-sdk/client-sso-oidc": "3.716.0", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/credential-provider-node": "3.716.0", + "@aws-sdk/middleware-host-header": "3.714.0", + "@aws-sdk/middleware-logger": "3.714.0", + "@aws-sdk/middleware-recursion-detection": "3.714.0", + "@aws-sdk/middleware-user-agent": "3.716.0", + "@aws-sdk/region-config-resolver": "3.714.0", + "@aws-sdk/types": "3.714.0", + "@aws-sdk/util-endpoints": "3.714.0", + "@aws-sdk/util-user-agent-browser": "3.714.0", + "@aws-sdk/util-user-agent-node": "3.716.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/core": "^2.5.5", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/hash-node": "^3.0.11", + "@smithy/invalid-dependency": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.13", + "@smithy/middleware-endpoint": "^3.2.6", + "@smithy/middleware-retry": "^3.0.31", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.1", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/util-defaults-mode-browser": "^3.0.31", + "@smithy/util-defaults-mode-node": "^3.0.31", + "@smithy/util-endpoints": "^2.1.7", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -392,17 +340,19 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.624.0.tgz", - "integrity": "sha512-WyFmPbhRIvtWi7hBp8uSFy+iPpj8ccNV/eX86hwF4irMjfc/FtsGVIAeBXxXM/vGCjkdfEzOnl+tJ2XACD4OXg==", - "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.716.0.tgz", + "integrity": "sha512-5DkUiTrbyzO8/W4g7UFEqRFpuhgizayHI/Zbh0wtFMcot8801nJV+MP/YMhdjimlvAr/OqYB08FbGsPyWppMTw==", + "dependencies": { + "@aws-sdk/types": "3.714.0", + "@smithy/core": "^2.5.5", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/property-provider": "^3.1.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/signature-v4": "^4.2.4", + "@smithy/smithy-client": "^3.5.1", + "@smithy/types": "^3.7.2", + "@smithy/util-middleware": "^3.0.11", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, @@ -411,13 +361,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.716.0.tgz", + "integrity": "sha512-JI2KQUnn2arICwP9F3CnqP1W3nAbm4+meQg/yOhp9X0DMzQiHrHRd4HIrK2vyVgi2/6hGhONY5uLF26yRTA7nQ==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/types": "3.714.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -425,18 +376,19 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.716.0.tgz", + "integrity": "sha512-CZ04pl2z7igQPysQyH2xKZHM3fLwkemxQbKOlje3TmiS1NwXvcKvERhp9PE/H23kOL7beTM19NMRog/Fka/rlw==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/types": "3.714.0", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/node-http-handler": "^3.3.2", + "@smithy/property-provider": "^3.1.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/smithy-client": "^3.5.1", + "@smithy/types": "^3.7.2", + "@smithy/util-stream": "^3.3.2", "tslib": "^2.6.2" }, "engines": { @@ -444,45 +396,46 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.624.0.tgz", - "integrity": "sha512-mMoNIy7MO2WTBbdqMyLpbt6SZpthE6e0GkRYpsd0yozPt0RZopcBhEh+HG1U9Y1PVODo+jcMk353vAi61CfnhQ==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.716.0.tgz", + "integrity": "sha512-P37We2GtZvdROxiwP0zrpEL81/HuYK1qlYxp5VCj3uV+G4mG8UQN2gMIU/baYrpOQqa0h81RfyQGRFUjVaDVqw==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/credential-provider-env": "3.716.0", + "@aws-sdk/credential-provider-http": "3.716.0", + "@aws-sdk/credential-provider-process": "3.716.0", + "@aws-sdk/credential-provider-sso": "3.716.0", + "@aws-sdk/credential-provider-web-identity": "3.716.0", + "@aws-sdk/types": "3.714.0", + "@smithy/credential-provider-imds": "^3.2.8", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" + "@aws-sdk/client-sts": "^3.716.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.716.0.tgz", + "integrity": "sha512-FGQPK2uKfS53dVvoskN/s/t6m0Po24BGd1PzJdzHBFCOjxbZLM6+8mDMXeyi2hCLVVQOUcuW41kOgmJ0+zMbww==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/credential-provider-env": "3.716.0", + "@aws-sdk/credential-provider-http": "3.716.0", + "@aws-sdk/credential-provider-ini": "3.716.0", + "@aws-sdk/credential-provider-process": "3.716.0", + "@aws-sdk/credential-provider-sso": "3.716.0", + "@aws-sdk/credential-provider-web-identity": "3.716.0", + "@aws-sdk/types": "3.714.0", + "@smithy/credential-provider-imds": "^3.2.8", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -490,14 +443,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.716.0.tgz", + "integrity": "sha512-0spcu2MWVVHSTHH3WE2E//ttUJPwXRM3BCp+WyI41xLzpNu1Fd8zjOrDpEo0SnGUzsSiRTIJWgkuu/tqv9NJ2A==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/types": "3.714.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -505,16 +459,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.624.0.tgz", - "integrity": "sha512-A02bayIjU9APEPKr3HudrFHEx0WfghoSPsPopckDkW7VBqO4wizzcxr75Q9A3vNX+cwg0wCN6UitTNe6pVlRaQ==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.716.0.tgz", + "integrity": "sha512-J2IA3WuCpRGGoZm6VHZVFCnrxXP+41iUWb9Ct/1spljegTa1XjiaZ5Jf3+Ubj7WKiyvP9/dgz1L0bu2bYEjliw==", "dependencies": { - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/client-sso": "3.716.0", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/token-providers": "3.714.0", + "@aws-sdk/types": "3.714.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -522,26 +477,27 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.716.0.tgz", + "integrity": "sha512-vzgpWKs2gGXZGdbMKRFrMW4PqEFWkGvwWH2T7ZwQv9m+8lQ7P4Dk2uimqu0f37HZAbpn8HFMqRh4CaySjU354A==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/types": "3.714.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "@aws-sdk/client-sts": "^3.716.0" } }, "node_modules/@aws-sdk/endpoint-cache": { - "version": "3.572.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.572.0.tgz", - "integrity": "sha512-CzuRWMj/xtN9p9eP915nlPmlyniTzke732Ow/M60++gGgB3W+RtZyFftw3TEx+NzNhd1tH54dEcGiWdiNaBz3Q==", + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.693.0.tgz", + "integrity": "sha512-/zK0ZZncBf5FbTfo8rJMcQIXXk4Ibhe5zEMiwFNivVPR2uNC0+oqfwXz7vjxwY0t6BPE3Bs4h9uFEz4xuGCY6w==", "dependencies": { "mnemonist": "0.38.3", "tslib": "^2.6.2" @@ -551,15 +507,15 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.620.0.tgz", - "integrity": "sha512-T6kuydHBF4BPP5CVH53Fze7c2b9rqxWP88XrGtmNMXXdY4sXur1v/itGdS2l3gqRjxKo0LsmjmuQm9zL4vGneQ==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.714.0.tgz", + "integrity": "sha512-WttOa+M6/aPCK0OHPlWPBaQDTVhfKsWYnmDNvS2d0qvoJEjZuGRyf5DxcA2gWt3MMekxwq9IxOpdA5R9T70HiA==", "dependencies": { - "@aws-sdk/endpoint-cache": "3.572.0", - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/endpoint-cache": "3.693.0", + "@aws-sdk/types": "3.714.0", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -567,13 +523,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.714.0.tgz", + "integrity": "sha512-6l68kjNrh5QC8FGX3I3geBDavWN5Tg1RLHJ2HLA8ByGBtJyCwnz3hEkKfaxn0bBx0hF9DzbfjEOUF6cDqy2Kjg==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.714.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -581,12 +537,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.714.0.tgz", + "integrity": "sha512-RkqHlMvQWUaRklU1bMfUuBvdWwxgUtEqpADaHXlGVj3vtEY2UgBjy+57CveC4MByqKIunNvVHBBbjrGVtwY7Lg==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.714.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -594,37 +550,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.714.0.tgz", + "integrity": "sha512-AVU5ixnh93nqtsfgNc284oXsXaadyHGPHpql/jwgaaqQfEXjS/1/j3j9E/vpacfTTz2Vzo7hAOjnvrOXSEVDaA==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.626.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.626.0.tgz", - "integrity": "sha512-frFh6GQ1OEGueB0fL6Ft5rdHF+eu8JZUREjeBNEcg1qRqtMpPOlYkKzJ434d4zo+JHSK5xKFeb/Gu/kvB4LxEA==", - "dependencies": { - "@aws-sdk/core": "3.624.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/types": "3.714.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -632,14 +564,16 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", - "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.716.0.tgz", + "integrity": "sha512-FpAtT6nNKrYdkDZndutEraiRMf+TgDzAGvniqRtZ/YTPA+gIsWrsn+TwMKINR81lFC3nQfb9deS5CFtxd021Ew==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.716.0", + "@aws-sdk/types": "3.714.0", + "@aws-sdk/util-endpoints": "3.714.0", + "@smithy/core": "^2.5.5", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -647,31 +581,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.714.0.tgz", + "integrity": "sha512-HJzsQxgMOAzZrbf/YIqEx30or4tZK1oNAk6Wm6xecUQx+23JXIaePRu1YFUOLBBERQ4QBPpISFurZWBMZ5ibAw==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.714.0", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.626.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.626.0.tgz", - "integrity": "sha512-n3yN668b2XLY6155y2KRCCDfA67Acxf/wUS60wGPNrJKk9O5AZzGQzZF8tLfMSng5YBS/CCHN40ooMhRwSLWUg==", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.626.0", - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.11", "tslib": "^2.6.2" }, "engines": { @@ -679,40 +597,29 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.714.0.tgz", + "integrity": "sha512-vKN064aLE3kl+Zl16Ony3jltHnMddMBT7JRkP1L+lLywhA0PcAKxpdvComul/sTBWnbnwLnaS5NsDUhcWySH8A==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.714.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" + "@aws-sdk/client-sso-oidc": "^3.714.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", - "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.714.0.tgz", + "integrity": "sha512-ZjpP2gYbSFlxxaUDa1Il5AVvfggvUPbjzzB/l3q0gIE5Thd6xKW+yzEpt2mLZ5s5UaYSABZbF94g8NUOF4CVGA==", "dependencies": { + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -720,9 +627,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.577.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.577.0.tgz", - "integrity": "sha512-GGzUZ1saDcP052jFpZ6HfukMwBM2Jtxq1H0fzfWV1YPLikjNJaXt8j/Eng2cNNH0RUdTkPGVAF+mlHjNirosKA==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.716.0.tgz", + "integrity": "sha512-lXAbIj+TvMxgeV5Rr9Q1U+g6ovkTMVi7+Ihp6vz8KAyySwAr5zhzOalWq7sRML350yn0TCCwyvFxfLRClJxRUw==", "dependencies": { "tslib": "^2.6.2" }, @@ -730,17 +637,17 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.577.0" + "@aws-sdk/client-dynamodb": "^3.716.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", - "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.714.0.tgz", + "integrity": "sha512-Xv+Z2lhe7w7ZZRsgBwBMZgGTVmS+dkkj2S13uNHAx9lhB5ovM8PhK5G/j28xYf6vIibeuHkRAbb7/ozdZIGR+A==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", + "@aws-sdk/types": "3.714.0", + "@smithy/types": "^3.7.2", + "@smithy/util-endpoints": "^2.1.7", "tslib": "^2.6.2" }, "engines": { @@ -759,24 +666,25 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "version": "3.714.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.714.0.tgz", + "integrity": "sha512-OdJJ03cP9/MgIVToPJPCPUImbpZzTcwdIgbXC0tUQPJhbD7b7cB4LdnkhNHko+MptpOrCq4CPY/33EpOjRdofw==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.714.0", + "@smithy/types": "^3.7.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "version": "3.716.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.716.0.tgz", + "integrity": "sha512-3PqaXmQbxrtHKAsPCdp7kn5FrQktj8j3YyuNsqFZ8rWZeEQ88GWlsvE61PTsr2peYCKzpFqYVddef2x1axHU0w==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/middleware-user-agent": "3.716.0", + "@aws-sdk/types": "3.714.0", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -797,11 +705,11 @@ "integrity": "sha512-Ul3YyOTU++to8cgNkttakC0dWvpERr6RYoHO2W47DLbFvrwBDJUY31B1sImH6JZSYc4Kt4PyHtoPNu+vL2r2dA==" }, "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz", + "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -809,14 +717,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.13.tgz", + "integrity": "sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-middleware": "^3.0.11", "tslib": "^2.6.2" }, "engines": { @@ -824,17 +732,17 @@ } }, "node_modules/@smithy/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", - "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.6.tgz", + "integrity": "sha512-w494xO+CPwG/5B/N2l0obHv2Fi9U4DAY+sTi1GWT3BVvGpZetJjJXAynIO9IHp4zS1PinGhXtRSZydUXbJO4ag==", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-stream": "^3.3.3", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { @@ -842,14 +750,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.8.tgz", + "integrity": "sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", "tslib": "^2.6.2" }, "engines": { @@ -857,23 +765,23 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.2.tgz", + "integrity": "sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA==", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.11.tgz", + "integrity": "sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -883,11 +791,11 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.11.tgz", + "integrity": "sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" } }, @@ -903,12 +811,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz", + "integrity": "sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -916,16 +824,17 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.7.tgz", + "integrity": "sha512-GTxSKf280aJBANGN97MomUQhW1VNxZ6w7HAj/pvZM5MUHbMPOGnWOp1PRYKi4czMaHNj9bdiA+ZarmT3Wkdqiw==", "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", + "@smithy/core": "^2.5.6", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "@smithy/util-middleware": "^3.0.11", "tslib": "^2.6.2" }, "engines": { @@ -933,17 +842,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", - "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.32.tgz", + "integrity": "sha512-v8gVA9HqibuZkFuFpfkC/EcHE8no/3Mv3JvRUGly63Axt4yyas1WDVOasFSdiqm2hZVpY7/k8mRT1Wd5k7r3Yw==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/protocol-http": "^4.1.8", + "@smithy/service-error-classification": "^3.0.11", + "@smithy/smithy-client": "^3.5.2", + "@smithy/types": "^3.7.2", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -952,11 +861,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz", + "integrity": "sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -964,11 +873,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz", + "integrity": "sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -976,13 +885,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz", + "integrity": "sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -990,14 +899,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.3.tgz", + "integrity": "sha512-BrpZOaZ4RCbcJ2igiSNG16S+kgAc65l/2hmxWdmhyoGWHTLlzQzr06PXavJp9OBlPEG/sHlqdxjWmjzV66+BSQ==", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.9", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1005,11 +914,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz", + "integrity": "sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1017,11 +926,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1029,11 +938,11 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz", + "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, @@ -1042,11 +951,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz", + "integrity": "sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1054,22 +963,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", + "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", "dependencies": { - "@smithy/types": "^3.3.0" + "@smithy/types": "^3.7.2" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz", + "integrity": "sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1077,15 +986,15 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", + "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-middleware": "^3.0.11", "@smithy/util-uri-escape": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -1095,15 +1004,16 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", - "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.5.2.tgz", + "integrity": "sha512-h7xn+1wlpbXyLrtvo/teHR1SFGIIrQ3imzG0nz43zVLAJgvfC1Mtdwa1pFhoIOYrt/TiNjt4pD0gSYQEdZSBtg==", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@smithy/core": "^2.5.6", + "@smithy/middleware-endpoint": "^3.2.7", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-stream": "^3.3.3", "tslib": "^2.6.2" }, "engines": { @@ -1111,9 +1021,9 @@ } }, "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "dependencies": { "tslib": "^2.6.2" }, @@ -1122,12 +1032,12 @@ } }, "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz", + "integrity": "sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/querystring-parser": "^3.0.11", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" } }, @@ -1187,13 +1097,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", - "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.32.tgz", + "integrity": "sha512-FAGsnm/xJ19SZeoqGyo9CosqjUlm+XJTmygDMktebvDKw3bKiIiZ40O1MA6Z52KLmekYU2GO7BEK7u6e7ZORKw==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/smithy-client": "^3.5.2", + "@smithy/types": "^3.7.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -1202,16 +1112,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", - "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.32.tgz", + "integrity": "sha512-2CzKhkPFCVdd15f3+0D1rldNlvJME8pVRBtVVsea2hy7lcOn0bGB0dTVUwzgfM4LW/aU4IOg3jWf25ZWaxbOiw==", "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/credential-provider-imds": "^3.2.8", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/property-provider": "^3.1.11", + "@smithy/smithy-client": "^3.5.2", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1219,12 +1129,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.7.tgz", + "integrity": "sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1243,11 +1153,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1255,12 +1165,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", + "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/service-error-classification": "^3.0.11", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1268,13 +1178,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.3.tgz", + "integrity": "sha512-bOm0YMMxRjbI3X6QkWwADPFkh2AH2xBMQIB1IQgCsCRqXXpSJatgjUR3oxHthpYwFkw3WPkOt8VgMpJxC0rFqg==", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/fetch-http-handler": "^4.1.2", + "@smithy/node-http-handler": "^3.3.3", + "@smithy/types": "^3.7.2", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", @@ -1309,12 +1219,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.2.0.tgz", + "integrity": "sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.9", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { @@ -1340,6 +1250,11 @@ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", diff --git a/backend/src/lambda/updateMarketValue/package.json b/backend/src/lambda/updatePosition/package.json similarity index 68% rename from backend/src/lambda/updateMarketValue/package.json rename to backend/src/lambda/updatePosition/package.json index 7680b7dd..2ded7dad 100644 --- a/backend/src/lambda/updateMarketValue/package.json +++ b/backend/src/lambda/updatePosition/package.json @@ -1,5 +1,5 @@ { - "name": "update-positions-market-value", + "name": "update-position", "version": "1.0.0", "description": "", "main": "index.js", @@ -10,9 +10,8 @@ "author": "", "license": "ISC", "dependencies": { - "@aws-sdk/client-dynamodb": "^3.624.0", - "@aws-sdk/client-eventbridge": "^3.626.0", - "@aws-sdk/util-dynamodb": "^3.577.0", + "@aws-sdk/client-dynamodb": "^3.716.0", + "@aws-sdk/util-dynamodb": "^3.716.0", "@types/aws-lambda": "^8.10.138", "aws-lambda": "^1.0.7", "yahoo-finance2": "^2.13.3" diff --git a/backend/src/lambda/updateMarketValue/tsconfig.json b/backend/src/lambda/updatePosition/tsconfig.json similarity index 100% rename from backend/src/lambda/updateMarketValue/tsconfig.json rename to backend/src/lambda/updatePosition/tsconfig.json diff --git a/backend/src/lambda/types/Position.ts b/backend/src/lambda/updatePosition/types/PositionReadModel.ts similarity index 53% rename from backend/src/lambda/types/Position.ts rename to backend/src/lambda/updatePosition/types/PositionReadModel.ts index d9e95704..28b2d94a 100644 --- a/backend/src/lambda/types/Position.ts +++ b/backend/src/lambda/updatePosition/types/PositionReadModel.ts @@ -6,28 +6,11 @@ export type PositionReadModel = { accountId: string; entity: string; symbol: string; - shares: number; - acb: number; - bookValue: number; - description: string; exchange: string; currency: string; + shares: number; + acb: number; + bookValue: number; marketValue: number; }; - -export type PositionAppSyncEvent = { - info: { - fieldName: string; - }; - arguments: { - userId: string; //getPositions - aggregateId: string; //getPositions - }; - identity: { - username: string; - claims: { - [key: string]: string[]; - }; - }; -}; diff --git a/backend/src/lambda/updateMarketValue/helpers/dynamoDbCommand.ts b/backend/src/lambda/updatePosition/utils/dynamoDbClient.ts similarity index 100% rename from backend/src/lambda/updateMarketValue/helpers/dynamoDbCommand.ts rename to backend/src/lambda/updatePosition/utils/dynamoDbClient.ts diff --git a/backend/src/lambda/updateMarketValue/yahooFinance.ts b/backend/src/lambda/updatePosition/utils/yahooFinance.ts similarity index 100% rename from backend/src/lambda/updateMarketValue/yahooFinance.ts rename to backend/src/lambda/updatePosition/utils/yahooFinance.ts diff --git a/backend/src/lambda/updatePositions/helpers/dynamoDbCommand.ts b/backend/src/lambda/updatePositions/helpers/dynamoDbCommand.ts deleted file mode 100644 index 60762750..00000000 --- a/backend/src/lambda/updatePositions/helpers/dynamoDbCommand.ts +++ /dev/null @@ -1,21 +0,0 @@ -const { DynamoDBClient } = require('@aws-sdk/client-dynamodb'); - -async function dynamoDbCommand(command: any) { - var result; - - try { - console.debug(`ℹī¸ Initializing DynamoDB client in ${process.env.REGION}`); - var client = new DynamoDBClient({ region: process.env.REGION }); - - console.debug(`ℹī¸ Executing DynamoDB command:\n${JSON.stringify(command)}`); - result = await client.send(command); - - console.log(`🔔 DynamoDB result:\n${JSON.stringify(result)}`); - } catch (error) { - console.error(`🛑 Error with DynamoDB command:\n`, error); - } - - return result; -} - -export default dynamoDbCommand; diff --git a/backend/src/lambda/updatePositions/helpers/eventBridgePublishEvent.ts b/backend/src/lambda/updatePositions/helpers/eventBridgePublishEvent.ts deleted file mode 100644 index cccb1843..00000000 --- a/backend/src/lambda/updatePositions/helpers/eventBridgePublishEvent.ts +++ /dev/null @@ -1,35 +0,0 @@ -const { EventBridgeClient, PutEventsCommand } = require('@aws-sdk/client-eventbridge'); - -async function publishEventAsync(detailType: string, detail: any) { - console.log(`🕧 Publishing ${detailType} event to EventBridge`, detail); - - var params = { - Entries: [ - { - Source: 'custom.pecuniary', - EventBusName: process.env.EVENTBUS_PECUNIARY_NAME, - DetailType: detailType, - Detail: JSON.stringify(detail), - }, - ], - }; - - var result; - try { - console.debug(`🕧 Initializing EventBridge client in ${process.env.REGION}`); - const client = new EventBridgeClient({ region: process.env.REGION }); - - console.debug(`🕧 Sending ${JSON.stringify(params)} event to EventBridge`); - var command = new PutEventsCommand(params); - - result = await client.send(command); - console.log(`🔔 EventBridge result:\n${JSON.stringify(result)}`); - } catch (error) { - console.error(`🛑 Error sending EventBridge event`, error); - return; - } - - console.log(`✅ Sent ${params.Entries.length} event(s) to EventBridge`); -} - -export default publishEventAsync; diff --git a/backend/src/lambda/updatePositions/package.json b/backend/src/lambda/updatePositions/package.json deleted file mode 100644 index be7eb38e..00000000 --- a/backend/src/lambda/updatePositions/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "update-positions", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "build": "tsc", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "@aws-sdk/client-dynamodb": "^3.624.0", - "@aws-sdk/client-eventbridge": "^3.626.0", - "@aws-sdk/util-dynamodb": "^3.577.0", - "@types/aws-lambda": "^8.10.138", - "aws-lambda": "^1.0.7" - }, - "devDependencies": { - "@types/node": "^20.12.12" - } -} diff --git a/backend/src/lambda/updatePositions/tsconfig.json b/backend/src/lambda/updatePositions/tsconfig.json deleted file mode 100644 index 50a052fe..00000000 --- a/backend/src/lambda/updatePositions/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "preserveConstEnums": true, - "noEmit": true, - "sourceMap": false, - "module": "commonjs", - "moduleResolution": "node", - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": false - }, - "exclude": ["node_modules", "**/*.test.ts"] -} diff --git a/backend/test/appsync/Mutation.createCategory.test.ts b/backend/test/appsync/Mutation.createCategory.test.ts index 9f6ea201..8015b81f 100644 --- a/backend/test/appsync/Mutation.createCategory.test.ts +++ b/backend/test/appsync/Mutation.createCategory.test.ts @@ -44,7 +44,7 @@ describe('Mutation.createCategory', () => { const key = unmarshall(result.key); const attributeValues = unmarshall(result.attributeValues); - expect(key.pk).toContain('cat#'); + expect(key.pk).toBe(`cat#${context.arguments.name}`); expect(attributeValues['entity']).toBe('category'); expect(attributeValues['name']).toBe(context.arguments.name); expect(attributeValues['userId']).toBe(context.identity.username); diff --git a/backend/test/appsync/Mutation.createPayee.test.ts b/backend/test/appsync/Mutation.createPayee.test.ts index c02a7c18..5bffb70e 100644 --- a/backend/test/appsync/Mutation.createPayee.test.ts +++ b/backend/test/appsync/Mutation.createPayee.test.ts @@ -44,7 +44,7 @@ describe('Mutation.createPayee', () => { const key = unmarshall(result.key); const attributeValues = unmarshall(result.attributeValues); - expect(key.pk).toContain('pay#'); + expect(key.pk).toBe(`pay#${context.arguments.name}`); expect(attributeValues['entity']).toBe('payee'); expect(attributeValues['name']).toBe(context.arguments.name); expect(attributeValues['userId']).toBe(context.identity.username); diff --git a/backend/test/appsync/Mutation.createSymbol.test.ts b/backend/test/appsync/Mutation.createSymbol.test.ts index 3880dba6..5eb35995 100644 --- a/backend/test/appsync/Mutation.createSymbol.test.ts +++ b/backend/test/appsync/Mutation.createSymbol.test.ts @@ -44,7 +44,7 @@ describe('Mutation.createSymbol', () => { const key = unmarshall(result.key); const attributeValues = unmarshall(result.attributeValues); - expect(key.pk).toContain('symb#'); + expect(key.pk).toBe(`symb#${context.arguments.name}`); expect(attributeValues['entity']).toBe('symbol'); expect(attributeValues['name']).toBe(context.arguments.name); expect(attributeValues['userId']).toBe(context.identity.username); diff --git a/backend/test/cdk/api-stack.test.ts b/backend/test/cdk/api-stack.test.ts index 2719519a..54802774 100644 --- a/backend/test/cdk/api-stack.test.ts +++ b/backend/test/cdk/api-stack.test.ts @@ -25,24 +25,24 @@ describe('Api Stack contains expected resources', () => { const template = Template.fromStack(stack); test('should have SQS Queues and SNS Topics', () => { + template.hasResourceProperties('AWS::SQS::Queue', Match.objectLike({ QueueName: `pecuniary-${props.envName}-updatePosition-DLQ` })); template.hasResourceProperties( - 'AWS::SQS::Queue', - Match.objectLike({ QueueName: `pecuniary-eventHandler-DeadLetterQueue-${props.envName}` }) + 'AWS::SNS::Topic', + Match.objectLike({ TopicName: `pecuniary-${props.envName}-updatePosition-Notification` }) ); - template.hasResourceProperties('AWS::SNS::Topic', Match.objectLike({ TopicName: `pecuniary-eventHandler-Topic-${props.envName}` })); template.hasResourceProperties('AWS::SNS::Subscription', Match.objectLike({ Protocol: 'email' })); template.hasResourceProperties( 'AWS::CloudWatch::Alarm', Match.objectLike({ ComparisonOperator: 'GreaterThanOrEqualToThreshold', - EvaluationPeriods: 2, - AlarmName: `pecuniary-eventHandler-Alarm-${props.envName}`, + EvaluationPeriods: 1, + AlarmName: `pecuniary-${props.envName}-updatePosition-Alarm`, DatapointsToAlarm: 1, - MetricName: 'NumberOfMessagesSent', + MetricName: 'ApproximateNumberOfMessagesVisible', Namespace: 'AWS/SQS', - Period: 300, - Statistic: 'Average', + Period: 60, + Statistic: 'Sum', Threshold: 1, }) ); diff --git a/backend/test/lambda/updatePosition/main.test.ts b/backend/test/lambda/updatePosition/main.test.ts new file mode 100644 index 00000000..5c65f96f --- /dev/null +++ b/backend/test/lambda/updatePosition/main.test.ts @@ -0,0 +1,126 @@ +import { calculateAdjustedCostBase } from '../../../src/lambda/updatePosition/main'; +import { InvestmentTransaction } from '../../../src/appsync/api/codegen/appsync'; + +describe('calculateAdjustedCostBase', () => { + it('should handle empty transactions array', () => { + const transactions: InvestmentTransaction[] = []; + + const { shares, acb, bookValue } = calculateAdjustedCostBase(transactions); + + expect(shares).toBe(0); + expect(bookValue).toBe(0); + expect(acb).toBe(0); + }); + + it('should calculate ACB, shares, and book value correctly for a one transaction', () => { + const transactions: InvestmentTransaction[] = [ + { + pk: '1', + type: 'buy', + shares: 10, + price: 100, + commission: 10, + accountId: '1', + userId: '1', + symbol: 'AAPL', + transactionDate: '2023-01-01', + transactionId: '1', + createdAt: '2023-01-01T00:00:00Z', + updatedAt: '2023-01-01T00:00:00Z', + entity: 'investment-transaction', + }, + ]; + + const { shares, acb, bookValue } = calculateAdjustedCostBase(transactions); + + expect(shares).toBe(10); + expect(bookValue).toBeCloseTo(990, 2); // Book value after transactions + expect(acb).toBeCloseTo(1010, 2); // Adjusted cost base after transactions + }); + + it('should calculate ACB, shares, and book value correctly for a series of transactions', () => { + const transactions: InvestmentTransaction[] = [ + { + pk: '1', + type: 'buy', + shares: 10, + price: 100, + commission: 10, + accountId: '1', + userId: '1', + symbol: 'AAPL', + transactionDate: '2023-01-01', + transactionId: '1', + createdAt: '2023-01-01T00:00:00Z', + updatedAt: '2023-01-01T00:00:00Z', + entity: 'investment-transaction', + }, + { + pk: '2', + type: 'buy', + shares: 5, + price: 110, + commission: 5, + accountId: '1', + userId: '1', + symbol: 'AAPL', + transactionDate: '2023-01-02', + transactionId: '2', + createdAt: '2023-01-02T00:00:00Z', + updatedAt: '2023-01-02T00:00:00Z', + entity: 'investment-transaction', + }, + { + pk: '3', + type: 'sell', + shares: 7, + price: 120, + commission: 8, + accountId: '1', + userId: '1', + symbol: 'AAPL', + transactionDate: '2023-01-03', + transactionId: '3', + createdAt: '2023-01-03T00:00:00Z', + updatedAt: '2023-01-03T00:00:00Z', + entity: 'investment-transaction', + }, + { + pk: '4', + type: 'buy', + shares: 4, + price: 118, + commission: 5, + accountId: '1', + userId: '1', + symbol: 'AAPL', + transactionDate: '2023-01-04', + transactionId: '4', + createdAt: '2023-01-04T00:00:00Z', + updatedAt: '2023-01-04T00:00:00Z', + entity: 'investment-transaction', + }, + { + pk: '5', + type: 'sell', + shares: 4, + price: 123, + commission: 5, + accountId: '1', + userId: '1', + symbol: 'AAPL', + transactionDate: '2023-01-05', + transactionId: '5', + createdAt: '2023-01-05T00:00:00Z', + updatedAt: '2023-01-05T00:00:00Z', + entity: 'investment-transaction', + }, + ]; + + const { shares, acb, bookValue } = calculateAdjustedCostBase(transactions); + + expect(shares).toBe(8); + expect(bookValue).toBeCloseTo(683, 2); // Book value after transactions + expect(acb).toBeCloseTo(874.44, 2); // Adjusted cost base after transactions + }); +}); diff --git a/references/ACB Unit Tests.xlsx b/references/ACB Unit Tests.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cc27b0a44873388a20c104ff7df58d764bddb50f GIT binary patch literal 9663 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 S78ijmO7#$@f^!%7Tk~I`6pbPP delta 10852 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 OWJC#S_;ulbB>xK@WmrD|