From feb371383e5d06ee338dcad4c99ae6b2e2519599 Mon Sep 17 00:00:00 2001 From: Diego Flores Date: Sun, 8 Sep 2024 09:56:43 -0500 Subject: [PATCH 1/7] feat: added payment stack --- .DS_Store | Bin 6148 -> 6148 bytes .gitignore | 26 +- .npmignore | 6 + .prettierignore | 5 + .prettierrc | 7 + bin/io-node-challenge.ts | 20 + cdk.json | 72 + jest.config.js | 25 +- .../payments/application/use-cases/task1.ts | 20 + .../payments/application/use-cases/task2.ts | 12 + .../payments/application/use-cases/task3.ts | 12 + .../payments/infrastructure/apigateway.ts | 52 + lib/contexts/payments/infrastructure/index.ts | 17 + .../payments/infrastructure/lambdas.ts | 40 + .../payments/infrastructure/stepfunction.ts | 60 + lib/io-node-challenge-stack.ts | 13 + package-lock.json | 10180 ++++++++++++++++ package.json | 61 +- src/index.ts | 1 - test/io-node-challenge.test.ts | 16 + tsconfig.json | 38 +- 21 files changed, 10610 insertions(+), 73 deletions(-) create mode 100644 .npmignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 bin/io-node-challenge.ts create mode 100644 cdk.json create mode 100644 lib/contexts/payments/application/use-cases/task1.ts create mode 100644 lib/contexts/payments/application/use-cases/task2.ts create mode 100644 lib/contexts/payments/application/use-cases/task3.ts create mode 100644 lib/contexts/payments/infrastructure/apigateway.ts create mode 100644 lib/contexts/payments/infrastructure/index.ts create mode 100644 lib/contexts/payments/infrastructure/lambdas.ts create mode 100644 lib/contexts/payments/infrastructure/stepfunction.ts create mode 100644 lib/io-node-challenge-stack.ts create mode 100644 package-lock.json delete mode 100644 src/index.ts create mode 100644 test/io-node-challenge.test.ts diff --git a/.DS_Store b/.DS_Store index 35a599151aa9f32c34395189f486a7f00ba924a2..c6a1877c67ac74d872ee8c4bbae697ed6e0fdd12 100644 GIT binary patch delta 70 zcmZoMXfc=|#>CJ*u~2NHo+2aD!~pBb1|lqz`I!tRb2Dpf&Sjp(vblk|jcGGG2R{c; a;pRf-@640=MGP4kCfo2xZ;laJ!3+SY5faq^ delta 309 zcmZoMXfc=|#>B)qu~2NHo+2ar!~p9}j17!HMvrklA43*HDnl_t34g1?m;oh7OY8su diff --git a/.gitignore b/.gitignore index 939a4d3..0b0885d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,10 @@ -.terraform/ -.shelltool/ -makefiles/ -passwd - -.npm/ -.esbuild/ -.serverlessrc -.npmrc -.config/ -.yarn/ -.cache/ +*.js +!jest.config.js +*.d.ts node_modules -**/node_modules -.dccache -.env -coverage/ -.vscode -dist/ \ No newline at end of file +# CDK asset staging directory +.cdk.staging +cdk.out +.env +.DS_Store \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..c1d6d45 --- /dev/null +++ b/.npmignore @@ -0,0 +1,6 @@ +*.ts +!*.d.ts + +# CDK asset staging directory +.cdk.staging +cdk.out diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..fdf0b16 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +.DS_Store +node_modules +/build +.env +.env.* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..2b37dad --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 2, + "semi": true +} diff --git a/bin/io-node-challenge.ts b/bin/io-node-challenge.ts new file mode 100644 index 0000000..5dc56f8 --- /dev/null +++ b/bin/io-node-challenge.ts @@ -0,0 +1,20 @@ +#!/usr/bin/env node +import 'source-map-support/register'; +import * as cdk from 'aws-cdk-lib'; + +import { IoNodeChallengeStack } from '../lib/io-node-challenge-stack'; + +const app = new cdk.App(); +// eslint-disable-next-line no-new +new IoNodeChallengeStack(app, 'IoNodeChallengeStack', { + /* If you don't specify 'env', this stack will be environment-agnostic. + * Account/Region-dependent features and context lookups will not work, + * but a single synthesized template can be deployed anywhere. */ + /* Uncomment the next line to specialize this stack for the AWS Account + * and Region that are implied by the current CLI configuration. */ + // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, + /* Uncomment the next line if you know exactly what Account and Region you + * want to deploy the stack to. */ + // env: { account: '123456789012', region: 'us-east-1' }, + /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ +}); diff --git a/cdk.json b/cdk.json new file mode 100644 index 0000000..74519eb --- /dev/null +++ b/cdk.json @@ -0,0 +1,72 @@ +{ + "app": "npx ts-node --prefer-ts-exts bin/io-node-challenge.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, + "@aws-cdk/aws-eks:nodegroupNameAttribute": true, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false, + "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false + } +} diff --git a/jest.config.js b/jest.config.js index ea12fc0..08263b8 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,23 +1,8 @@ module.exports = { - testEnvironment: "node", - collectCoverage: true, - verbose: true, - passWithNoTests: true, - testMatch: ["**/*.(test|steps).+(ts|tsx|js)"], - setupFiles: ["dotenv/config"], - coveragePathIgnorePatterns: ["/node_modules/", "/test/", "/dist/"], - modulePathIgnorePatterns: ["/dist/"], + testEnvironment: 'node', + roots: ['/test'], + testMatch: ['**/*.test.ts'], transform: { - "^.+\\.tsx?$": [ - "ts-jest", - { - diagnostics: false, - testEnvironment: "node", - collectCoverage: true, - }, - ], - }, - moduleNameMapper: { - "src/(.*)": "/src/$1", - }, + '^.+\\.tsx?$': 'ts-jest' + } }; diff --git a/lib/contexts/payments/application/use-cases/task1.ts b/lib/contexts/payments/application/use-cases/task1.ts new file mode 100644 index 0000000..ae2cbd4 --- /dev/null +++ b/lib/contexts/payments/application/use-cases/task1.ts @@ -0,0 +1,20 @@ +type Params = { + number: number; +}; + +export const handler = async (event: Params) => { + // Simulación de lógica que decide el estado + console.log('Event:', event, typeof event); + console.log('test:', event.number); + + const { number } = event; + + const status = number > 0.5 ? 'SUCCESS' : 'FAILED'; + + return { + statusCode: 200, + body: JSON.stringify({ + status, + }), + }; +}; diff --git a/lib/contexts/payments/application/use-cases/task2.ts b/lib/contexts/payments/application/use-cases/task2.ts new file mode 100644 index 0000000..deed01b --- /dev/null +++ b/lib/contexts/payments/application/use-cases/task2.ts @@ -0,0 +1,12 @@ +import { APIGatewayProxyHandler } from 'aws-lambda'; + +export const handler: APIGatewayProxyHandler = async (event: any) => { + console.log('Event:', event, typeof event); + // Lógica en caso de éxito + return { + statusCode: 200, + body: JSON.stringify({ + message: 'Task2 ejecutada correctamente en caso de SUCCESS', + }), + }; +}; diff --git a/lib/contexts/payments/application/use-cases/task3.ts b/lib/contexts/payments/application/use-cases/task3.ts new file mode 100644 index 0000000..ef76781 --- /dev/null +++ b/lib/contexts/payments/application/use-cases/task3.ts @@ -0,0 +1,12 @@ +import { APIGatewayProxyHandler } from 'aws-lambda'; + +export const handler: APIGatewayProxyHandler = async (event: any) => { + console.log('Event:', event, typeof event); + // Lógica en caso de fallo + return { + statusCode: 200, + body: JSON.stringify({ + message: 'Task3 ejecutada correctamente en caso de FAILED', + }), + }; +}; diff --git a/lib/contexts/payments/infrastructure/apigateway.ts b/lib/contexts/payments/infrastructure/apigateway.ts new file mode 100644 index 0000000..bce8c8c --- /dev/null +++ b/lib/contexts/payments/infrastructure/apigateway.ts @@ -0,0 +1,52 @@ +import * as apiGateway from 'aws-cdk-lib/aws-apigateway'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; +import { Construct } from 'constructs'; + +export class PaymentGateway extends Construct { + constructor(scope: Construct, id: string, usersStateMachine: sfn.StateMachine) { + super(scope, id); + + const api = new apiGateway.RestApi(this, 'PaymentApi', { + restApiName: 'Payment API', + description: 'Backend - Payment API', + }); + + // Permisos para que API Gateway pueda invocar la Step Function + const role = new iam.Role(this, 'ApiGatewayStepFunctionsRole', { + assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'), + }); + + role.addToPolicy( + new iam.PolicyStatement({ + actions: ['states:StartExecution'], + resources: [usersStateMachine.stateMachineArn], + }), + ); + + const stepFunctionIntegration = new apiGateway.AwsIntegration({ + service: 'states', + action: 'StartExecution', + options: { + credentialsRole: role, + integrationResponses: [ + { + statusCode: '200', + }, + ], + requestTemplates: { + 'application/json': `{ + "input": "$util.escapeJavaScript($input.body)", + "stateMachineArn": "${usersStateMachine.stateMachineArn}" + }`, + }, + }, + }); + + // Crear un recurso de API y método para invocar la Step Function + const stepFunctionResource = api.root.addResource('payment'); + stepFunctionResource.addMethod('POST', stepFunctionIntegration, { + methodResponses: [{ statusCode: '200' }], + }); + } +} diff --git a/lib/contexts/payments/infrastructure/index.ts b/lib/contexts/payments/infrastructure/index.ts new file mode 100644 index 0000000..a10039d --- /dev/null +++ b/lib/contexts/payments/infrastructure/index.ts @@ -0,0 +1,17 @@ +import { Construct } from 'constructs'; + +import { PaymentGateway } from './apigateway'; +import { StfExecutePaymentLambda } from './lambdas'; +import { StepFunctionExecutePayment } from './stepfunction'; + +export class PaymentStack extends Construct { + constructor(scope: Construct, id: string) { + super(scope, id); + + // resources + const lambdas = new StfExecutePaymentLambda(this, 'StfExecutePaymentLambda'); + const stepFunc = new StepFunctionExecutePayment(this, 'StepFunctionExecutePayment', lambdas); + // eslint-disable-next-line no-new + new PaymentGateway(this, 'PaymentGateway', stepFunc.usersStateMachine); + } +} diff --git a/lib/contexts/payments/infrastructure/lambdas.ts b/lib/contexts/payments/infrastructure/lambdas.ts new file mode 100644 index 0000000..e9e7cb4 --- /dev/null +++ b/lib/contexts/payments/infrastructure/lambdas.ts @@ -0,0 +1,40 @@ +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; +import { Construct } from 'constructs'; + +export class StfExecutePaymentLambda extends Construct { + task1Function: NodejsFunction; + + task2Function: NodejsFunction; + + task3Function: NodejsFunction; + + constructor(scope: Construct, id: string) { + super(scope, id); + + const task1Function = new NodejsFunction(this, 'Task1NodeJsFunction', { + description: 'Task1', + runtime: lambda.Runtime.NODEJS_20_X, + handler: 'handler', + entry: `lib/contexts/payments/application/use-cases/task1.ts`, + }); + + const task2Function = new NodejsFunction(this, 'Task2NodeJsFunction', { + description: 'Task2', + runtime: lambda.Runtime.NODEJS_20_X, + handler: 'handler', + entry: `lib/contexts/payments/application/use-cases/task2.ts`, + }); + + const task3Function = new NodejsFunction(this, 'Task3NodeJsFunction', { + description: 'Task3', + runtime: lambda.Runtime.NODEJS_20_X, + handler: 'handler', + entry: `lib/contexts/payments/application/use-cases/task3.ts`, + }); + + this.task1Function = task1Function; + this.task2Function = task2Function; + this.task3Function = task3Function; + } +} diff --git a/lib/contexts/payments/infrastructure/stepfunction.ts b/lib/contexts/payments/infrastructure/stepfunction.ts new file mode 100644 index 0000000..c5d2568 --- /dev/null +++ b/lib/contexts/payments/infrastructure/stepfunction.ts @@ -0,0 +1,60 @@ +import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; +import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; +import { Construct } from 'constructs'; + +import { StfExecutePaymentLambda } from './lambdas'; + +export class StepFunctionExecutePayment extends Construct { + stepFunctionExecutePayment: StfExecutePaymentLambda; + + usersStateMachine: sfn.StateMachine; + + constructor(scope: Construct, id: string, stepFunctionExecutePayment: StfExecutePaymentLambda) { + super(scope, id); + + this.stepFunctionExecutePayment = stepFunctionExecutePayment; + + this.stepfunctions(); + } + + stepfunctions() { + const task1 = new tasks.LambdaInvoke(this, 'Task1', { + lambdaFunction: this.stepFunctionExecutePayment.task1Function, + outputPath: '$.Payload', + }); + + const task2 = new tasks.LambdaInvoke(this, 'Task2', { + lambdaFunction: this.stepFunctionExecutePayment.task2Function, + outputPath: '$.Payload', + }); + + const task3 = new tasks.LambdaInvoke(this, 'Task3', { + lambdaFunction: this.stepFunctionExecutePayment.task3Function, + outputPath: '$.Payload', + }); + + const parseBody = new sfn.Pass(this, 'ParseBody', { + parameters: { + 'body.$': 'States.StringToJson($.body)', + }, + }); + + const choiceState = new sfn.Choice(this, 'ChoiceState'); + + choiceState + .when(sfn.Condition.stringEquals('$.body.status', 'SUCCESS'), task2) + .when(sfn.Condition.stringEquals('$.body.status', 'FAILED'), task3) + .otherwise( + new sfn.Fail(this, 'FailState', { + cause: 'Invalid status', + error: 'InvalidStatusError', + }), + ); + + const definition = task1.next(parseBody).next(choiceState); + + this.usersStateMachine = new sfn.StateMachine(this, 'ExePaymentStateMachine', { + definition, + }); + } +} diff --git a/lib/io-node-challenge-stack.ts b/lib/io-node-challenge-stack.ts new file mode 100644 index 0000000..316ebe0 --- /dev/null +++ b/lib/io-node-challenge-stack.ts @@ -0,0 +1,13 @@ +import * as cdk from 'aws-cdk-lib'; +import { Construct } from 'constructs'; + +import { PaymentStack } from './contexts/payments/infrastructure'; + +export class IoNodeChallengeStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + + // eslint-disable-next-line no-new + new PaymentStack(this, 'PaymentStack'); + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f9e4ae6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10180 @@ +{ + "name": "io-node-challenge", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "io-node-challenge", + "version": "0.1.0", + "dependencies": { + "@aws-cdk/aws-lambda-nodejs": "^1.204.0", + "@aws-sdk/client-dynamodb": "^3.645.0", + "@aws-sdk/util-dynamodb": "^3.645.0", + "aws-cdk-lib": "2.155.0", + "aws-sdk": "^2.1690.0", + "axios": "^1.7.7", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "io-node-challenge": "bin/io-node-challenge.js" + }, + "devDependencies": { + "@types/aws-lambda": "8.10.130", + "@types/jest": "^29.5.12", + "@types/node": "20.14.9", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", + "aws-cdk": "2.155.0", + "esbuild": "^0.23.1", + "eslint": "^8.55.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.10.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-prettier": "^5.0.1", + "jest": "^29.7.0", + "prettier": "^3.1.0", + "ts-jest": "^29.1.5", + "ts-node": "^10.9.2", + "typescript": "~5.5.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.202", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.202.tgz", + "integrity": "sha512-JqlF0D4+EVugnG5dAsNZMqhu3HW7ehOXm5SDMxMbXNDMdsF0pxtQKNHRl52z1U9igsHmaFpUgSGjbhAJ+0JONg==" + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", + "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.1.0", + "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/assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/assets/-/assets-1.204.0.tgz", + "integrity": "sha512-rY9YHZ3gUWr+dLwTwSUWYbIfk/AXy4JZRkhLbunrtzjQhH+QMm/2IWIebfBGu+A5AlVRaFbRLonReuGP5WZoUQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/assets/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-applicationautoscaling": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.204.0.tgz", + "integrity": "sha512-sEe2NODKUowJx2guM2SPfs/20gGdBq1C09M32b8c1im7K+PqQkHkE156nyz5Ml0hpsNeCZlRS17oKZ042aZevQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-autoscaling-common": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-autoscaling-common": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-applicationautoscaling/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-autoscaling-common": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.204.0.tgz", + "integrity": "sha512-P+PwbTaj28Eg9+/U9ZTXTh1gA7L9Z45GL+9xcEZvEqAkJt9MNgzZICavVZu1sMD74foK1r1ZOBXTsqV6wEiltQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-autoscaling-common/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-cloudwatch": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.204.0.tgz", + "integrity": "sha512-ADT2D+4FtB9Zcy/TlF2tswQmjmrPVgORYTkznQQ2SniCODHWzz558+G1RV+IVvWRdH7nYQtV0UEuGZKpffWh2w==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-cloudwatch/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-codeguruprofiler": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.204.0.tgz", + "integrity": "sha512-IrgY4SmVf9p5POfHm8BsPzaAO5lQTG7nhb5qN5AzS6zKCTuEjjTNHjx1TOfPV12mMIDAIVsK91mjDlAR88Mjbg==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-codeguruprofiler/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-codestarnotifications": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-codestarnotifications/-/aws-codestarnotifications-1.204.0.tgz", + "integrity": "sha512-t//hSpC5/uVW2321YlbGabNVzhWayvqz+xSnagADGcT9qiq3KQR/uUlrgpHv1/eHRMk7EMrY9prlXeZpfzZ+cw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-codestarnotifications/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-ec2": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ec2/-/aws-ec2-1.204.0.tgz", + "integrity": "sha512-SoqZEgzdfPW0aa+FQ0CjzbDG+X+sDu6/BnLL2O10lxpa+9Dc1iyArAqNKFJG5KXGJe9ibvQXyNQqEjeGRFc22Q==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-ssm": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-ssm": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-ec2/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-ecr": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr/-/aws-ecr-1.204.0.tgz", + "integrity": "sha512-oCts9e+ackWoFHeyn/3oKm3X1lSizleWNNXHp5WGM38lpNVrtCLMKSShu5iXJBhqRH2Mz1AcA4fDMWhe8DvJFA==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.204.0.tgz", + "integrity": "sha512-2GHD3pZdDoPxq3HhD4czANuI7TMoxpjszbzsQAc2wbdMX1j+K4vIL+PBpj3altfscPqcvy1v70lBjbG5rcBIkQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ecr-assets/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-ecr/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-efs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-efs/-/aws-efs-1.204.0.tgz", + "integrity": "sha512-FB6nHgCuzYF5K9ywqYPEPjL2G1ATLIR9dJp1p4ydcEUuXDb4KSEVN4Bgx+q1e7EkWGIq+9glr+ckheEcTvETgw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-efs/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-efs/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-events": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-events/-/aws-events-1.204.0.tgz", + "integrity": "sha512-KnfUmtv+4RhydD9+5CHFxNJxtgn7+Xftwfwg1G7qV/tWYPFHcNIvhlSOgwDrQPa+pTo1MmkiUN0lAR0G8B/cbw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-events/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-iam": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-iam/-/aws-iam-1.204.0.tgz", + "integrity": "sha512-Fh2egW3v/uDdw3m4jvcupS7COL/+sJl2NHjz9l298ddyMxqDwJD2NQwE8mvgPLK4rDtAtDnE0c8RS6d+NWiC+w==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-iam/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-kms": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-kms/-/aws-kms-1.204.0.tgz", + "integrity": "sha512-iryZQ428L1VUVQ0zE96XTWWX7ANVtDrb6x+ZXXLTVUEPgjEd/W6zlcp++Qi0A3a9HLNd4PbEhK9rs0UKNTylzw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-kms/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-kms/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-lambda": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda/-/aws-lambda-1.204.0.tgz", + "integrity": "sha512-r0XXovrLAx8Q8Fz915SwzyQM/KLhEB6YCp3CsWliFGSOHEjRP8yX8UZdEJqe5kYD7Th9JAhUVzKgyv20P7g5Tg==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-applicationautoscaling": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codeguruprofiler": "1.204.0", + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-ecr-assets": "1.204.0", + "@aws-cdk/aws-efs": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-signer": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-applicationautoscaling": "1.204.0", + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codeguruprofiler": "1.204.0", + "@aws-cdk/aws-ec2": "1.204.0", + "@aws-cdk/aws-ecr": "1.204.0", + "@aws-cdk/aws-ecr-assets": "1.204.0", + "@aws-cdk/aws-efs": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-logs": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/aws-signer": "1.204.0", + "@aws-cdk/aws-sns": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-lambda-nodejs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda-nodejs/-/aws-lambda-nodejs-1.204.0.tgz", + "integrity": "sha512-kb9Jsv5QdTGolNCMfYqADVK3PcLhnmTNaxGCEHYcfu3RQekOBkudDWEU+UC7+6AXa+orpg4KZLmMnjDr5Lezqg==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-lambda": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-lambda-nodejs/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-lambda/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-logs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-logs/-/aws-logs-1.204.0.tgz", + "integrity": "sha512-PuHsDSkX6JFBgldxViGw91eFLageJ2cX89/RyLbWaJJUV4tlUKXSmmkVgOaBmvil0QKuGqbOzLXcXCoIK9Sg3A==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3-assets": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-logs/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-s3": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3/-/aws-s3-1.204.0.tgz", + "integrity": "sha512-jsQ4n1L4MdPYDirBoOYgg7yzSk1TaFYo4dnwDlKiLJ5LcHG3Nai1cHb9XQbCy/9KKqbWsbd3WlkH+vcWEl8EUA==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-s3-assets": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.204.0.tgz", + "integrity": "sha512-3MQbVZ95wW29Bl63tqu0Bz0td3osLyGg352l5G7Ztf3nK35FpuQlgxO4kcu74+s2sRwdd/R4KFV6eWhhPk+J7g==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/assets": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-s3": "1.204.0", + "@aws-cdk/core": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-s3-assets/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-s3/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-signer": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-signer/-/aws-signer-1.204.0.tgz", + "integrity": "sha512-AI26FhWF3+f/vDh3mleQa2CXv2/CmSerXgyk4XHMVVTTCjnlYGGmHmGlzYhqOSw6ALpQNdOSw8GVxU/ySpQCaw==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-signer/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-sns": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sns/-/aws-sns-1.204.0.tgz", + "integrity": "sha512-KoWxqKT/dTjt9Pk0a3kJLcd6xZHvrwbZDC0mrLtxdRNhQoHmnURAHW2UqX/lefrCU1GcUFf4L58N9ehBTunAFQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codestarnotifications": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-codestarnotifications": "1.204.0", + "@aws-cdk/aws-events": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/aws-sqs": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-sns/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-sqs": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-sqs/-/aws-sqs-1.204.0.tgz", + "integrity": "sha512-dVzuGMh6d5/X9P9jel1w2Wgdy5MuSE35+eBSFxN+S7oJRoVSARpyKMNYAPMCW+2OJCDw7fIqO1rWbsZBT1Gq8g==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-cloudwatch": "1.204.0", + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-sqs/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/aws-ssm": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-ssm/-/aws-ssm-1.204.0.tgz", + "integrity": "sha512-yYx7HZ8cWNXDAmX/99WkB477QhLoV2rcB8orei8aj7nRkNq5TMjeox0IJaZVgU+edNEDOi1fVX3flh0SAMiUrg==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/aws-iam": "1.204.0", + "@aws-cdk/aws-kms": "1.204.0", + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/core": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/aws-ssm/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "36.0.24", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-36.0.24.tgz", + "integrity": "sha512-dHyb4lvd6nbNHLVvdyxVPgwc0MyzN3VzIJnWwGJWKOIwVqL7hvU2NkQQrktY9T2MtdhzUdDFm9qluxuLRV5Cfw==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.6.3" + }, + "engines": { + "node": ">= 18.18.0" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.6.3", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/core/-/core-1.204.0.tgz", + "integrity": "sha512-yO/flJ9ihpzRhLTEqlbdbuPGtyyghHiiQPkUTLslwUM5vThVTbpgvW4UQHSGqytyst4MYXrN2jQn2RkwIRU57g==", + "bundleDependencies": [ + "fs-extra", + "minimatch", + "@balena/dockerignore", + "ignore" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "@balena/dockerignore": "^1.0.2", + "constructs": "^3.3.69", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "minimatch": "^3.1.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "@aws-cdk/cx-api": "1.204.0", + "@aws-cdk/region-info": "1.204.0", + "constructs": "^3.3.69" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/core/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/core/node_modules/at-least-node": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@aws-cdk/core/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@aws-cdk/core/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@aws-cdk/core/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@aws-cdk/core/node_modules/constructs": { + "version": "3.4.344", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-3.4.344.tgz", + "integrity": "sha512-Qq3upn44oGdvgasHUKWVFsrynyYrtVRd9fd8ko9cJOrFzx9eCm3iI4bhBryQqaISdausbTYUOXmoEe/YSJ16Nw==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/@aws-cdk/core/node_modules/fs-extra": { + "version": "9.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/core/node_modules/graceful-fs": { + "version": "4.2.10", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/core/node_modules/ignore": { + "version": "5.2.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@aws-cdk/core/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@aws-cdk/core/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/core/node_modules/universalify": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-cdk/cx-api": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-1.204.0.tgz", + "integrity": "sha512-Juh/jL1kFPD5JcI9Uu6X0mM2L6hBCN5grdjSS40F8dThbH25VPzFBejaKjiy5nP1UZB83X+HW3utYOEi97DqxA==", + "bundleDependencies": [ + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": "1.204.0" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.204.0.tgz", + "integrity": "sha512-DMNSR4DNKMNNfhOq1UizwZvesOKdhk3R3gRigrvWBHIkHMQg+W6aZFl7WZLKSBkChAXhIsH///psjhDQ20gl1w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "dependencies": { + "jsonschema": "^1.4.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@aws-cdk/region-info": { + "version": "1.204.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/region-info/-/region-info-1.204.0.tgz", + "integrity": "sha512-lPkYJNoN4Gjlf0Fdfgcd1RTm5RD9qtfaFMwVvTn2KGTr7ZqmFskGQ9FqIcd5vd6GmsbAL8OrFOToLr1AHDuOiQ==", + "deprecated": "AWS CDK v1 has reached End-of-Support on 2023-06-01.\nThis package is no longer being updated, and users should migrate to AWS CDK v2.\n\nFor more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html", + "engines": { + "node": ">= 14.15.0" + } + }, + "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.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.645.0.tgz", + "integrity": "sha512-y7UHtIIAWQOzJXNh3KLU91ILz1Ivb2/FuEXnhdJhRurbNI9AwKIVZQlXGq31O8EHO6MU64ptxooNa0WVTezoxg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.645.0", + "@aws-sdk/client-sts": "3.645.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.645.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.645.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.645.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.4.0", + "@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.15", + "@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.2.0", + "@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.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@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-sso": { + "version": "3.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.645.0.tgz", + "integrity": "sha512-2rc8TjnsNddOeKQ/pfNN7deNvGLXAeKeYtHtGDAiM2qfTKxd2sNcAsZ+JCDLyshuD4xLM5fpUyR0X8As9EAouQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.635.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.645.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.645.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.4.0", + "@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.15", + "@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.2.0", + "@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.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@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.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.645.0.tgz", + "integrity": "sha512-X9ULtdk3cO+1ysurEkJ1MSnu6U00qodXx+IVual+1jXX4RYY1WmQmfo7uDKf6FFkz7wW1DAqU+GJIBNQr0YH8A==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.645.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.645.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.645.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.4.0", + "@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.15", + "@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.2.0", + "@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.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@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.645.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.645.0.tgz", + "integrity": "sha512-6azXYtvtnAsPf2ShN9vKynIYVcJOpo6IoVmoMAVgNaBJyllP+s/RORzranYZzckqfmrudSxtct4rVapjLWuAMg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.645.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.645.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.645.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.645.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.4.0", + "@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.15", + "@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.2.0", + "@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.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@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.635.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", + "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", + "dependencies": { + "@smithy/core": "^2.4.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@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.635.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", + "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", + "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.2.0", + "@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.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.645.0.tgz", + "integrity": "sha512-LlZW0qwUwNlTaAIDCNpLbPsyXvS42pRIwF92fgtCQedmdnpN3XRUC6hcwSYI7Xru3GGKp3RnceOvsdOaRJORsw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.635.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.645.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.645.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.645.0.tgz", + "integrity": "sha512-eGFFuNvLeXjCJf5OCIuSEflxUowmK+bCS+lK4M8ofsYOEGAivdx7C0UPxNjHpvM8wKd8vpMl5phTeS9BWX5jMQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.635.0", + "@aws-sdk/credential-provider-ini": "3.645.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.645.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.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.645.0.tgz", + "integrity": "sha512-d6XuChAl5NCsCrUexc6AFb4efPmb9+66iwPylKG+iMTMYgO1ackfy1Q2/f35jdn0jolkPkzKsVyfzsEVoID6ew==", + "dependencies": { + "@aws-sdk/client-sso": "3.645.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-user-agent": { + "version": "3.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.645.0.tgz", + "integrity": "sha512-NpTAtqWK+49lRuxfz7st9for80r4NriCMK0RfdJSoPFVntjsSQiQ7+2nW2XL05uVY633e9DvCAw8YatX3zd1mw==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.645.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/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-dynamodb": { + "version": "3.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.645.0.tgz", + "integrity": "sha512-RiZyA1fx1/Crohr5ljK0ax73vtdJzOfSvdvnDB55wE/aP885srzoqA/dWaXvQm1mPGP6ypW2m8sS7mbzZ9bzSg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.645.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.645.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.645.0.tgz", + "integrity": "sha512-Oe+xaU4ic4PB1k3pb5VTC1/MWES13IlgpaQw01bVHGfwP6Yv6zZOxizRzca2Y3E+AyR+nKD7vXtHRY+w3bi4bg==", + "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/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.0.tgz", + "integrity": "sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "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.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.15.tgz", + "integrity": "sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ==", + "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.2.0", + "@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.2.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.2.0.tgz", + "integrity": "sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw==", + "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.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.15.tgz", + "integrity": "sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg==", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.2.0", + "@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.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.15.tgz", + "integrity": "sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A==", + "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.2.0", + "@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/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.130", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.130.tgz", + "integrity": "sha512-HxTfLeGvD1wTJqIGwcBCpNmHKenja+We1e0cuzeIDFfbEj3ixnlTInyPR/81zAe0Ss/Ip12rFK6XNeMLVucOSg==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "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-cdk": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.155.0.tgz", + "integrity": "sha512-AV7Ym/o7/xyDh6sqcGatWD6Bqa7Swe0OWJq+1srVww0MdBiy5yM3zYAA1+ZeqZNjFQThJPA+pYZQFTgojuaVBA==", + "dev": true, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.155.0.tgz", + "integrity": "sha512-QGzDhLldBXsyOUmhgtZ98PiOUS2g1Mb5MO08FiOvQn3+KSyJjQdq0GoyxtDpCNGLaWmIfcyrtB9aDhod38fl9g==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml", + "mime-types" + ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.202", + "@aws-cdk/asset-kubectl-v20": "^2.1.2", + "@aws-cdk/asset-node-proxy-agent-v6": "^2.0.3", + "@aws-cdk/cloud-assembly-schema": "^36.0.5", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.2.0", + "ignore": "^5.3.1", + "jsonschema": "^1.4.1", + "mime-types": "^2.1.35", + "minimatch": "^3.1.2", + "punycode": "^2.3.1", + "semver": "^7.6.2", + "table": "^6.8.2", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.16.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.3.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/mime-db": { + "version": "1.52.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/mime-types": { + "version": "2.1.35", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.6.2", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.2", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/aws-sdk": { + "version": "2.1691.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1691.0.tgz", + "integrity": "sha512-/F2YC+DlsY3UBM2Bdnh5RLHOPNibS/+IcjUuhP8XuctyrN+MlL+fWDAiela32LTDk7hMy4rx8MTgvbJ+0blO5g==", + "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/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer/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/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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001658", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz", + "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.18", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.18.tgz", + "integrity": "sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "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/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "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/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "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-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "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-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "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/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "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/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "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/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.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/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/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/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 0c3c569..894fd75 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,49 @@ { "name": "io-node-challenge", - "version": "1.0.0", - "author": "io-developers", - "license": "ISC", + "version": "0.1.0", + "bin": { + "io-node-challenge": "bin/io-node-challenge.js" + }, "scripts": { + "build": "tsc", + "watch": "tsc -w", "test": "jest", - "lint": "eslint . --ext .ts,.tsx --fix", - "format": "prettier --write 'src/**/*.ts' --config ./.prettierrc", - "prepare": "husky" + "cdk": "cdk", + "bootstrap": "cdk bootstrap", + "deploy": "cdk deploy", + "destroy": "cdk destroy", + "prettier": "prettier --write '**/{bin,lib,src,tst}/*.ts'", + "lint": "eslint ./ --ext ts --report-unused-disable-directives --max-warnings 0", + "fix": "eslint ./ --ext ts --fix" }, - "dependencies": {}, "devDependencies": { "@types/aws-lambda": "8.10.130", - "@types/jest": "29.5.5", - "@types/node": "20.14.1", - "@typescript-eslint/eslint-plugin": "6.9.1", - "@typescript-eslint/parser": "6.9.1", - "eslint": "8.8.0", - "eslint-config-prettier": "8.3.0", - "eslint-plugin-prettier": "4.0.0", - "husky": "9.1.4", - "jest": "29.7.0", - "jest-mock-extended": "3.0.5", - "prettier": "3.0.3", - "ts-jest": "29.1.2", - "ts-node": "10.9.1", - "typescript": "4.7.4" + "@types/jest": "^29.5.12", + "@types/node": "20.14.9", + "jest": "^29.7.0", + "esbuild": "^0.23.1", + "ts-jest": "^29.1.5", + "aws-cdk": "2.155.0", + "ts-node": "^10.9.2", + "typescript": "~5.5.3", + "eslint": "^8.55.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.10.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-prettier": "^5.0.1", + "prettier": "^3.1.0", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1" + }, + "dependencies": { + "aws-cdk-lib": "2.155.0", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21", + "@aws-cdk/aws-lambda-nodejs": "^1.204.0", + "@aws-sdk/client-dynamodb": "^3.645.0", + "@aws-sdk/util-dynamodb": "^3.645.0", + "aws-sdk": "^2.1690.0", + "axios": "^1.7.7" } } diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index b179ee9..0000000 --- a/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -console.log("Hello world"); diff --git a/test/io-node-challenge.test.ts b/test/io-node-challenge.test.ts new file mode 100644 index 0000000..5e54cce --- /dev/null +++ b/test/io-node-challenge.test.ts @@ -0,0 +1,16 @@ +// import * as cdk from 'aws-cdk-lib'; +// import { Template } from 'aws-cdk-lib/assertions'; +// import * as IoNodeChallenge from '../lib/io-node-challenge-stack'; + +// example test. To run these tests, uncomment this file along with the +// example resource in lib/io-node-challenge-stack.ts +test('SQS Queue Created', () => { + // const app = new cdk.App(); + // // WHEN + // const stack = new IoNodeChallenge.IoNodeChallengeStack(app, 'MyTestStack'); + // // THEN + // const template = Template.fromStack(stack); + // template.hasResourceProperties('AWS::SQS::Queue', { + // VisibilityTimeout: 300 + // }); +}); diff --git a/tsconfig.json b/tsconfig.json index 4f51025..aaa7dc5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,31 @@ { "compilerOptions": { + "target": "ES2020", "module": "commonjs", - "removeComments": true, - "emitDecoratorMetadata": true, + "lib": [ + "es2020", + "dom" + ], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, "experimentalDecorators": true, - "target": "es2016", - "outDir": "./dist", - "rootDir": "./src", - "moduleResolution": "node", - "lib": ["es2016", "ES2019", "DOM"], - "types": ["reflect-metadata", "aws-lambda", "jest", "node"], - "esModuleInterop": true, - "resolveJsonModule": true, - "strictNullChecks": true + "strictPropertyInitialization": false, + "typeRoots": [ + "./node_modules/@types" + ] }, - "include": ["./**/*.ts"], - "exclude": ["node_modules"] + "exclude": [ + "node_modules", + "cdk.out" + ] } From 7c9ce07ad97a3dc79163fcb315fcc027396a1d51 Mon Sep 17 00:00:00 2001 From: Diego Flores Date: Sun, 8 Sep 2024 10:04:45 -0500 Subject: [PATCH 2/7] refactor: changed names of step machines lambdas --- .../{task2.ts => execute-payment.ts} | 2 +- .../use-cases/{task1.ts => get-account.ts} | 4 +-- .../{task3.ts => save-transaction.ts} | 2 +- .../payments/infrastructure/lambdas.ts | 30 +++++++++---------- .../payments/infrastructure/stepfunction.ts | 6 ++-- 5 files changed, 22 insertions(+), 22 deletions(-) rename lib/contexts/payments/application/use-cases/{task2.ts => execute-payment.ts} (86%) rename lib/contexts/payments/application/use-cases/{task1.ts => get-account.ts} (78%) rename lib/contexts/payments/application/use-cases/{task3.ts => save-transaction.ts} (86%) diff --git a/lib/contexts/payments/application/use-cases/task2.ts b/lib/contexts/payments/application/use-cases/execute-payment.ts similarity index 86% rename from lib/contexts/payments/application/use-cases/task2.ts rename to lib/contexts/payments/application/use-cases/execute-payment.ts index deed01b..d1cf2ce 100644 --- a/lib/contexts/payments/application/use-cases/task2.ts +++ b/lib/contexts/payments/application/use-cases/execute-payment.ts @@ -1,7 +1,7 @@ import { APIGatewayProxyHandler } from 'aws-lambda'; export const handler: APIGatewayProxyHandler = async (event: any) => { - console.log('Event:', event, typeof event); + console.info('Event:', event, typeof event); // Lógica en caso de éxito return { statusCode: 200, diff --git a/lib/contexts/payments/application/use-cases/task1.ts b/lib/contexts/payments/application/use-cases/get-account.ts similarity index 78% rename from lib/contexts/payments/application/use-cases/task1.ts rename to lib/contexts/payments/application/use-cases/get-account.ts index ae2cbd4..e7fa464 100644 --- a/lib/contexts/payments/application/use-cases/task1.ts +++ b/lib/contexts/payments/application/use-cases/get-account.ts @@ -4,8 +4,8 @@ type Params = { export const handler = async (event: Params) => { // Simulación de lógica que decide el estado - console.log('Event:', event, typeof event); - console.log('test:', event.number); + console.info('Event:', event, typeof event); + console.info('test:', event.number); const { number } = event; diff --git a/lib/contexts/payments/application/use-cases/task3.ts b/lib/contexts/payments/application/use-cases/save-transaction.ts similarity index 86% rename from lib/contexts/payments/application/use-cases/task3.ts rename to lib/contexts/payments/application/use-cases/save-transaction.ts index ef76781..5be8124 100644 --- a/lib/contexts/payments/application/use-cases/task3.ts +++ b/lib/contexts/payments/application/use-cases/save-transaction.ts @@ -1,7 +1,7 @@ import { APIGatewayProxyHandler } from 'aws-lambda'; export const handler: APIGatewayProxyHandler = async (event: any) => { - console.log('Event:', event, typeof event); + console.info('Event:', event, typeof event); // Lógica en caso de fallo return { statusCode: 200, diff --git a/lib/contexts/payments/infrastructure/lambdas.ts b/lib/contexts/payments/infrastructure/lambdas.ts index e9e7cb4..ee3f4ca 100644 --- a/lib/contexts/payments/infrastructure/lambdas.ts +++ b/lib/contexts/payments/infrastructure/lambdas.ts @@ -3,38 +3,38 @@ import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { Construct } from 'constructs'; export class StfExecutePaymentLambda extends Construct { - task1Function: NodejsFunction; + getAccountFunction: NodejsFunction; - task2Function: NodejsFunction; + executePaymentFunction: NodejsFunction; - task3Function: NodejsFunction; + saveTransactionFunction: NodejsFunction; constructor(scope: Construct, id: string) { super(scope, id); - const task1Function = new NodejsFunction(this, 'Task1NodeJsFunction', { - description: 'Task1', + const getAccountFunction = new NodejsFunction(this, 'GetAccountFunction', { + description: 'Task1 - get-account', runtime: lambda.Runtime.NODEJS_20_X, handler: 'handler', - entry: `lib/contexts/payments/application/use-cases/task1.ts`, + entry: `lib/contexts/payments/application/use-cases/get-account.ts`, }); - const task2Function = new NodejsFunction(this, 'Task2NodeJsFunction', { - description: 'Task2', + const executePaymentFunction = new NodejsFunction(this, 'ExecutePaymentFunction', { + description: 'Task2 - execute-payment', runtime: lambda.Runtime.NODEJS_20_X, handler: 'handler', - entry: `lib/contexts/payments/application/use-cases/task2.ts`, + entry: `lib/contexts/payments/application/use-cases/execute-payment.ts`, }); - const task3Function = new NodejsFunction(this, 'Task3NodeJsFunction', { - description: 'Task3', + const saveTransactionFunction = new NodejsFunction(this, 'SaveTransactionFunction', { + description: 'Task3 - save-transaction', runtime: lambda.Runtime.NODEJS_20_X, handler: 'handler', - entry: `lib/contexts/payments/application/use-cases/task3.ts`, + entry: `lib/contexts/payments/application/use-cases/save-transaction.ts`, }); - this.task1Function = task1Function; - this.task2Function = task2Function; - this.task3Function = task3Function; + this.getAccountFunction = getAccountFunction; + this.executePaymentFunction = executePaymentFunction; + this.saveTransactionFunction = saveTransactionFunction; } } diff --git a/lib/contexts/payments/infrastructure/stepfunction.ts b/lib/contexts/payments/infrastructure/stepfunction.ts index c5d2568..098fc42 100644 --- a/lib/contexts/payments/infrastructure/stepfunction.ts +++ b/lib/contexts/payments/infrastructure/stepfunction.ts @@ -19,17 +19,17 @@ export class StepFunctionExecutePayment extends Construct { stepfunctions() { const task1 = new tasks.LambdaInvoke(this, 'Task1', { - lambdaFunction: this.stepFunctionExecutePayment.task1Function, + lambdaFunction: this.stepFunctionExecutePayment.getAccountFunction, outputPath: '$.Payload', }); const task2 = new tasks.LambdaInvoke(this, 'Task2', { - lambdaFunction: this.stepFunctionExecutePayment.task2Function, + lambdaFunction: this.stepFunctionExecutePayment.executePaymentFunction, outputPath: '$.Payload', }); const task3 = new tasks.LambdaInvoke(this, 'Task3', { - lambdaFunction: this.stepFunctionExecutePayment.task3Function, + lambdaFunction: this.stepFunctionExecutePayment.saveTransactionFunction, outputPath: '$.Payload', }); From 59b03018eb88ad68514beb2f38be5b088990609d Mon Sep 17 00:00:00 2001 From: Diego Flores Date: Sun, 8 Sep 2024 11:51:22 -0500 Subject: [PATCH 3/7] feat: added hostedzone,certificate and api custon domain name --- bin/io-node-challenge.ts | 16 +++------- lib/contexts/core/index.ts | 32 +++++++++++++++++++ .../payments/infrastructure/apigateway.ts | 27 +++++++++++++++- lib/contexts/payments/infrastructure/index.ts | 19 +++++++++-- .../payments/infrastructure/stepfunction.ts | 12 +++++-- lib/io-node-challenge-stack.ts | 14 ++++++-- package-lock.json | 12 +++++++ package.json | 23 ++++++------- 8 files changed, 124 insertions(+), 31 deletions(-) create mode 100644 lib/contexts/core/index.ts diff --git a/bin/io-node-challenge.ts b/bin/io-node-challenge.ts index 5dc56f8..ab3f5c9 100644 --- a/bin/io-node-challenge.ts +++ b/bin/io-node-challenge.ts @@ -1,20 +1,12 @@ #!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; +import { config } from 'dotenv'; import { IoNodeChallengeStack } from '../lib/io-node-challenge-stack'; +config(); + const app = new cdk.App(); // eslint-disable-next-line no-new -new IoNodeChallengeStack(app, 'IoNodeChallengeStack', { - /* If you don't specify 'env', this stack will be environment-agnostic. - * Account/Region-dependent features and context lookups will not work, - * but a single synthesized template can be deployed anywhere. */ - /* Uncomment the next line to specialize this stack for the AWS Account - * and Region that are implied by the current CLI configuration. */ - // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, - /* Uncomment the next line if you know exactly what Account and Region you - * want to deploy the stack to. */ - // env: { account: '123456789012', region: 'us-east-1' }, - /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ -}); +new IoNodeChallengeStack(app, 'IoNodeChallengeStack'); diff --git a/lib/contexts/core/index.ts b/lib/contexts/core/index.ts new file mode 100644 index 0000000..72d8f7f --- /dev/null +++ b/lib/contexts/core/index.ts @@ -0,0 +1,32 @@ +import * as acm from 'aws-cdk-lib/aws-certificatemanager'; +import * as route53 from 'aws-cdk-lib/aws-route53'; +import { Construct } from 'constructs'; + +export class DomainName extends Construct { + hostedZone: route53.HostedZone; + + domainName: string; + + apicertificate: acm.Certificate; + + constructor(scope: Construct, id: string, hostedZoneName: string) { + super(scope, id); + + const domainName = `api.${hostedZoneName}`; + + const hostedZone = new route53.HostedZone(this, 'HostedZone', { + zoneName: hostedZoneName, + }); + + // eslint-disable-next-line no-new + const apiCertificate = new acm.Certificate(this, 'ApiCertificate', { + domainName, + certificateName: `ApiCertificate-${domainName}`, + validation: acm.CertificateValidation.fromDns(hostedZone), + }); + + this.hostedZone = hostedZone; + this.apicertificate = apiCertificate; + this.domainName = domainName; + } +} diff --git a/lib/contexts/payments/infrastructure/apigateway.ts b/lib/contexts/payments/infrastructure/apigateway.ts index bce8c8c..18b0822 100644 --- a/lib/contexts/payments/infrastructure/apigateway.ts +++ b/lib/contexts/payments/infrastructure/apigateway.ts @@ -1,10 +1,20 @@ import * as apiGateway from 'aws-cdk-lib/aws-apigateway'; +import * as acm from 'aws-cdk-lib/aws-certificatemanager'; import * as iam from 'aws-cdk-lib/aws-iam'; +import * as route53 from 'aws-cdk-lib/aws-route53'; +import * as route53Targets from 'aws-cdk-lib/aws-route53-targets'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; import { Construct } from 'constructs'; export class PaymentGateway extends Construct { - constructor(scope: Construct, id: string, usersStateMachine: sfn.StateMachine) { + constructor( + scope: Construct, + id: string, + usersStateMachine: sfn.StateMachine, + hostedZone: route53.HostedZone, + apicertificate: acm.Certificate, + domainName: string, + ) { super(scope, id); const api = new apiGateway.RestApi(this, 'PaymentApi', { @@ -12,6 +22,21 @@ export class PaymentGateway extends Construct { description: 'Backend - Payment API', }); + // Custom Domain + api.addDomainName(domainName, { + domainName, + securityPolicy: apiGateway.SecurityPolicy.TLS_1_2, + certificate: apicertificate, + }); + + // Route53 DNS + // eslint-disable-next-line no-new + new route53.ARecord(this, 'domain_alias_record', { + recordName: domainName, + zone: hostedZone, + target: route53.RecordTarget.fromAlias(new route53Targets.ApiGateway(api)), + }); + // Permisos para que API Gateway pueda invocar la Step Function const role = new iam.Role(this, 'ApiGatewayStepFunctionsRole', { assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'), diff --git a/lib/contexts/payments/infrastructure/index.ts b/lib/contexts/payments/infrastructure/index.ts index a10039d..5ab9a59 100644 --- a/lib/contexts/payments/infrastructure/index.ts +++ b/lib/contexts/payments/infrastructure/index.ts @@ -1,3 +1,5 @@ +import * as acm from 'aws-cdk-lib/aws-certificatemanager'; +import * as route53 from 'aws-cdk-lib/aws-route53'; import { Construct } from 'constructs'; import { PaymentGateway } from './apigateway'; @@ -5,13 +7,26 @@ import { StfExecutePaymentLambda } from './lambdas'; import { StepFunctionExecutePayment } from './stepfunction'; export class PaymentStack extends Construct { - constructor(scope: Construct, id: string) { + constructor( + scope: Construct, + id: string, + hostedZone: route53.HostedZone, + apicertificate: acm.Certificate, + domainName: string, + ) { super(scope, id); // resources const lambdas = new StfExecutePaymentLambda(this, 'StfExecutePaymentLambda'); const stepFunc = new StepFunctionExecutePayment(this, 'StepFunctionExecutePayment', lambdas); // eslint-disable-next-line no-new - new PaymentGateway(this, 'PaymentGateway', stepFunc.usersStateMachine); + new PaymentGateway( + this, + 'PaymentGateway', + stepFunc.usersStateMachine, + hostedZone, + apicertificate, + domainName, + ); } } diff --git a/lib/contexts/payments/infrastructure/stepfunction.ts b/lib/contexts/payments/infrastructure/stepfunction.ts index 098fc42..8c78ee2 100644 --- a/lib/contexts/payments/infrastructure/stepfunction.ts +++ b/lib/contexts/payments/infrastructure/stepfunction.ts @@ -18,17 +18,17 @@ export class StepFunctionExecutePayment extends Construct { } stepfunctions() { - const task1 = new tasks.LambdaInvoke(this, 'Task1', { + const task1 = new tasks.LambdaInvoke(this, 'Task1-get-account', { lambdaFunction: this.stepFunctionExecutePayment.getAccountFunction, outputPath: '$.Payload', }); - const task2 = new tasks.LambdaInvoke(this, 'Task2', { + const task2 = new tasks.LambdaInvoke(this, 'Task2-execute-payment', { lambdaFunction: this.stepFunctionExecutePayment.executePaymentFunction, outputPath: '$.Payload', }); - const task3 = new tasks.LambdaInvoke(this, 'Task3', { + const task3 = new tasks.LambdaInvoke(this, 'Task3-save-transaction', { lambdaFunction: this.stepFunctionExecutePayment.saveTransactionFunction, outputPath: '$.Payload', }); @@ -53,6 +53,12 @@ export class StepFunctionExecutePayment extends Construct { const definition = task1.next(parseBody).next(choiceState); + // const definition = sfn.DefinitionBody.fromChainable( + // new sfn.Map(this, 'For each SOAP generation request', { + // itemsPath: '$.Execution.Input', + // }).itemProcessor(task1.next(parseBody).next(task2).next(task3)), + // ); + this.usersStateMachine = new sfn.StateMachine(this, 'ExePaymentStateMachine', { definition, }); diff --git a/lib/io-node-challenge-stack.ts b/lib/io-node-challenge-stack.ts index 316ebe0..33c7ef9 100644 --- a/lib/io-node-challenge-stack.ts +++ b/lib/io-node-challenge-stack.ts @@ -1,13 +1,23 @@ +/* eslint-disable no-new */ import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; +import { DomainName } from './contexts/core'; import { PaymentStack } from './contexts/payments/infrastructure'; export class IoNodeChallengeStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); - // eslint-disable-next-line no-new - new PaymentStack(this, 'PaymentStack'); + const DOMAIN_NAME = process.env.DOMAIN_NAME || ''; + const domain = new DomainName(this, 'DomainName', DOMAIN_NAME); + + new PaymentStack( + this, + 'PaymentStack', + domain.hostedZone, + domain.apicertificate, + domain.domainName, + ); } } diff --git a/package-lock.json b/package-lock.json index f9e4ae6..7bc407f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "aws-sdk": "^2.1690.0", "axios": "^1.7.7", "constructs": "^10.0.0", + "dotenv": "^16.4.5", "source-map-support": "^0.5.21" }, "bin": { @@ -5779,6 +5780,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", diff --git a/package.json b/package.json index 894fd75..9f8b27f 100644 --- a/package.json +++ b/package.json @@ -20,30 +20,31 @@ "@types/aws-lambda": "8.10.130", "@types/jest": "^29.5.12", "@types/node": "20.14.9", - "jest": "^29.7.0", - "esbuild": "^0.23.1", - "ts-jest": "^29.1.5", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", "aws-cdk": "2.155.0", - "ts-node": "^10.9.2", - "typescript": "~5.5.3", + "esbuild": "^0.23.1", "eslint": "^8.55.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-plugin-import": "^2.29.0", "eslint-plugin-jest": "^27.6.0", "eslint-plugin-prettier": "^5.0.1", + "jest": "^29.7.0", "prettier": "^3.1.0", - "@typescript-eslint/eslint-plugin": "^6.13.1", - "@typescript-eslint/parser": "^6.13.1" + "ts-jest": "^29.1.5", + "ts-node": "^10.9.2", + "typescript": "~5.5.3" }, "dependencies": { - "aws-cdk-lib": "2.155.0", - "constructs": "^10.0.0", - "source-map-support": "^0.5.21", "@aws-cdk/aws-lambda-nodejs": "^1.204.0", "@aws-sdk/client-dynamodb": "^3.645.0", "@aws-sdk/util-dynamodb": "^3.645.0", + "aws-cdk-lib": "2.155.0", "aws-sdk": "^2.1690.0", - "axios": "^1.7.7" + "axios": "^1.7.7", + "constructs": "^10.0.0", + "dotenv": "^16.4.5", + "source-map-support": "^0.5.21" } } From ba5f602e1c2e9ef6441ed2a0438ec0324a0dba58 Mon Sep 17 00:00:00 2001 From: Diego Flores Date: Mon, 9 Sep 2024 00:01:46 -0500 Subject: [PATCH 4/7] feat: add features --- .../application/use-cases/execute-payment.ts | 12 --- .../application/use-cases/get-account.ts | 20 ----- .../application/use-cases/save-transaction.ts | 12 --- lib/contexts/payments/infrastructure/index.ts | 32 ------- .../payments/infrastructure/stepfunction.ts | 66 -------------- lib/intrastructure/Tables.ts | 25 ++++++ lib/io-node-challenge-stack.ts | 33 +++++-- lib/services/accounts/accounts.ts | 23 +++++ lib/services/accounts/get-account/handler.ts | 20 +++++ lib/services/accounts/get-accounts/handler.ts | 25 ++++++ .../infrastructure/AccountFunctions.ts | 39 +++++++++ .../infrastructure/AccountsGateway.ts | 45 ++++++++++ lib/services/common/accounts.ts | 44 ++++++++++ lib/services/common/api.ts | 37 ++++++++ lib/services/common/constants.ts | 10 +++ lib/services/common/dynamodb.ts | 11 +++ lib/services/common/types.ts | 8 ++ .../index.ts => services/core/DomainName.ts} | 25 ++++-- .../payments/execute-payment/handler.ts | 87 +++++++++++++++++++ lib/services/payments/get-account/handler.ts | 37 ++++++++ .../infrastructure/PaymentGateway.ts} | 62 +++++++------ .../payments/infrastructure/PaymentStack.ts | 32 +++++++ .../StepFunctionExecutePayment.ts | 77 ++++++++++++++++ .../StfExecutePaymentLambda.ts} | 30 ++++++- .../infrastructure/dynamostreams-lambda.ts | 35 ++++++++ .../payments/save-transaction/accounts.ts | 44 ++++++++++ .../payments/save-transaction/handler.ts | 29 +++++++ .../payments/update-account/accounts.ts | 30 +++++++ .../payments/update-account/handler.ts | 18 ++++ package-lock.json | 40 ++++++++- package.json | 6 +- 31 files changed, 823 insertions(+), 191 deletions(-) delete mode 100644 lib/contexts/payments/application/use-cases/execute-payment.ts delete mode 100644 lib/contexts/payments/application/use-cases/get-account.ts delete mode 100644 lib/contexts/payments/application/use-cases/save-transaction.ts delete mode 100644 lib/contexts/payments/infrastructure/index.ts delete mode 100644 lib/contexts/payments/infrastructure/stepfunction.ts create mode 100644 lib/intrastructure/Tables.ts create mode 100644 lib/services/accounts/accounts.ts create mode 100644 lib/services/accounts/get-account/handler.ts create mode 100644 lib/services/accounts/get-accounts/handler.ts create mode 100644 lib/services/accounts/infrastructure/AccountFunctions.ts create mode 100644 lib/services/accounts/infrastructure/AccountsGateway.ts create mode 100644 lib/services/common/accounts.ts create mode 100644 lib/services/common/api.ts create mode 100644 lib/services/common/constants.ts create mode 100644 lib/services/common/dynamodb.ts create mode 100644 lib/services/common/types.ts rename lib/{contexts/core/index.ts => services/core/DomainName.ts} (51%) create mode 100644 lib/services/payments/execute-payment/handler.ts create mode 100644 lib/services/payments/get-account/handler.ts rename lib/{contexts/payments/infrastructure/apigateway.ts => services/payments/infrastructure/PaymentGateway.ts} (50%) create mode 100644 lib/services/payments/infrastructure/PaymentStack.ts create mode 100644 lib/services/payments/infrastructure/StepFunctionExecutePayment.ts rename lib/{contexts/payments/infrastructure/lambdas.ts => services/payments/infrastructure/StfExecutePaymentLambda.ts} (56%) create mode 100644 lib/services/payments/infrastructure/dynamostreams-lambda.ts create mode 100644 lib/services/payments/save-transaction/accounts.ts create mode 100644 lib/services/payments/save-transaction/handler.ts create mode 100644 lib/services/payments/update-account/accounts.ts create mode 100644 lib/services/payments/update-account/handler.ts diff --git a/lib/contexts/payments/application/use-cases/execute-payment.ts b/lib/contexts/payments/application/use-cases/execute-payment.ts deleted file mode 100644 index d1cf2ce..0000000 --- a/lib/contexts/payments/application/use-cases/execute-payment.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { APIGatewayProxyHandler } from 'aws-lambda'; - -export const handler: APIGatewayProxyHandler = async (event: any) => { - console.info('Event:', event, typeof event); - // Lógica en caso de éxito - return { - statusCode: 200, - body: JSON.stringify({ - message: 'Task2 ejecutada correctamente en caso de SUCCESS', - }), - }; -}; diff --git a/lib/contexts/payments/application/use-cases/get-account.ts b/lib/contexts/payments/application/use-cases/get-account.ts deleted file mode 100644 index e7fa464..0000000 --- a/lib/contexts/payments/application/use-cases/get-account.ts +++ /dev/null @@ -1,20 +0,0 @@ -type Params = { - number: number; -}; - -export const handler = async (event: Params) => { - // Simulación de lógica que decide el estado - console.info('Event:', event, typeof event); - console.info('test:', event.number); - - const { number } = event; - - const status = number > 0.5 ? 'SUCCESS' : 'FAILED'; - - return { - statusCode: 200, - body: JSON.stringify({ - status, - }), - }; -}; diff --git a/lib/contexts/payments/application/use-cases/save-transaction.ts b/lib/contexts/payments/application/use-cases/save-transaction.ts deleted file mode 100644 index 5be8124..0000000 --- a/lib/contexts/payments/application/use-cases/save-transaction.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { APIGatewayProxyHandler } from 'aws-lambda'; - -export const handler: APIGatewayProxyHandler = async (event: any) => { - console.info('Event:', event, typeof event); - // Lógica en caso de fallo - return { - statusCode: 200, - body: JSON.stringify({ - message: 'Task3 ejecutada correctamente en caso de FAILED', - }), - }; -}; diff --git a/lib/contexts/payments/infrastructure/index.ts b/lib/contexts/payments/infrastructure/index.ts deleted file mode 100644 index 5ab9a59..0000000 --- a/lib/contexts/payments/infrastructure/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import * as acm from 'aws-cdk-lib/aws-certificatemanager'; -import * as route53 from 'aws-cdk-lib/aws-route53'; -import { Construct } from 'constructs'; - -import { PaymentGateway } from './apigateway'; -import { StfExecutePaymentLambda } from './lambdas'; -import { StepFunctionExecutePayment } from './stepfunction'; - -export class PaymentStack extends Construct { - constructor( - scope: Construct, - id: string, - hostedZone: route53.HostedZone, - apicertificate: acm.Certificate, - domainName: string, - ) { - super(scope, id); - - // resources - const lambdas = new StfExecutePaymentLambda(this, 'StfExecutePaymentLambda'); - const stepFunc = new StepFunctionExecutePayment(this, 'StepFunctionExecutePayment', lambdas); - // eslint-disable-next-line no-new - new PaymentGateway( - this, - 'PaymentGateway', - stepFunc.usersStateMachine, - hostedZone, - apicertificate, - domainName, - ); - } -} diff --git a/lib/contexts/payments/infrastructure/stepfunction.ts b/lib/contexts/payments/infrastructure/stepfunction.ts deleted file mode 100644 index 8c78ee2..0000000 --- a/lib/contexts/payments/infrastructure/stepfunction.ts +++ /dev/null @@ -1,66 +0,0 @@ -import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; -import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; -import { Construct } from 'constructs'; - -import { StfExecutePaymentLambda } from './lambdas'; - -export class StepFunctionExecutePayment extends Construct { - stepFunctionExecutePayment: StfExecutePaymentLambda; - - usersStateMachine: sfn.StateMachine; - - constructor(scope: Construct, id: string, stepFunctionExecutePayment: StfExecutePaymentLambda) { - super(scope, id); - - this.stepFunctionExecutePayment = stepFunctionExecutePayment; - - this.stepfunctions(); - } - - stepfunctions() { - const task1 = new tasks.LambdaInvoke(this, 'Task1-get-account', { - lambdaFunction: this.stepFunctionExecutePayment.getAccountFunction, - outputPath: '$.Payload', - }); - - const task2 = new tasks.LambdaInvoke(this, 'Task2-execute-payment', { - lambdaFunction: this.stepFunctionExecutePayment.executePaymentFunction, - outputPath: '$.Payload', - }); - - const task3 = new tasks.LambdaInvoke(this, 'Task3-save-transaction', { - lambdaFunction: this.stepFunctionExecutePayment.saveTransactionFunction, - outputPath: '$.Payload', - }); - - const parseBody = new sfn.Pass(this, 'ParseBody', { - parameters: { - 'body.$': 'States.StringToJson($.body)', - }, - }); - - const choiceState = new sfn.Choice(this, 'ChoiceState'); - - choiceState - .when(sfn.Condition.stringEquals('$.body.status', 'SUCCESS'), task2) - .when(sfn.Condition.stringEquals('$.body.status', 'FAILED'), task3) - .otherwise( - new sfn.Fail(this, 'FailState', { - cause: 'Invalid status', - error: 'InvalidStatusError', - }), - ); - - const definition = task1.next(parseBody).next(choiceState); - - // const definition = sfn.DefinitionBody.fromChainable( - // new sfn.Map(this, 'For each SOAP generation request', { - // itemsPath: '$.Execution.Input', - // }).itemProcessor(task1.next(parseBody).next(task2).next(task3)), - // ); - - this.usersStateMachine = new sfn.StateMachine(this, 'ExePaymentStateMachine', { - definition, - }); - } -} diff --git a/lib/intrastructure/Tables.ts b/lib/intrastructure/Tables.ts new file mode 100644 index 0000000..d90f619 --- /dev/null +++ b/lib/intrastructure/Tables.ts @@ -0,0 +1,25 @@ +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import { Construct } from 'constructs'; + +export class Tables extends Construct { + accountsTable: dynamodb.Table; + + transactionsTable: dynamodb.Table; + + constructor(scope: Construct, id: string) { + super(scope, id); + + const accountsTable = new dynamodb.Table(this, 'accounts', { + partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING }, + }); + + const transactionsTable = new dynamodb.Table(this, 'transactions', { + partitionKey: { name: 'source', type: dynamodb.AttributeType.STRING }, + sortKey: { name: 'id', type: dynamodb.AttributeType.STRING }, + stream: dynamodb.StreamViewType.NEW_IMAGE, + }); + + this.accountsTable = accountsTable; + this.transactionsTable = transactionsTable; + } +} diff --git a/lib/io-node-challenge-stack.ts b/lib/io-node-challenge-stack.ts index 33c7ef9..e85e169 100644 --- a/lib/io-node-challenge-stack.ts +++ b/lib/io-node-challenge-stack.ts @@ -2,8 +2,12 @@ import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; -import { DomainName } from './contexts/core'; -import { PaymentStack } from './contexts/payments/infrastructure'; +import { Tables } from './intrastructure/Tables'; +import { AccountFunctions } from './services/accounts/infrastructure/AccountFunctions'; +import { AccountsGateway } from './services/accounts/infrastructure/AccountsGateway'; +import { DomainName } from './services/core/DomainName'; +import { LambdaDynamodbStream } from './services/payments/infrastructure/dynamostreams-lambda'; +import { PaymentStack } from './services/payments/infrastructure/PaymentStack'; export class IoNodeChallengeStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { @@ -12,12 +16,31 @@ export class IoNodeChallengeStack extends cdk.Stack { const DOMAIN_NAME = process.env.DOMAIN_NAME || ''; const domain = new DomainName(this, 'DomainName', DOMAIN_NAME); + const tables = new Tables(this, 'Tables'); + new PaymentStack( this, 'PaymentStack', - domain.hostedZone, - domain.apicertificate, - domain.domainName, + domain.customDomain, + tables.accountsTable, + tables.transactionsTable, + ); + + new LambdaDynamodbStream( + this, + 'LambdaDynamodbStream', + tables.transactionsTable, + tables.accountsTable, + ); + + const accountFunctions = new AccountFunctions(this, 'AccountFunctions', tables.accountsTable); + + new AccountsGateway( + this, + 'AccountsGateway', + accountFunctions.getAccountFunction, + accountFunctions.getAccountsFunction, + domain.customDomain, ); } } diff --git a/lib/services/accounts/accounts.ts b/lib/services/accounts/accounts.ts new file mode 100644 index 0000000..82fb0e3 --- /dev/null +++ b/lib/services/accounts/accounts.ts @@ -0,0 +1,23 @@ +import { ScanCommand } from '@aws-sdk/client-dynamodb'; + +import { ACCOUNTS_TABLE } from '../common/constants'; +import { getClient } from '../common/dynamodb'; +import { Account } from '../common/types'; + +const client = getClient(); + +export const getAccounts = async (): Promise => { + const params = { + TableName: ACCOUNTS_TABLE, + }; + console.info('getAccounts - pre', params); + + const command = new ScanCommand(params); + const data = await client.send(command); + + const accounts: Account[] = data.Items ? (data.Items as unknown as Account[]) : []; + + console.info(`getAccounts - Success length: ${accounts.length}`); + + return accounts; +}; diff --git a/lib/services/accounts/get-account/handler.ts b/lib/services/accounts/get-account/handler.ts new file mode 100644 index 0000000..5366e36 --- /dev/null +++ b/lib/services/accounts/get-account/handler.ts @@ -0,0 +1,20 @@ +import { getAccountById } from '../../common/accounts'; +import { Account } from '../../common/types'; + +export const handler = async (event: any) => { + console.info('Event:', event, typeof event); + + const accountId = event.pathParameters?.accountId; + + const accountResponse = await getAccountById(accountId); + + const account: Partial = { + amount: accountResponse!.amount, + id: accountResponse!.id, + }; + + return { + statusCode: 200, + body: JSON.stringify(account), + }; +}; diff --git a/lib/services/accounts/get-accounts/handler.ts b/lib/services/accounts/get-accounts/handler.ts new file mode 100644 index 0000000..3c963d0 --- /dev/null +++ b/lib/services/accounts/get-accounts/handler.ts @@ -0,0 +1,25 @@ +import { getAccounts } from '../accounts'; + +export const handler = async (event: any) => { + console.info('Event:', event, typeof event); + + const accounts = await getAccounts(); + + const transformAccount = (account: any) => { + return { + amount: parseFloat(account.amount.N), + // card_id: account.card_id.S, + id: account.id.S, + picture: account.picture.S, + person_name: account.person_name.S, + // security_code: account.security_code.S, + }; + }; + + const transformedAccounts = accounts.map(transformAccount); + + return { + statusCode: 200, + body: JSON.stringify(transformedAccounts), + }; +}; diff --git a/lib/services/accounts/infrastructure/AccountFunctions.ts b/lib/services/accounts/infrastructure/AccountFunctions.ts new file mode 100644 index 0000000..7bb9659 --- /dev/null +++ b/lib/services/accounts/infrastructure/AccountFunctions.ts @@ -0,0 +1,39 @@ +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; +import { Construct } from 'constructs'; + +export class AccountFunctions extends Construct { + getAccountsFunction: NodejsFunction; + + getAccountFunction: NodejsFunction; + + constructor(scope: Construct, id: string, accountsTable: dynamodb.Table) { + super(scope, id); + + const getAccountFunction = new NodejsFunction(this, 'GetAccountFunction', { + description: 'get-account', + runtime: lambda.Runtime.NODEJS_20_X, + handler: 'handler', + entry: `lib/services/accounts/get-account/handler.ts`, + environment: { + ACCOUNTS_TABLE: accountsTable.tableName, + }, + }); + accountsTable.grantReadData(getAccountFunction); + + const getAccountsFunction = new NodejsFunction(this, 'GetAccountsFunction', { + description: 'get-accounts', + runtime: lambda.Runtime.NODEJS_20_X, + handler: 'handler', + entry: `lib/services/accounts/get-accounts/handler.ts`, + environment: { + ACCOUNTS_TABLE: accountsTable.tableName, + }, + }); + accountsTable.grantReadData(getAccountsFunction); + + this.getAccountFunction = getAccountFunction; + this.getAccountsFunction = getAccountsFunction; + } +} diff --git a/lib/services/accounts/infrastructure/AccountsGateway.ts b/lib/services/accounts/infrastructure/AccountsGateway.ts new file mode 100644 index 0000000..64e056b --- /dev/null +++ b/lib/services/accounts/infrastructure/AccountsGateway.ts @@ -0,0 +1,45 @@ +/* eslint-disable no-new */ +import * as apiGateway from 'aws-cdk-lib/aws-apigateway'; +import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; +import { Construct } from 'constructs'; + +export class AccountsGateway extends Construct { + constructor( + scope: Construct, + id: string, + getAccountLambda: NodejsFunction, + getAccountsLambda: NodejsFunction, + customDomain: apiGateway.DomainName, + ) { + super(scope, id); + + const api = new apiGateway.RestApi(this, 'AccountsApi', { + restApiName: 'Accounts API', + description: 'Backend - Accounts API', + }); + + new apiGateway.BasePathMapping(this, 'PaymentApi-mapping', { + domainName: customDomain, + restApi: api, + basePath: 'accounts', // Path base para esta API + }); + + // Crear un recurso de API y método para invocar la Step Function + const accounts = api.root.addResource('accounts'); + const account = accounts.addResource('{accountId}'); + + accounts.addMethod( + 'GET', + new apiGateway.LambdaIntegration(getAccountsLambda, { + requestTemplates: { 'application/json': '{ "statusCode": "200" }' }, + }), + ); + + account.addMethod( + 'GET', + new apiGateway.LambdaIntegration(getAccountLambda, { + requestTemplates: { 'application/json': '{ "statusCode": "200" }' }, + }), + ); + } +} diff --git a/lib/services/common/accounts.ts b/lib/services/common/accounts.ts new file mode 100644 index 0000000..415bd7e --- /dev/null +++ b/lib/services/common/accounts.ts @@ -0,0 +1,44 @@ +import { QueryCommand } from '@aws-sdk/client-dynamodb'; + +import { ACCOUNTS_TABLE } from './constants'; +import { getClient } from './dynamodb'; +import { Account } from './types'; + +const client = getClient(); + +const mapper = (Items: any): Account | null => { + if (!Items || Items.length === 0) { + return null; + } + const item = Items[0]; + + return { + id: item.id.S, + person_name: item.person_name.S, + picture: item.picture.S, + card_id: item.card_id.S, + security_code: item.security_code.S, + amount: parseFloat(item.amount.N), + }; +}; + +export const getAccountById = async (accountId: string): Promise => { + if (!accountId) throw new Error('accountId ID is required'); + + const { Items } = await client.send( + new QueryCommand({ + TableName: ACCOUNTS_TABLE, + ProjectionExpression: `id, person_name, picture, card_id, security_code, amount`, + KeyConditionExpression: 'id = :pk', + ExpressionAttributeValues: { + ':pk': { S: `${accountId}` }, + }, + }), + ); + + console.info('getAccountById.Items', Items ? JSON.stringify(Items) : 'No Items'); + + const response = mapper(Items); + + return response; +}; diff --git a/lib/services/common/api.ts b/lib/services/common/api.ts new file mode 100644 index 0000000..4ae1169 --- /dev/null +++ b/lib/services/common/api.ts @@ -0,0 +1,37 @@ +import axios, { AxiosRequestConfig } from 'axios'; + +import { MP_ACCESS_TOKEN, MP_PUBLIC_KEY } from './constants'; + +const config: AxiosRequestConfig = { + baseURL: `https://api.mercadopago.com`, +}; + +export const get = async (endpoint: string, params?: URLSearchParams) => { + try { + config.params = params; + const result = await axios.get(endpoint, config); + const resultData: any = result.data; + return resultData; + } catch (error: any) { + console.error('get.error:', error); + throw error; + } +}; + +export const post = async (endpoint: string, data: any) => { + try { + config.params = {}; + + if (endpoint === '/v1/card_tokens') { + config.params.public_key = MP_PUBLIC_KEY; + } else if (endpoint === '/v1/payments') { + config.params.access_token = MP_ACCESS_TOKEN; + } + const result = await axios.post(endpoint, data, config); + const resultData: any = result.data; + return resultData; + } catch (error: any) { + console.error('post.error:', error); + throw error; + } +}; diff --git a/lib/services/common/constants.ts b/lib/services/common/constants.ts new file mode 100644 index 0000000..279b549 --- /dev/null +++ b/lib/services/common/constants.ts @@ -0,0 +1,10 @@ +import { config } from 'dotenv'; + +config(); + +export const ACCOUNTS_TABLE = process.env.ACCOUNTS_TABLE || ''; +export const TRANSACTIONS_TABLE = process.env.TRANSACTIONS_TABLE || ''; +export const MP_PUBLIC_KEY = process.env.MP_PUBLIC_KEY || ''; +export const MP_ACCESS_TOKEN = process.env.MP_ACCESS_TOKEN || ''; +export const PAYER_ID = process.env.PAYER_ID || ''; +export const PAYER_EMAIL = process.env.PAYER_EMAIL || ''; diff --git a/lib/services/common/dynamodb.ts b/lib/services/common/dynamodb.ts new file mode 100644 index 0000000..195952d --- /dev/null +++ b/lib/services/common/dynamodb.ts @@ -0,0 +1,11 @@ +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; + +let client: DynamoDBClient; + +// singleton +export const getClient = (): DynamoDBClient => { + if (client) return client; + client = new DynamoDBClient({}); + + return client; +}; diff --git a/lib/services/common/types.ts b/lib/services/common/types.ts new file mode 100644 index 0000000..19af764 --- /dev/null +++ b/lib/services/common/types.ts @@ -0,0 +1,8 @@ +export type Account = { + id: string; + person_name: string; + picture: string; + card_id: string; + security_code: string; + amount: number; +}; diff --git a/lib/contexts/core/index.ts b/lib/services/core/DomainName.ts similarity index 51% rename from lib/contexts/core/index.ts rename to lib/services/core/DomainName.ts index 72d8f7f..0233afe 100644 --- a/lib/contexts/core/index.ts +++ b/lib/services/core/DomainName.ts @@ -1,13 +1,12 @@ +/* eslint-disable no-new */ +import * as apiGateway from 'aws-cdk-lib/aws-apigateway'; import * as acm from 'aws-cdk-lib/aws-certificatemanager'; import * as route53 from 'aws-cdk-lib/aws-route53'; +import * as route53Targets from 'aws-cdk-lib/aws-route53-targets'; import { Construct } from 'constructs'; export class DomainName extends Construct { - hostedZone: route53.HostedZone; - - domainName: string; - - apicertificate: acm.Certificate; + customDomain: apiGateway.DomainName; constructor(scope: Construct, id: string, hostedZoneName: string) { super(scope, id); @@ -25,8 +24,18 @@ export class DomainName extends Construct { validation: acm.CertificateValidation.fromDns(hostedZone), }); - this.hostedZone = hostedZone; - this.apicertificate = apiCertificate; - this.domainName = domainName; + const customDomain = new apiGateway.DomainName(this, 'CustomDomain', { + domainName, + certificate: apiCertificate, // Certificado de ACM válido para el dominio + endpointType: apiGateway.EndpointType.REGIONAL, + }); + + new route53.ARecord(this, 'ApiDomainAliasRecord', { + zone: hostedZone, + recordName: 'api', + target: route53.RecordTarget.fromAlias(new route53Targets.ApiGatewayDomain(customDomain)), + }); + + this.customDomain = customDomain; } } diff --git a/lib/services/payments/execute-payment/handler.ts b/lib/services/payments/execute-payment/handler.ts new file mode 100644 index 0000000..e5250f9 --- /dev/null +++ b/lib/services/payments/execute-payment/handler.ts @@ -0,0 +1,87 @@ +/* eslint-disable camelcase */ +import { post } from '../../common/api'; +import { PAYER_EMAIL, PAYER_ID } from '../../common/constants'; +import { Account } from '../../common/types'; + +// { +// "task1output": { +// "exists": "N", +// "amount_new": 140, +// "account": null +// } +// } + +type NewPaymentDto = { + task1output: { + exists: 'Y'; + amount_new?: number; + account: Account | null; + }; +}; + +type PaymentResponse = { + id: number; + status: + | 'pending' + | 'approved' + | 'authorized' + | 'in_process' + | 'in_mediation' + | 'rejected' + | 'cancelled' + | 'refunded' + | 'charged_back'; +}; + +export const handler = async (event: NewPaymentDto) => { + console.info('Event:', event, typeof event); + // Lógica en caso de éxito + + const { card_id, security_code, person_name, id: accountId } = event.task1output.account!; + const { amount_new } = event.task1output; + + const first_name = person_name.split(' ')[0]; + const last_name = person_name.split(' ')[1]; + + const cardTokenParams = { + card_id, + security_code, + }; + + const cardToken = await post('/v1/card_tokens', cardTokenParams); + console.info('cardToken:', cardToken); + const token = cardToken.id; + + const data = { + transaction_amount: amount_new, + token, + description: 'Deposito en cuenta', + installments: 1, + payment_method_id: 'visa', + payer: { + type: 'customer', + id: PAYER_ID, + email: PAYER_EMAIL, + first_name, + last_name, + }, + // external_reference: 'Reference_1238', + }; + const pago: PaymentResponse = await post('/v1/payments', data); + console.info('pago:', pago); + + const response = { + payment_isok: pago.status === 'approved' ? 'Y' : 'N', + payment_id: pago.id, + payment_status: pago.status, + accountId, + amount: amount_new, + }; + + return { + statusCode: 200, + body: JSON.stringify({ + ...response, + }), + }; +}; diff --git a/lib/services/payments/get-account/handler.ts b/lib/services/payments/get-account/handler.ts new file mode 100644 index 0000000..df7cbaf --- /dev/null +++ b/lib/services/payments/get-account/handler.ts @@ -0,0 +1,37 @@ +import { getAccountById } from '../../common/accounts'; +import { Account } from '../../common/types'; + +type GetAccountRequest = { + accountId: string; + amount: number; +}; + +type GetAccountResponse = { + exists: string; + amount_new?: number; + account: Account | null; +}; + +export const handler = async (event: GetAccountRequest) => { + console.info('Event:', event, typeof event); + console.info('test:', event.accountId, event.amount); + + const { accountId, amount } = event; + + // TODO validations + + const account = await getAccountById(accountId); + + const response: GetAccountResponse = { + exists: account ? 'Y' : 'N', + amount_new: amount, + account, + }; + + return { + statusCode: 200, + body: JSON.stringify({ + ...response, + }), + }; +}; diff --git a/lib/contexts/payments/infrastructure/apigateway.ts b/lib/services/payments/infrastructure/PaymentGateway.ts similarity index 50% rename from lib/contexts/payments/infrastructure/apigateway.ts rename to lib/services/payments/infrastructure/PaymentGateway.ts index 18b0822..2ee88ec 100644 --- a/lib/contexts/payments/infrastructure/apigateway.ts +++ b/lib/services/payments/infrastructure/PaymentGateway.ts @@ -1,8 +1,6 @@ +/* eslint-disable no-new */ import * as apiGateway from 'aws-cdk-lib/aws-apigateway'; -import * as acm from 'aws-cdk-lib/aws-certificatemanager'; import * as iam from 'aws-cdk-lib/aws-iam'; -import * as route53 from 'aws-cdk-lib/aws-route53'; -import * as route53Targets from 'aws-cdk-lib/aws-route53-targets'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; import { Construct } from 'constructs'; @@ -11,9 +9,7 @@ export class PaymentGateway extends Construct { scope: Construct, id: string, usersStateMachine: sfn.StateMachine, - hostedZone: route53.HostedZone, - apicertificate: acm.Certificate, - domainName: string, + customDomain: apiGateway.DomainName, ) { super(scope, id); @@ -22,19 +18,10 @@ export class PaymentGateway extends Construct { description: 'Backend - Payment API', }); - // Custom Domain - api.addDomainName(domainName, { - domainName, - securityPolicy: apiGateway.SecurityPolicy.TLS_1_2, - certificate: apicertificate, - }); - - // Route53 DNS - // eslint-disable-next-line no-new - new route53.ARecord(this, 'domain_alias_record', { - recordName: domainName, - zone: hostedZone, - target: route53.RecordTarget.fromAlias(new route53Targets.ApiGateway(api)), + new apiGateway.BasePathMapping(this, 'PaymentApi-mapping', { + domainName: customDomain, + restApi: api, + basePath: 'payments', // Path base para esta API }); // Permisos para que API Gateway pueda invocar la Step Function @@ -42,21 +29,43 @@ export class PaymentGateway extends Construct { assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'), }); - role.addToPolicy( - new iam.PolicyStatement({ - actions: ['states:StartExecution'], - resources: [usersStateMachine.stateMachineArn], - }), - ); + usersStateMachine.grantStartSyncExecution(role); + usersStateMachine.grantRead(role); const stepFunctionIntegration = new apiGateway.AwsIntegration({ service: 'states', - action: 'StartExecution', + action: 'StartSyncExecution', + integrationHttpMethod: 'POST', options: { credentialsRole: role, integrationResponses: [ { statusCode: '200', + responseTemplates: { + 'application/json': ` + #set($context.responseOverride.header.Content-Type = "application/json") + + #set($inputRoot = $input.path('$')) + #if($inputRoot.status == "SUCCEEDED") + #set($message = $output.message) + #set($transactionId = $output.transactionId) + #if($inputRoot.output && $inputRoot.output != "{}") + $inputRoot.output + #else + {"message": "Step Function completed successfully"} + #end + #elseif($inputRoot.status == "FAILED") + { + "error": "Step Function execution failed", + "cause": "$util.escapeJavaScript($inputRoot.cause)" + } + #else + { + "error": "Unexpected response", + "response": $input.json('$') + } + #end`, + }, }, ], requestTemplates: { @@ -70,6 +79,7 @@ export class PaymentGateway extends Construct { // Crear un recurso de API y método para invocar la Step Function const stepFunctionResource = api.root.addResource('payment'); + stepFunctionResource.addMethod('POST', stepFunctionIntegration, { methodResponses: [{ statusCode: '200' }], }); diff --git a/lib/services/payments/infrastructure/PaymentStack.ts b/lib/services/payments/infrastructure/PaymentStack.ts new file mode 100644 index 0000000..57d6736 --- /dev/null +++ b/lib/services/payments/infrastructure/PaymentStack.ts @@ -0,0 +1,32 @@ +/* eslint-disable no-new */ +import * as apiGateway from 'aws-cdk-lib/aws-apigateway'; +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import { Construct } from 'constructs'; + +import { PaymentGateway } from './PaymentGateway'; +import { StepFunctionExecutePayment } from './StepFunctionExecutePayment'; +import { StfExecutePaymentLambda } from './StfExecutePaymentLambda'; + +export class PaymentStack extends Construct { + constructor( + scope: Construct, + id: string, + customDomain: apiGateway.DomainName, + accountsTable: dynamodb.Table, + transactionsTable: dynamodb.Table, + ) { + super(scope, id); + + // resources + const lambdas = new StfExecutePaymentLambda( + this, + 'StfExecutePaymentLambda', + accountsTable, + transactionsTable, + ); + + const stepFunc = new StepFunctionExecutePayment(this, 'StepFunctionExecutePayment', lambdas); + + new PaymentGateway(this, 'PaymentGateway', stepFunc.usersStateMachine, customDomain); + } +} diff --git a/lib/services/payments/infrastructure/StepFunctionExecutePayment.ts b/lib/services/payments/infrastructure/StepFunctionExecutePayment.ts new file mode 100644 index 0000000..bc1c236 --- /dev/null +++ b/lib/services/payments/infrastructure/StepFunctionExecutePayment.ts @@ -0,0 +1,77 @@ +import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; +import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; +import { Construct } from 'constructs'; + +import { StfExecutePaymentLambda } from './StfExecutePaymentLambda'; + +export class StepFunctionExecutePayment extends Construct { + stepFunctionExecutePayment: StfExecutePaymentLambda; + + usersStateMachine: sfn.StateMachine; + + constructor(scope: Construct, id: string, stepFunctionExecutePayment: StfExecutePaymentLambda) { + super(scope, id); + + this.stepFunctionExecutePayment = stepFunctionExecutePayment; + + this.stepfunctions(); + } + + stepfunctions() { + const getAccountTask = new tasks.LambdaInvoke(this, 'Task1-get-account', { + lambdaFunction: this.stepFunctionExecutePayment.getAccountFunction, + outputPath: '$', + resultSelector: { + 'task1output.$': 'States.StringToJson($.Payload.body)', + }, + }); + + const executePaymentTask = new tasks.LambdaInvoke(this, 'Task2-execute-payment', { + lambdaFunction: this.stepFunctionExecutePayment.executePaymentFunction, + outputPath: '$', + resultSelector: { + 'task2output.$': 'States.StringToJson($.Payload.body)', + }, + }); + + const saveTransactionTask = new tasks.LambdaInvoke(this, 'Task3-save-transaction', { + lambdaFunction: this.stepFunctionExecutePayment.saveTransactionFunction, + outputPath: '$', + resultSelector: { + 'task3output.$': 'States.StringToJson($.Payload.body)', + }, + }); + + const failState = new sfn.Fail(this, 'Fail', { + error: 'TaskFailed', + cause: 'The task failed due to an invalid result', + }); + + const successState = new sfn.Succeed(this, 'Success', { + outputPath: '$', + }); + + const isAccountValid = sfn.Condition.stringEquals('$.task1output.exists', 'Y'); + const isPaymentSuccess = sfn.Condition.stringEquals('$.task2output.payment_isok', 'Y'); + const isTransactionSuccess = sfn.Condition.stringEquals('$.task3output.transac_ok', 'Y'); + + const saveTransactionSuccess = new sfn.Choice(this, 'Transaction Success?') + .when(isTransactionSuccess, successState) + .otherwise(failState); + + const paymentSuccess = new sfn.Choice(this, 'Payment Success?') + .when(isPaymentSuccess, saveTransactionTask.next(saveTransactionSuccess)) + .otherwise(failState); + + const accountValid = new sfn.Choice(this, 'Account Valid?') + .when(isAccountValid, executePaymentTask.next(paymentSuccess)) + .otherwise(failState); + + const definition = getAccountTask.next(accountValid); + + this.usersStateMachine = new sfn.StateMachine(this, 'ExePaymentStateMachine', { + definition, + stateMachineType: sfn.StateMachineType.EXPRESS, + }); + } +} diff --git a/lib/contexts/payments/infrastructure/lambdas.ts b/lib/services/payments/infrastructure/StfExecutePaymentLambda.ts similarity index 56% rename from lib/contexts/payments/infrastructure/lambdas.ts rename to lib/services/payments/infrastructure/StfExecutePaymentLambda.ts index ee3f4ca..d645436 100644 --- a/lib/contexts/payments/infrastructure/lambdas.ts +++ b/lib/services/payments/infrastructure/StfExecutePaymentLambda.ts @@ -1,7 +1,10 @@ +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { Construct } from 'constructs'; +import { MP_ACCESS_TOKEN, MP_PUBLIC_KEY, PAYER_EMAIL, PAYER_ID } from '../../common/constants'; + export class StfExecutePaymentLambda extends Construct { getAccountFunction: NodejsFunction; @@ -9,29 +12,48 @@ export class StfExecutePaymentLambda extends Construct { saveTransactionFunction: NodejsFunction; - constructor(scope: Construct, id: string) { + constructor( + scope: Construct, + id: string, + accountsTable: dynamodb.Table, + transactionsTable: dynamodb.Table, + ) { super(scope, id); const getAccountFunction = new NodejsFunction(this, 'GetAccountFunction', { description: 'Task1 - get-account', runtime: lambda.Runtime.NODEJS_20_X, handler: 'handler', - entry: `lib/contexts/payments/application/use-cases/get-account.ts`, + entry: `lib/services/payments/get-account/handler.ts`, + environment: { + ACCOUNTS_TABLE: accountsTable.tableName, + }, }); + accountsTable.grantReadData(getAccountFunction); const executePaymentFunction = new NodejsFunction(this, 'ExecutePaymentFunction', { description: 'Task2 - execute-payment', runtime: lambda.Runtime.NODEJS_20_X, handler: 'handler', - entry: `lib/contexts/payments/application/use-cases/execute-payment.ts`, + entry: `lib/services/payments/execute-payment/handler.ts`, + environment: { + MP_PUBLIC_KEY, + MP_ACCESS_TOKEN, + PAYER_ID, + PAYER_EMAIL, + }, }); const saveTransactionFunction = new NodejsFunction(this, 'SaveTransactionFunction', { description: 'Task3 - save-transaction', runtime: lambda.Runtime.NODEJS_20_X, handler: 'handler', - entry: `lib/contexts/payments/application/use-cases/save-transaction.ts`, + entry: `lib/services/payments/save-transaction/handler.ts`, + environment: { + TRANSACTIONS_TABLE: transactionsTable.tableName, + }, }); + transactionsTable.grantReadWriteData(saveTransactionFunction); this.getAccountFunction = getAccountFunction; this.executePaymentFunction = executePaymentFunction; diff --git a/lib/services/payments/infrastructure/dynamostreams-lambda.ts b/lib/services/payments/infrastructure/dynamostreams-lambda.ts new file mode 100644 index 0000000..ed12393 --- /dev/null +++ b/lib/services/payments/infrastructure/dynamostreams-lambda.ts @@ -0,0 +1,35 @@ +import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as eventSources from 'aws-cdk-lib/aws-lambda-event-sources'; +import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; +import { Construct } from 'constructs'; + +export class LambdaDynamodbStream extends Construct { + constructor( + scope: Construct, + id: string, + transactionsTable: dynamodb.Table, + accountsTable: dynamodb.Table, + ) { + super(scope, id); + + const streamDynamoFunction = new NodejsFunction(this, 'StreamDynamoNodeJsFunction', { + runtime: lambda.Runtime.NODEJS_20_X, + description: 'Stream DynamoDB Function on transaction update', + handler: 'handler', + entry: `lib/services/payments/update-account/handler.ts`, + environment: { + ACCOUNTS_TABLE: accountsTable.tableName, + }, + }); + + accountsTable.grantReadWriteData(streamDynamoFunction); + + // Add a DynamoDB stream event source to the Lambda function + streamDynamoFunction.addEventSource( + new eventSources.DynamoEventSource(transactionsTable, { + startingPosition: lambda.StartingPosition.TRIM_HORIZON, // Adjust based on your needs + }), + ); + } +} diff --git a/lib/services/payments/save-transaction/accounts.ts b/lib/services/payments/save-transaction/accounts.ts new file mode 100644 index 0000000..651c226 --- /dev/null +++ b/lib/services/payments/save-transaction/accounts.ts @@ -0,0 +1,44 @@ +import { PutItemCommand } from '@aws-sdk/client-dynamodb'; +import { marshall } from '@aws-sdk/util-dynamodb'; +import { v4 } from 'uuid'; + +import { TRANSACTIONS_TABLE } from '../../common/constants'; +import { getClient } from '../../common/dynamodb'; +import { Account } from '../../common/types'; + +const client = getClient(); + +type Transaction = { + source: string; + id: Account['id']; + data: { + accountId: Account['id']; + amount: number; + }; +}; + +export const saveTransaction = async (accountId: string, amount: number): Promise => { + if (!accountId) throw new Error('accountId ID is required'); + + const newTransaction: Transaction = { + source: v4(), + id: accountId, + data: { + accountId, + amount, + }, + }; + + console.info('saveTransaction - Saving transaction', newTransaction); + + const params = { + TableName: TRANSACTIONS_TABLE, + Item: marshall(newTransaction), + }; + + await client.send(new PutItemCommand(params)); + + console.info('saveTransaction - Success'); + + return newTransaction.source; +}; diff --git a/lib/services/payments/save-transaction/handler.ts b/lib/services/payments/save-transaction/handler.ts new file mode 100644 index 0000000..72c6de0 --- /dev/null +++ b/lib/services/payments/save-transaction/handler.ts @@ -0,0 +1,29 @@ +import { saveTransaction } from './accounts'; + +type TransactionRequest = { + task2output: { + payment_isok: 'Y'; + payment_id: number; + payment_status: 'approved'; + accountId: string; + amount: number; + }; +}; + +export const handler = async (event: TransactionRequest) => { + console.info('Event:', event, typeof event); + // Lógica en caso de fallo + + const { accountId, amount } = event.task2output; + + const transactionId = await saveTransaction(accountId, amount); + + return { + statusCode: 200, + body: JSON.stringify({ + transac_ok: transactionId ? 'Y' : 'N', + transactionId, + message: `Payment registered successfully`, + }), + }; +}; diff --git a/lib/services/payments/update-account/accounts.ts b/lib/services/payments/update-account/accounts.ts new file mode 100644 index 0000000..4641203 --- /dev/null +++ b/lib/services/payments/update-account/accounts.ts @@ -0,0 +1,30 @@ +import { UpdateItemCommand } from '@aws-sdk/client-dynamodb'; +import { marshall } from '@aws-sdk/util-dynamodb'; + +import { ACCOUNTS_TABLE } from '../../common/constants'; +import { getClient } from '../../common/dynamodb'; + +const client = getClient(); + +export const updateAccount = async (accountId: string, amount: number): Promise => { + if (!accountId) throw new Error('accountId ID is required'); + + const params = { + TableName: ACCOUNTS_TABLE, + Key: marshall({ id: accountId }), + UpdateExpression: 'SET amount = if_not_exists(amount, :start) + :amount', + ExpressionAttributeValues: { + ':amount': { N: amount.toString() }, + ':start': { N: '0' }, + }, + ConditionExpression: 'attribute_exists(id)', + }; + console.info('updateAccount - pre', params); + + const command = new UpdateItemCommand(params); + await client.send(command); + + console.info('updateAccount - Success'); + + return true; +}; diff --git a/lib/services/payments/update-account/handler.ts b/lib/services/payments/update-account/handler.ts new file mode 100644 index 0000000..786ae88 --- /dev/null +++ b/lib/services/payments/update-account/handler.ts @@ -0,0 +1,18 @@ +import { updateAccount } from './accounts'; + +export const handler = async (event: any) => { + console.info('Event:', JSON.stringify(event, null, 2)); + + const newData = event.Records[0].dynamodb.NewImage.data.M; + const accountId = newData.accountId.S; + const amount = newData.amount.N; + + const rpta = await updateAccount(accountId, amount); + + return { + statusCode: 200, + body: JSON.stringify({ + transac_ok: rpta === true ? 'Y' : 'N', + }), + }; +}; diff --git a/package-lock.json b/package-lock.json index 7bc407f..19c5640 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,8 @@ "axios": "^1.7.7", "constructs": "^10.0.0", "dotenv": "^16.4.5", - "source-map-support": "^0.5.21" + "source-map-support": "^0.5.21", + "uuid": "^10.0.0" }, "bin": { "io-node-challenge": "bin/io-node-challenge.js" @@ -25,6 +26,7 @@ "@types/aws-lambda": "8.10.130", "@types/jest": "^29.5.12", "@types/node": "20.14.9", + "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^6.13.1", "@typescript-eslint/parser": "^6.13.1", "aws-cdk": "2.155.0", @@ -1501,6 +1503,18 @@ "node": ">=16.0.0" } }, + "node_modules/@aws-sdk/client-dynamodb/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/@aws-sdk/client-sso": { "version": "3.645.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.645.0.tgz", @@ -3679,6 +3693,18 @@ "node": ">=16.0.0" } }, + "node_modules/@smithy/middleware-retry/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/@smithy/middleware-serde": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", @@ -4196,6 +4222,12 @@ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -9971,9 +10003,9 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" diff --git a/package.json b/package.json index 9f8b27f..589e83f 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "prettier": "^3.1.0", "ts-jest": "^29.1.5", "ts-node": "^10.9.2", - "typescript": "~5.5.3" + "typescript": "~5.5.3", + "@types/uuid": "^10.0.0" }, "dependencies": { "@aws-cdk/aws-lambda-nodejs": "^1.204.0", @@ -45,6 +46,7 @@ "axios": "^1.7.7", "constructs": "^10.0.0", "dotenv": "^16.4.5", - "source-map-support": "^0.5.21" + "source-map-support": "^0.5.21", + "uuid": "^10.0.0" } } From a7bd7e0c85d07802abb6900e67300be523b94b19 Mon Sep 17 00:00:00 2001 From: Diego Flores Date: Mon, 9 Sep 2024 14:26:04 -0500 Subject: [PATCH 5/7] feat: merge apis in one, improve tlv response template --- lib/io-node-challenge-stack.ts | 4 +- .../infrastructure/AccountsGateway.ts | 17 ++------ lib/services/core/DomainName.ts | 19 +++++++-- .../payments/infrastructure/PaymentGateway.ts | 39 +++++++------------ .../payments/infrastructure/PaymentStack.ts | 4 +- .../StepFunctionExecutePayment.ts | 12 +++++- 6 files changed, 49 insertions(+), 46 deletions(-) diff --git a/lib/io-node-challenge-stack.ts b/lib/io-node-challenge-stack.ts index e85e169..abc2ff7 100644 --- a/lib/io-node-challenge-stack.ts +++ b/lib/io-node-challenge-stack.ts @@ -21,7 +21,7 @@ export class IoNodeChallengeStack extends cdk.Stack { new PaymentStack( this, 'PaymentStack', - domain.customDomain, + domain.version, tables.accountsTable, tables.transactionsTable, ); @@ -40,7 +40,7 @@ export class IoNodeChallengeStack extends cdk.Stack { 'AccountsGateway', accountFunctions.getAccountFunction, accountFunctions.getAccountsFunction, - domain.customDomain, + domain.version, ); } } diff --git a/lib/services/accounts/infrastructure/AccountsGateway.ts b/lib/services/accounts/infrastructure/AccountsGateway.ts index 64e056b..965dac2 100644 --- a/lib/services/accounts/infrastructure/AccountsGateway.ts +++ b/lib/services/accounts/infrastructure/AccountsGateway.ts @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ /* eslint-disable no-new */ import * as apiGateway from 'aws-cdk-lib/aws-apigateway'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; @@ -9,23 +10,11 @@ export class AccountsGateway extends Construct { id: string, getAccountLambda: NodejsFunction, getAccountsLambda: NodejsFunction, - customDomain: apiGateway.DomainName, + version: apiGateway.IResource, ) { super(scope, id); - const api = new apiGateway.RestApi(this, 'AccountsApi', { - restApiName: 'Accounts API', - description: 'Backend - Accounts API', - }); - - new apiGateway.BasePathMapping(this, 'PaymentApi-mapping', { - domainName: customDomain, - restApi: api, - basePath: 'accounts', // Path base para esta API - }); - - // Crear un recurso de API y método para invocar la Step Function - const accounts = api.root.addResource('accounts'); + const accounts = version.addResource('accounts'); const account = accounts.addResource('{accountId}'); accounts.addMethod( diff --git a/lib/services/core/DomainName.ts b/lib/services/core/DomainName.ts index 0233afe..37c7a7c 100644 --- a/lib/services/core/DomainName.ts +++ b/lib/services/core/DomainName.ts @@ -6,7 +6,7 @@ import * as route53Targets from 'aws-cdk-lib/aws-route53-targets'; import { Construct } from 'constructs'; export class DomainName extends Construct { - customDomain: apiGateway.DomainName; + version: apiGateway.IResource; constructor(scope: Construct, id: string, hostedZoneName: string) { super(scope, id); @@ -26,7 +26,7 @@ export class DomainName extends Construct { const customDomain = new apiGateway.DomainName(this, 'CustomDomain', { domainName, - certificate: apiCertificate, // Certificado de ACM válido para el dominio + certificate: apiCertificate, endpointType: apiGateway.EndpointType.REGIONAL, }); @@ -36,6 +36,19 @@ export class DomainName extends Construct { target: route53.RecordTarget.fromAlias(new route53Targets.ApiGatewayDomain(customDomain)), }); - this.customDomain = customDomain; + const api = new apiGateway.RestApi(this, 'BankApi', { + restApiName: 'Bank API', + description: 'Backend - Bank API', + }); + + new apiGateway.BasePathMapping(this, 'BankAPIMapping', { + domainName: customDomain, + restApi: api, + // basePath: '', + }); + + const version = api.root.addResource('v1'); + + this.version = version; } } diff --git a/lib/services/payments/infrastructure/PaymentGateway.ts b/lib/services/payments/infrastructure/PaymentGateway.ts index 2ee88ec..9ccc64a 100644 --- a/lib/services/payments/infrastructure/PaymentGateway.ts +++ b/lib/services/payments/infrastructure/PaymentGateway.ts @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ /* eslint-disable no-new */ import * as apiGateway from 'aws-cdk-lib/aws-apigateway'; import * as iam from 'aws-cdk-lib/aws-iam'; @@ -9,22 +10,10 @@ export class PaymentGateway extends Construct { scope: Construct, id: string, usersStateMachine: sfn.StateMachine, - customDomain: apiGateway.DomainName, + version: apiGateway.IResource, ) { super(scope, id); - const api = new apiGateway.RestApi(this, 'PaymentApi', { - restApiName: 'Payment API', - description: 'Backend - Payment API', - }); - - new apiGateway.BasePathMapping(this, 'PaymentApi-mapping', { - domainName: customDomain, - restApi: api, - basePath: 'payments', // Path base para esta API - }); - - // Permisos para que API Gateway pueda invocar la Step Function const role = new iam.Role(this, 'ApiGatewayStepFunctionsRole', { assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'), }); @@ -44,13 +33,16 @@ export class PaymentGateway extends Construct { responseTemplates: { 'application/json': ` #set($context.responseOverride.header.Content-Type = "application/json") - #set($inputRoot = $input.path('$')) + #set($output = $inputRoot.output) + #set($response = $util.parseJson($output)) + #if($inputRoot.status == "SUCCEEDED") - #set($message = $output.message) - #set($transactionId = $output.transactionId) - #if($inputRoot.output && $inputRoot.output != "{}") - $inputRoot.output + #if($response && $response.transac_ok == "Y") + { + "message": "$response.message", + "transactionId": "$response.transactionId" + } #else {"message": "Step Function completed successfully"} #end @@ -70,17 +62,16 @@ export class PaymentGateway extends Construct { ], requestTemplates: { 'application/json': `{ - "input": "$util.escapeJavaScript($input.body)", - "stateMachineArn": "${usersStateMachine.stateMachineArn}" - }`, + "input": "$util.escapeJavaScript($input.body)", + "stateMachineArn": "${usersStateMachine.stateMachineArn}" + }`, }, }, }); - // Crear un recurso de API y método para invocar la Step Function - const stepFunctionResource = api.root.addResource('payment'); + const payments = version.addResource('payments'); - stepFunctionResource.addMethod('POST', stepFunctionIntegration, { + payments.addMethod('POST', stepFunctionIntegration, { methodResponses: [{ statusCode: '200' }], }); } diff --git a/lib/services/payments/infrastructure/PaymentStack.ts b/lib/services/payments/infrastructure/PaymentStack.ts index 57d6736..2b9fb18 100644 --- a/lib/services/payments/infrastructure/PaymentStack.ts +++ b/lib/services/payments/infrastructure/PaymentStack.ts @@ -11,7 +11,7 @@ export class PaymentStack extends Construct { constructor( scope: Construct, id: string, - customDomain: apiGateway.DomainName, + version: apiGateway.IResource, accountsTable: dynamodb.Table, transactionsTable: dynamodb.Table, ) { @@ -27,6 +27,6 @@ export class PaymentStack extends Construct { const stepFunc = new StepFunctionExecutePayment(this, 'StepFunctionExecutePayment', lambdas); - new PaymentGateway(this, 'PaymentGateway', stepFunc.usersStateMachine, customDomain); + new PaymentGateway(this, 'PaymentGateway', stepFunc.usersStateMachine, version); } } diff --git a/lib/services/payments/infrastructure/StepFunctionExecutePayment.ts b/lib/services/payments/infrastructure/StepFunctionExecutePayment.ts index bc1c236..04ab338 100644 --- a/lib/services/payments/infrastructure/StepFunctionExecutePayment.ts +++ b/lib/services/payments/infrastructure/StepFunctionExecutePayment.ts @@ -1,3 +1,4 @@ +import * as logs from 'aws-cdk-lib/aws-logs'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; import { Construct } from 'constructs'; @@ -48,7 +49,7 @@ export class StepFunctionExecutePayment extends Construct { }); const successState = new sfn.Succeed(this, 'Success', { - outputPath: '$', + outputPath: '$.task3output', }); const isAccountValid = sfn.Condition.stringEquals('$.task1output.exists', 'Y'); @@ -69,8 +70,17 @@ export class StepFunctionExecutePayment extends Construct { const definition = getAccountTask.next(accountValid); + const logGroup = new logs.LogGroup(this, 'StateMachineLogGroup', { + retention: logs.RetentionDays.ONE_WEEK, + }); + this.usersStateMachine = new sfn.StateMachine(this, 'ExePaymentStateMachine', { definition, + logs: { + destination: logGroup, + level: sfn.LogLevel.ALL, + includeExecutionData: true, + }, stateMachineType: sfn.StateMachineType.EXPRESS, }); } From 9d02381dba5bf3fc713dc4d4452b9e178c45c424 Mon Sep 17 00:00:00 2001 From: Diego Flores Date: Mon, 9 Sep 2024 14:57:47 -0500 Subject: [PATCH 6/7] feat: added powertools layer --- lib/intrastructure/layers.ts | 10 + lib/services/accounts/get-account/handler.ts | 6 +- lib/services/common/logger.ts | 11 + .../infrastructure/StfExecutePaymentLambda.ts | 15 ++ .../infrastructure/dynamostreams-lambda.ts | 7 + package-lock.json | 220 +++++++++++++++++- package.json | 5 + 7 files changed, 268 insertions(+), 6 deletions(-) create mode 100644 lib/intrastructure/layers.ts create mode 100644 lib/services/common/logger.ts diff --git a/lib/intrastructure/layers.ts b/lib/intrastructure/layers.ts new file mode 100644 index 0000000..34c218f --- /dev/null +++ b/lib/intrastructure/layers.ts @@ -0,0 +1,10 @@ +import * as cdk from 'aws-cdk-lib'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import { Construct } from 'constructs'; + +export const getPowertoolsLayer = (scope: Construct) => + lambda.LayerVersion.fromLayerVersionArn( + scope, + 'powertools-layer', + `arn:aws:lambda:${cdk.Stack.of(scope).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12`, + ); diff --git a/lib/services/accounts/get-account/handler.ts b/lib/services/accounts/get-account/handler.ts index 5366e36..8d1d6cd 100644 --- a/lib/services/accounts/get-account/handler.ts +++ b/lib/services/accounts/get-account/handler.ts @@ -1,8 +1,12 @@ import { getAccountById } from '../../common/accounts'; +import { getLogger } from '../../common/logger'; import { Account } from '../../common/types'; +const logger = getLogger(); + export const handler = async (event: any) => { - console.info('Event:', event, typeof event); + logger.info('Event::::', JSON.stringify(event, null, 2)); + logger.info('PathParameters::::', 'test....'); const accountId = event.pathParameters?.accountId; diff --git a/lib/services/common/logger.ts b/lib/services/common/logger.ts new file mode 100644 index 0000000..d8651dc --- /dev/null +++ b/lib/services/common/logger.ts @@ -0,0 +1,11 @@ +import { Logger } from '@aws-lambda-powertools/logger'; + +let logger: Logger; + +// singleton +export const getLogger = (): Logger => { + if (logger) return logger; + logger = new Logger({ serviceName: 'vital-integration' }); + + return logger; +}; diff --git a/lib/services/payments/infrastructure/StfExecutePaymentLambda.ts b/lib/services/payments/infrastructure/StfExecutePaymentLambda.ts index d645436..619f6ae 100644 --- a/lib/services/payments/infrastructure/StfExecutePaymentLambda.ts +++ b/lib/services/payments/infrastructure/StfExecutePaymentLambda.ts @@ -3,6 +3,7 @@ import * as lambda from 'aws-cdk-lib/aws-lambda'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { Construct } from 'constructs'; +import { getPowertoolsLayer } from '../../../intrastructure/layers'; import { MP_ACCESS_TOKEN, MP_PUBLIC_KEY, PAYER_EMAIL, PAYER_ID } from '../../common/constants'; export class StfExecutePaymentLambda extends Construct { @@ -20,6 +21,8 @@ export class StfExecutePaymentLambda extends Construct { ) { super(scope, id); + const powertoolsLayer = getPowertoolsLayer(this); + const getAccountFunction = new NodejsFunction(this, 'GetAccountFunction', { description: 'Task1 - get-account', runtime: lambda.Runtime.NODEJS_20_X, @@ -28,6 +31,10 @@ export class StfExecutePaymentLambda extends Construct { environment: { ACCOUNTS_TABLE: accountsTable.tableName, }, + layers: [powertoolsLayer], + bundling: { + externalModules: ['@aws-lambda-powertools/*'], + }, }); accountsTable.grantReadData(getAccountFunction); @@ -42,6 +49,10 @@ export class StfExecutePaymentLambda extends Construct { PAYER_ID, PAYER_EMAIL, }, + layers: [powertoolsLayer], + bundling: { + externalModules: ['@aws-lambda-powertools/*'], + }, }); const saveTransactionFunction = new NodejsFunction(this, 'SaveTransactionFunction', { @@ -52,6 +63,10 @@ export class StfExecutePaymentLambda extends Construct { environment: { TRANSACTIONS_TABLE: transactionsTable.tableName, }, + layers: [powertoolsLayer], + bundling: { + externalModules: ['@aws-lambda-powertools/*'], + }, }); transactionsTable.grantReadWriteData(saveTransactionFunction); diff --git a/lib/services/payments/infrastructure/dynamostreams-lambda.ts b/lib/services/payments/infrastructure/dynamostreams-lambda.ts index ed12393..4f77a59 100644 --- a/lib/services/payments/infrastructure/dynamostreams-lambda.ts +++ b/lib/services/payments/infrastructure/dynamostreams-lambda.ts @@ -4,6 +4,8 @@ import * as eventSources from 'aws-cdk-lib/aws-lambda-event-sources'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { Construct } from 'constructs'; +import { getPowertoolsLayer } from '../../../intrastructure/layers'; + export class LambdaDynamodbStream extends Construct { constructor( scope: Construct, @@ -12,6 +14,7 @@ export class LambdaDynamodbStream extends Construct { accountsTable: dynamodb.Table, ) { super(scope, id); + const powertoolsLayer = getPowertoolsLayer(this); const streamDynamoFunction = new NodejsFunction(this, 'StreamDynamoNodeJsFunction', { runtime: lambda.Runtime.NODEJS_20_X, @@ -21,6 +24,10 @@ export class LambdaDynamodbStream extends Construct { environment: { ACCOUNTS_TABLE: accountsTable.tableName, }, + layers: [powertoolsLayer], + bundling: { + externalModules: ['@aws-lambda-powertools/*'], + }, }); accountsTable.grantReadWriteData(streamDynamoFunction); diff --git a/package-lock.json b/package-lock.json index 19c5640..7a19ff5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,11 @@ "version": "0.1.0", "dependencies": { "@aws-cdk/aws-lambda-nodejs": "^1.204.0", + "@aws-lambda-powertools/batch": "^2.7.0", + "@aws-lambda-powertools/logger": "^2.7.0", + "@aws-lambda-powertools/metrics": "^2.7.0", + "@aws-lambda-powertools/parameters": "^2.7.0", + "@aws-lambda-powertools/tracer": "^2.7.0", "@aws-sdk/client-dynamodb": "^3.645.0", "@aws-sdk/util-dynamodb": "^3.645.0", "aws-cdk-lib": "2.155.0", @@ -1449,6 +1454,102 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-lambda-powertools/batch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/batch/-/batch-2.7.0.tgz", + "integrity": "sha512-JzgwTx7ACoTIk4WrjkeRJ9VEqq3RGKaoCPppOCTJYY+As6zcWWozpnRI9W4Ne7xch7wXi23YMgbWtm7m7miS4Q==" + }, + "node_modules/@aws-lambda-powertools/commons": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/commons/-/commons-2.7.0.tgz", + "integrity": "sha512-IHDwmjJLiEVu8GfpHaHPrd7kEycHm/6Qh/6ssWGtyNZVDDJA/RzBmiRBnedx/As0h5njJmR28eNEkCNFA7rdSA==" + }, + "node_modules/@aws-lambda-powertools/logger": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/logger/-/logger-2.7.0.tgz", + "integrity": "sha512-6nY26q7N5qH8eIDjV3ZBFxtNHx5M6cLQeQDP7kvdGPhRI3N0xWLsiaedMTByzRqaIDYjV3VXOaAIc9r59vCgbg==", + "dependencies": { + "@aws-lambda-powertools/commons": "^2.7.0", + "lodash.merge": "^4.6.2" + }, + "peerDependencies": { + "@middy/core": "4.x || 5.x" + }, + "peerDependenciesMeta": { + "@middy/core": { + "optional": true + } + } + }, + "node_modules/@aws-lambda-powertools/metrics": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/metrics/-/metrics-2.7.0.tgz", + "integrity": "sha512-wo7yfsgajTD5oIpxgq2696cobYGaAPJpvPc7HwcqKiQ6o9H6JsaC9u5LD6UXdReQAJiFTUIBsePTP6LFqWKh1w==", + "dependencies": { + "@aws-lambda-powertools/commons": "^2.7.0" + }, + "peerDependencies": { + "@middy/core": "4.x || 5.x" + }, + "peerDependenciesMeta": { + "@middy/core": { + "optional": true + } + } + }, + "node_modules/@aws-lambda-powertools/parameters": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/parameters/-/parameters-2.7.0.tgz", + "integrity": "sha512-fUt20q+qySAt72CuUqH5tu5bfdAqAmQLFWwXGZRqTblhnLayuj9XFfPiKdERA/pWoe2jkz2rhpFJCmyYsK7z3A==", + "dependencies": { + "@aws-lambda-powertools/commons": "^2.7.0" + }, + "peerDependencies": { + "@aws-sdk/client-appconfigdata": ">=3.x", + "@aws-sdk/client-dynamodb": ">=3.x", + "@aws-sdk/client-secrets-manager": ">=3.x", + "@aws-sdk/client-ssm": ">=3.x", + "@aws-sdk/util-dynamodb": ">=3.x", + "@middy/core": "4.x || 5.x" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-appconfigdata": { + "optional": true + }, + "@aws-sdk/client-dynamodb": { + "optional": true + }, + "@aws-sdk/client-secrets-manager": { + "optional": true + }, + "@aws-sdk/client-ssm": { + "optional": true + }, + "@aws-sdk/util-dynamodb": { + "optional": true + }, + "@middy/core": { + "optional": true + } + } + }, + "node_modules/@aws-lambda-powertools/tracer": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/tracer/-/tracer-2.7.0.tgz", + "integrity": "sha512-IAC6wuEvfwpLEjhWS0qF17k8QBCskepjCD0uP3eVJ0PmFWe00Sipz8jJZurnBojk90s5sbdUUGIKl7Aqa4xrJg==", + "dependencies": { + "@aws-lambda-powertools/commons": "^2.7.0", + "aws-xray-sdk-core": "^3.9.0" + }, + "peerDependencies": { + "@middy/core": "4.x || 5.x" + }, + "peerDependenciesMeta": { + "@middy/core": { + "optional": true + } + } + }, "node_modules/@aws-sdk/client-dynamodb": { "version": "3.645.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.645.0.tgz", @@ -4146,6 +4247,14 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/cls-hooked": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@types/cls-hooked/-/cls-hooked-4.3.8.tgz", + "integrity": "sha512-tf/7H883gFA6MPlWI15EQtfNZ+oPL0gLKkOlx9UHFrun1fC/FkuyNBpTKq1B5E3T4fbvjId6WifHUdSGsMMuPg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -4205,7 +4314,6 @@ "version": "20.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -4744,11 +4852,27 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, + "node_modules/async-hook-jl": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", + "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", + "dependencies": { + "stack-chain": "^1.3.7" + }, + "engines": { + "node": "^4.7 || >=6.9 || >=7.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/atomic-batcher": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", + "integrity": "sha512-EFGCRj4kLX1dHv1cDzTk+xbjBFj1GnJDpui52YmEcxxHHEWjYyT6l51U7n6WQ28osZH4S9gSybxe56Vm7vB61Q==" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -5150,6 +5274,55 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/aws-xray-sdk-core": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.10.0.tgz", + "integrity": "sha512-D1Qk0CSu6ILu3dkDnoUimzUKLdUdngPggLXDJaOQlxr5TC+2/Yvvopf+GL43gXu7OFYEo0dciyGoSb3mAsuLAQ==", + "dependencies": { + "@aws-sdk/types": "^3.4.1", + "@smithy/service-error-classification": "^2.0.4", + "@types/cls-hooked": "^4.3.3", + "atomic-batcher": "^1.0.2", + "cls-hooked": "^4.2.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">= 14.x" + } + }, + "node_modules/aws-xray-sdk-core/node_modules/@smithy/service-error-classification": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz", + "integrity": "sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==", + "dependencies": { + "@smithy/types": "^2.12.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/aws-xray-sdk-core/node_modules/@smithy/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/aws-xray-sdk-core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/axios": { "version": "1.7.7", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", @@ -5511,6 +5684,27 @@ "node": ">=12" } }, + "node_modules/cls-hooked": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", + "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", + "dependencies": { + "async-hook-jl": "^1.7.6", + "emitter-listener": "^1.0.1", + "semver": "^5.4.1" + }, + "engines": { + "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" + } + }, + "node_modules/cls-hooked/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -5844,6 +6038,14 @@ "integrity": "sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==", "dev": true }, + "node_modules/emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "dependencies": { + "shimmer": "^1.2.0" + } + }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -8473,8 +8675,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lru-cache": { "version": "5.1.1", @@ -9339,6 +9540,11 @@ "node": ">=8" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -9401,6 +9607,11 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug==" + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -9934,8 +10145,7 @@ "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 + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/update-browserslist-db": { "version": "1.1.0", diff --git a/package.json b/package.json index 589e83f..206cc82 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,11 @@ "@types/uuid": "^10.0.0" }, "dependencies": { + "@aws-lambda-powertools/batch": "^2.7.0", + "@aws-lambda-powertools/logger": "^2.7.0", + "@aws-lambda-powertools/metrics": "^2.7.0", + "@aws-lambda-powertools/parameters": "^2.7.0", + "@aws-lambda-powertools/tracer": "^2.7.0", "@aws-cdk/aws-lambda-nodejs": "^1.204.0", "@aws-sdk/client-dynamodb": "^3.645.0", "@aws-sdk/util-dynamodb": "^3.645.0", From b5f97d30c0c21bc00fcb12dee90870f62d837c27 Mon Sep 17 00:00:00 2001 From: dfloresgonz Date: Mon, 9 Sep 2024 15:50:48 -0500 Subject: [PATCH 7/7] test: add tests --- .DS_Store | Bin 6148 -> 6148 bytes README.diego.md | 3 ++ image.png | Bin 0 -> 278833 bytes jest.config.js | 2 +- .../accounts/get-account/get-account.test.ts | 49 ++++++++++++++++++ lib/services/accounts/get-account/handler.ts | 5 -- lib/services/common/logger.ts | 2 +- test/io-node-challenge.test.ts | 16 ------ 8 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 README.diego.md create mode 100644 image.png create mode 100644 lib/services/accounts/get-account/get-account.test.ts delete mode 100644 test/io-node-challenge.test.ts diff --git a/.DS_Store b/.DS_Store index c6a1877c67ac74d872ee8c4bbae697ed6e0fdd12..87261d15b01aefb81048ca6f8d98b791da3492d8 100644 GIT binary patch delta 74 zcmZoMXfc=|&e%4wP;8=}q9`K+0|O8XFnH$VCnx3PCjt2a6F;gmGH%@C%|40IU^6?1 a00(2+#*g2bC-aNwvVt@m*la6um>B@Ye-nuS delta 118 zcmZoMXfc=|&e%S&P;8=}q9_vs0|O%ig8&0V5kn$FIzy^wPJZ&lgX)tFL|Ak=7?K(C z8Oj(^ktLII@{@p?fI1i)fmrW97%(tw?D1yb%+4Xe!Pvg>;CJT9{35!H44WNA4l_?| GU;zNzS|D}+ diff --git a/README.diego.md b/README.diego.md new file mode 100644 index 0000000..a8e8b07 --- /dev/null +++ b/README.diego.md @@ -0,0 +1,3 @@ +# Arquitectura + +![alt text](image.png) \ No newline at end of file diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..b679358a04b75fffd1c55240f2f683e79d1f82b5 GIT binary patch literal 278833 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 bPxBPA+k@+Nh)=k!f`97D+DZ@h9X$I#5K/test'], + roots: ['/lib'], testMatch: ['**/*.test.ts'], transform: { '^.+\\.tsx?$': 'ts-jest' diff --git a/lib/services/accounts/get-account/get-account.test.ts b/lib/services/accounts/get-account/get-account.test.ts new file mode 100644 index 0000000..abfce45 --- /dev/null +++ b/lib/services/accounts/get-account/get-account.test.ts @@ -0,0 +1,49 @@ +import { handler } from './handler'; +import { getAccountById } from '../../common/accounts'; +import { getLogger } from '../../common/logger'; + +jest.mock('../../common/accounts'); +jest.mock('../../common/logger'); + +describe('handler', () => { + // const mockLogger = { + // info: jest.fn(), + // }; + + beforeAll(() => { + // (getLogger as jest.Mock).mockReturnValue(mockLogger); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should return account details', async () => { + const mockEvent = { + pathParameters: { + accountId: '123', + }, + }; + + const mockAccountResponse = { + amount: 1000, + id: '123', + }; + + (getAccountById as jest.Mock).mockResolvedValue(mockAccountResponse); + + const result = await handler(mockEvent); + + expect(result).toEqual({ + statusCode: 200, + body: JSON.stringify({ + amount: 1000, + id: '123', + }), + }); + + // expect(mockLogger.info).toHaveBeenCalledWith('Event::::', JSON.stringify(mockEvent, null, 2)); + // expect(mockLogger.info).toHaveBeenCalledWith('PathParameters::::', 'test....'); + expect(getAccountById).toHaveBeenCalledWith('123'); + }); +}); diff --git a/lib/services/accounts/get-account/handler.ts b/lib/services/accounts/get-account/handler.ts index 8d1d6cd..aed6d78 100644 --- a/lib/services/accounts/get-account/handler.ts +++ b/lib/services/accounts/get-account/handler.ts @@ -2,12 +2,7 @@ import { getAccountById } from '../../common/accounts'; import { getLogger } from '../../common/logger'; import { Account } from '../../common/types'; -const logger = getLogger(); - export const handler = async (event: any) => { - logger.info('Event::::', JSON.stringify(event, null, 2)); - logger.info('PathParameters::::', 'test....'); - const accountId = event.pathParameters?.accountId; const accountResponse = await getAccountById(accountId); diff --git a/lib/services/common/logger.ts b/lib/services/common/logger.ts index d8651dc..371868b 100644 --- a/lib/services/common/logger.ts +++ b/lib/services/common/logger.ts @@ -5,7 +5,7 @@ let logger: Logger; // singleton export const getLogger = (): Logger => { if (logger) return logger; - logger = new Logger({ serviceName: 'vital-integration' }); + logger = new Logger({ serviceName: 'bank-api' }); return logger; }; diff --git a/test/io-node-challenge.test.ts b/test/io-node-challenge.test.ts deleted file mode 100644 index 5e54cce..0000000 --- a/test/io-node-challenge.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -// import * as cdk from 'aws-cdk-lib'; -// import { Template } from 'aws-cdk-lib/assertions'; -// import * as IoNodeChallenge from '../lib/io-node-challenge-stack'; - -// example test. To run these tests, uncomment this file along with the -// example resource in lib/io-node-challenge-stack.ts -test('SQS Queue Created', () => { - // const app = new cdk.App(); - // // WHEN - // const stack = new IoNodeChallenge.IoNodeChallengeStack(app, 'MyTestStack'); - // // THEN - // const template = Template.fromStack(stack); - // template.hasResourceProperties('AWS::SQS::Queue', { - // VisibilityTimeout: 300 - // }); -});