diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 69d5d21c5..5c23aa0e5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -7,8 +7,8 @@ on: - "!skipci*" concurrency: - # Ensuring group key matches the destroy workflow currently in master - group: ${{ github.workflow }}-${{ github.ref_name }} + # Ensuring group key matches the destroy workflow currently in main + group: ${{ github.ref_name }} cancel-in-progress: false permissions: diff --git a/.github/workflows/destroy.yml b/.github/workflows/destroy.yml index 5411cd724..e1033651b 100644 --- a/.github/workflows/destroy.yml +++ b/.github/workflows/destroy.yml @@ -8,6 +8,9 @@ on: description: "Name of the environment to destroy:" required: true +concurrency: + group: ${{ inputs.environment || github.event.ref }} + permissions: id-token: write contents: read diff --git a/.github/workflows/post-deploy-slack-notification.yml b/.github/workflows/post-deploy-slack-notification.yml index 9a06a1e06..2fa4ee199 100755 --- a/.github/workflows/post-deploy-slack-notification.yml +++ b/.github/workflows/post-deploy-slack-notification.yml @@ -8,7 +8,6 @@ on: - 'main' - 'val' - 'production' - - 'snyk-**' jobs: notify_on_failure: @@ -24,20 +23,6 @@ jobs: MSG_MINIMAL: true SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - # Notify the integrations channel only when a Snyk auto merge fails - notify_failed_snyk_auto_merge: - runs-on: ubuntu-latest - #only check branch names that begin with snyk- - if: ${{ github.event.workflow_run.conclusion == 'failure' && startsWith(github.event.workflow_run.head_branch, 'snyk-') }} - steps: - - name: Slack Notification - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_TITLE: ":boom: A Synk auto merge has failed in ${{ github.repository }}" - SLACK_MESSAGE: "${{ github.event.workflow_run.html_url }}" - MSG_MINIMAL: true - SLACK_WEBHOOK: ${{ secrets.INTEGRATIONS_SLACK_WEBHOOK }} - # Sends a slack message to the mdct-prod-releases channel in CMS slack notify_on_prod_release: runs-on: ubuntu-latest diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 90e039c4e..e6cb288b1 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -44,21 +44,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PRNUM: ${{ github.event.pull_request.number }} - PR_AUTHOR: ${{ github.event.pull_request.user.login }} - - #Notify the integrations channel only when a Snyk auto merge fails pr checks - notify_on_pr_failure: - runs-on: ubuntu-latest - needs: - - linting - - jest-frontend - - jest-backend - #only check branch names that begin with snyk- - if: ${{ failure() && startsWith(github.head_ref, 'snyk-') }} - steps: - - name: Slack Notification - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_TITLE: ":boom: A Synk auto merge has failed pull request checks in ${{ github.repository }}." - MSG_MINIMAL: true - SLACK_WEBHOOK: ${{ secrets.INTEGRATIONS_SLACK_WEBHOOK }} + PR_AUTHOR: ${{ github.event.pull_request.user.login }} \ No newline at end of file diff --git a/.github/workflows/snyk-auto-merge.yml b/.github/workflows/snyk-auto-merge.yml deleted file mode 100644 index 0694c999a..000000000 --- a/.github/workflows/snyk-auto-merge.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Snyk auto-merge -on: - pull_request: - workflow_dispatch: - -permissions: - pull-requests: write - contents: write - -jobs: - snyk: - runs-on: ubuntu-latest - if: ${{ github.actor == 'mdct-github-service-account' }} - steps: - - name: Auto-approve Snyk PR - run: gh pr review --approve "$PR_URL" - env: - PR_URL: ${{github.event.pull_request.html_url}} - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} - - name: Enable auto-merge for Snyk PRs - run: gh pr merge --auto --squash "$PR_URL" - env: - PR_URL: ${{github.event.pull_request.html_url}} - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/README.md b/README.md index 3d65460e6..872ff60c8 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Maintainability](https://api.codeclimate.com/v1/badges/f1775f53aedf747e85b2/maintainability)](https://codeclimate.com/repos/6449718c21275100df510ea9/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/f1775f53aedf747e85b2/test_coverage)](https://codeclimate.com/repos/6449718c21275100df510ea9/test_coverage) -### Integration Environment Deploy Status: +## Integration Environment Deploy Status: | Branch | Build Status | | ------------- | ------------- | | main | ![deploy](https://github.com/Enterprise-CMCS/macpro-mdct-carts/actions/workflows/deploy.yml/badge.svg) | @@ -16,7 +16,7 @@ CARTS is the CMCS MDCT application for collecting state data related to coverage Under section 2108(a) of the Act, states must assess the operation of their separate CHIP and Medicaid expansion programs and the progress made in reducing the number of uncovered, low-income children. The results of the assessment are reported to the Secretary by January 1 following the end of the FY in the CHIP Annual Reporting Template System (CARTS). CARTS collects information about programmatic changes, performance goals, program operation, program financing, program challenges and accomplishments. -_Note: The [`main`](https://github.com/Enterprise-CMCS/macpro-mdct-carts/tree/main) branch contains CARTSv3. All code related to CARTSv2 (legacy) can be found in the [`master`](https://github.com/Enterprise-CMCS/macpro-mdct-carts/tree/master) branch._ +_Note: The [`main`](https://github.com/Enterprise-CMCS/macpro-mdct-carts/tree/main) branch contains CARTSv3. All code related to CARTSv2 (legacy) can be found in the [`skipci-archive-carts-v2`](https://github.com/Enterprise-CMCS/macpro-mdct-carts/tree/skipci-archive-carts-v2) branch._ ## Table of contents @@ -115,10 +115,7 @@ On the SEDS side, this topic is updated on every submission of seds data, but CA - 4th quarter data. - The rollover for a "new year" is October, and future submissions are not recognized until that threshold -Updates outside of that time frame will need to be manually corrected in CARTS, or the integration will need to be modifed to collect data for old forms. CARTS additionally looks for the `enrollmentCounts` property which is only included in forms 21E and 64.21E (question 7), either by manual trigger or update. See SEDS files: - -- [generateEnrollmentTotals](https://github.com/Enterprise-CMCS/macpro-mdct-seds/blob/master/services/app-api/handlers/state-forms/post/generateEnrollmentTotals.js) -- [updateStateForms](https://github.com/Enterprise-CMCS/macpro-mdct-seds/blob/master/services/app-api/handlers/state-forms/post/updateStateForms.js) +Updates outside of that time frame will need to be manually corrected in CARTS, or the integration will need to be modifed to collect data for old forms. CARTS additionally looks for the `enrollmentCounts` property which is only included in forms 21E and 64.21E (question 7), either by manual trigger or update. For testing convenience, stateuser2 points at AL in CARTS and the stateuser points at AL in SEDS. diff --git a/package.json b/package.json index 5bfe1bb5d..64d442968 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "eslint-plugin-react": "^7.24.0", "eslint-plugin-react-hooks": "^2.x", "prettier": "^2.4.1", - "serverless": "^3.38.0", + "serverless": "^3.39.0", "serverless-bundle": "^6.1.0", "serverless-cloudfront-invalidate": "^1.12.2", "serverless-dotenv-plugin": "^3.0.0", diff --git a/services/carts-bigmac-streams/handlers/configureConnectors.js b/services/carts-bigmac-streams/handlers/configureConnectors.js deleted file mode 100644 index 538e6faef..000000000 --- a/services/carts-bigmac-streams/handlers/configureConnectors.js +++ /dev/null @@ -1,102 +0,0 @@ -/* eslint-disable no-console */ -var { - ECSClient, - ListTasksCommand, - DescribeTasksCommand, -} = require("@aws-sdk/client-ecs"); -var lodash = require("lodash"); -var http = require("http"); - -const connectors = [ - { - name: `${process.env.connectorPrefix}sink.lambda.enrollmentcounts`, - config: { - "tasks.max": "1", - "connector.class": - "com.nordstrom.kafka.connect.lambda.LambdaSinkConnector", - topics: process.env.sinkTopics, - "key.converter": "org.apache.kafka.connect.storage.StringConverter", - "value.converter": "org.apache.kafka.connect.storage.StringConverter", - "aws.region": process.env.sinkFunctionRegion, - "aws.lambda.function.arn": process.env.sinkFunctionArn, - "aws.lambda.batch.enabled": "false", - "aws.credentials.provider.class": - " com.amazonaws.auth.DefaultAWSCredentialsProviderChain", - }, - }, -]; - -// eslint-disable-next-line no-unused-vars -function myHandler(event, context, callback) { - console.log("Received event:", JSON.stringify(event, null, 2)); - var ecsClient = new ECSClient(); - var listParams = { - cluster: process.env.cluster, - }; - ecsClient - .send(new ListTasksCommand(listParams)) - .then(function (taskArnsResult) { - var describeParams = { - cluster: process.env.cluster, - tasks: taskArnsResult.taskArns, - }; - return ecsClient.send(new DescribeTasksCommand(describeParams)); - }) - .then(function (describeResult) { - describeResult.tasks.forEach((task) => { - var ip = lodash.filter( - task.attachments[0].details, - (x) => x.name === "privateIPv4Address" - )[0].value; - console.log(`Configuring connector on worker: ${ip}`); - connectors.forEach(function (config) { - //console.log(`Configuring connector with config: ${JSON.stringify(config, null, 2)}`); - putConnectorConfig(ip, config, function (res) { - console.log(res); - }); - }); - }); - }) - .catch(function (err) { - console.log(err, err.stack); - }); -} - -function putConnectorConfig(workerIp, config, callback) { - var retry = function (e) { - console.log("Got error: " + e); - setTimeout(function () { - putConnectorConfig(workerIp, config, callback); - }, 5000); - }; - - var options = { - hostname: workerIp, - port: 8083, - path: `/connectors/${config.name}/config`, - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - }; - - const req = http - .request(options, (res) => { - console.log(`statusCode: ${res.statusCode}`); - if (res.statusCode == "404") { - retry.call(`${res.statusCode}`); - } - res.on("data", (d) => { - console.log(d.toString("utf-8")); - }); - }) - .on("error", retry); - // eslint-disable-next-line no-unused-vars - req.setTimeout(5000, function (thing) { - this.socket.destroy(); - }); - req.write(JSON.stringify(config.config)); - req.end(); -} - -exports.handler = myHandler; diff --git a/services/carts-bigmac-streams/handlers/sinkEnrollmentCounts.js b/services/carts-bigmac-streams/handlers/sinkEnrollmentCounts.js index 77bb7ad93..d5bb4500b 100644 --- a/services/carts-bigmac-streams/handlers/sinkEnrollmentCounts.js +++ b/services/carts-bigmac-streams/handlers/sinkEnrollmentCounts.js @@ -14,47 +14,55 @@ const { * @param {*} _callback */ async function myHandler(event, _context, _callback) { - const json = JSON.parse(event.value); + const sedsTopicKey = `${process.env.sedsTopic}-0`; + if (!event?.records?.[sedsTopicKey]) { + return; + } + const records = event.records[sedsTopicKey]; const currentYear = getReportingYear(); const dynamoClient = buildClient(); - if ( - json.NewImage.enrollmentCounts && - json.NewImage.enrollmentCounts.year >= currentYear - 1 && - json.NewImage.quarter === 4 - ) { - try { - // eslint-disable-next-line no-console - console.log("Sink message received", json); - const indexToUpdate = - json.NewImage.enrollmentCounts.year === currentYear ? 2 : 1; - let typeOfEnrollment = "Medicaid Expansion CHIP"; - let typeKey = "medicaid_exp_chip"; - if (json.NewImage.enrollmentCounts.type === "separate") { - typeOfEnrollment = "Separate CHIP"; - typeKey = "separate_chip"; - } - const stateId = json.NewImage.state_id; - const createdTime = new Date().toLocaleString(); + for (const record of records) { + const decodedValue = atob(record.value); + const value = JSON.parse(decodedValue); + if ( + value.NewImage.enrollmentCounts && + value.NewImage.enrollmentCounts.year >= currentYear - 1 && + value.NewImage.quarter === 4 + ) { + try { + // eslint-disable-next-line no-console + console.log("Sink message received", value); + const indexToUpdate = + value.NewImage.enrollmentCounts.year === currentYear ? 2 : 1; + let typeOfEnrollment = "Medicaid Expansion CHIP"; + let typeKey = "medicaid_exp_chip"; + if (value.NewImage.enrollmentCounts.type === "separate") { + typeOfEnrollment = "Separate CHIP"; + typeKey = "separate_chip"; + } + const stateId = value.NewImage.state_id; + const createdTime = new Date().toLocaleString(); - const pk = `${stateId}-${currentYear}`; - const entryKey = `${typeKey}-${indexToUpdate}`; + const pk = `${stateId}-${currentYear}`; + const entryKey = `${typeKey}-${indexToUpdate}`; - const enrollmentEntry = { - filterId: `${currentYear}-02`, - typeOfEnrollment, - indexToUpdate, - stateId, - yearToModify: currentYear, - enrollmentCount: json.NewImage.enrollmentCounts.count, - createdTime, - lastSynced: json.NewImage.lastSynced, - }; + const enrollmentEntry = { + filterId: `${currentYear}-02`, + typeOfEnrollment, + indexToUpdate, + stateId, + yearToModify: currentYear, + enrollmentCount: value.NewImage.enrollmentCounts.count, + createdTime, + lastSynced: value.NewImage.lastSynced ?? "", + }; - await updateEnrollment(pk, entryKey, enrollmentEntry, dynamoClient); - } catch (error) { - // eslint-disable-next-line no-console - console.log(error); + await updateEnrollment(pk, entryKey, enrollmentEntry, dynamoClient); + } catch (error) { + // eslint-disable-next-line no-console + console.log(error); + } } } } diff --git a/services/carts-bigmac-streams/package.json b/services/carts-bigmac-streams/package.json index f298170a7..c31df29f2 100644 --- a/services/carts-bigmac-streams/package.json +++ b/services/carts-bigmac-streams/package.json @@ -4,12 +4,8 @@ "description": "", "dependencies": { "@aws-sdk/client-dynamodb": "^3.621.0", - "@aws-sdk/client-ecs": "^3.621.0", "@aws-sdk/lib-dynamodb": "^3.621.0", "@aws-sdk/util-dynamodb": "^3.621.0", - "kafkajs": "^1.15.0", - "lodash": "^4.17.21", - "uuid": "^8.3.2" - }, - "devDependencies": {} + "kafkajs": "^1.15.0" + } } diff --git a/services/carts-bigmac-streams/serverless.yml b/services/carts-bigmac-streams/serverless.yml index 2738c7ed2..2fb4525ea 100644 --- a/services/carts-bigmac-streams/serverless.yml +++ b/services/carts-bigmac-streams/serverless.yml @@ -8,7 +8,6 @@ package: plugins: - serverless-bundle - serverless-dotenv-plugin - - serverless-plugin-scripts - serverless-online - serverless-iam-helper - serverless-s3-bucket-helper @@ -19,28 +18,26 @@ custom: stage: ${opt:stage, self:provider.stage} region: ${opt:region, self:provider.region} serverlessTerminationProtection: - stages: # This is a list of common names for important envs that should not be destroyed. You can remove the stage names your project doesn't use; this list is meant to be inclusive. - - master + stages: + - main - val - production - - develop - - main - - impl - - prod - kafkaConnectImage: ${ssm:/configuration/${self:custom.stage}/kafka_connect_image, ssm:/configuration/default/kafka_connect_image,"confluentinc/cp-kafka-connect:6.2.0"} + bootstrapBroker1: ${ssm:/configuration/default/bigmac/bootstrapBroker1} + bootstrapBroker2: ${ssm:/configuration/default/bigmac/bootstrapBroker2} + bootstrapBroker3: ${ssm:/configuration/default/bigmac/bootstrapBroker3} bootstrapBrokerStringTls: ${ssm:/configuration/${self:custom.stage}/bigmac/bootstrapBrokerStringTls, ssm:/configuration/default/bigmac/bootstrapBrokerStringTls} vpcId: ${ssm:/configuration/${self:custom.stage}/vpc/id, ssm:/configuration/default/vpc/id} + privateSubnetA: ${ssm:/configuration/${self:custom.stage}/vpc/subnets/private/a/id, ssm:/configuration/default/vpc/subnets/private/a/id} + privateSubnetB: ${ssm:/configuration/${self:custom.stage}/vpc/subnets/private/b/id, ssm:/configuration/default/vpc/subnets/private/b/id} + privateSubnetC: ${ssm:/configuration/${self:custom.stage}/vpc/subnets/private/c/id, ssm:/configuration/default/vpc/subnets/private/c/id} privateSubnets: - - ${ssm:/configuration/${self:custom.stage}/vpc/subnets/private/a/id, ssm:/configuration/default/vpc/subnets/private/a/id} - - ${ssm:/configuration/${self:custom.stage}/vpc/subnets/private/b/id, ssm:/configuration/default/vpc/subnets/private/b/id} - - ${ssm:/configuration/${self:custom.stage}/vpc/subnets/private/c/id, ssm:/configuration/default/vpc/subnets/private/c/id} + - ${self:custom.privateSubnetA} + - ${self:custom.privateSubnetB} + - ${self:custom.privateSubnetC} stageEnrollmentCountsTableName: ${env:stageEnrollmentCountsTableName, cf:database-${self:custom.stage}.StageEnrollmentCountsTableName} stateStatusTableStreamArn: ${env:stateStatusTableStreamArn, cf:database-${self:custom.stage}.StateStatusTableStreamArn} sectionTableStreamArn: ${env:sectionTableStreamArn, cf:database-${self:custom.stage}.SectionTableStreamArn} - scripts: - hooks: - deploy:finalize: | - aws lambda invoke --region ${self:provider.region} --function-name ${self:service}-${self:custom.stage}-configureConnectors --invocation-type RequestResponse /dev/null + sedsTopic: "aws.mdct.seds.cdc.state-forms.v0" provider: name: aws @@ -54,15 +51,22 @@ provider: path: ${ssm:/configuration/${self:custom.stage}/iam/path, ssm:/configuration/default/iam/path, "/"} permissionsBoundary: ${ssm:/configuration/${self:custom.stage}/iam/permissionsBoundaryPolicy, ssm:/configuration/default/iam/permissionsBoundaryPolicy, ""} statements: + - Effect: "Allow" + Action: + - logs:CreateLogGroup + - logs:CreateLogStream + - logs:PutLogEvents + Resource: "arn:aws:logs:*:*:*" + - Effect: "Allow" + Action: + - "ec2:DescribeNetworkInterfaces" + - "ec2:DescribeSecurityGroups" + - "ec2:DescribeVpcs" + Resource: "*" - Effect: "Allow" Action: - dynamodb:DescribeTable - - dynamodb:Query - - dynamodb:Scan - - dynamodb:GetItem - - dynamodb:PutItem - dynamodb:UpdateItem - - dynamodb:DeleteItem Resource: "*" - Effect: "Allow" Action: @@ -76,30 +80,11 @@ provider: - ${self:custom.sectionTableStreamArn} functions: - configureConnectors: - handler: handlers/configureConnectors.handler - role: LambdaConfigureConnectorsRole - environment: - cluster: !Ref KafkaConnectCluster - connectorPrefix: carts-${self:custom.stage}- - sinkTopics: aws.mdct.seds.cdc.state-forms.v0 - sinkFunctionArn: !GetAtt SinkEnrollmentCountsLambdaFunction.Arn - sinkFunctionRegion: ${self:custom.region} - BOOTSTRAP_BROKER_STRING_TLS: ${self:custom.bootstrapBrokerStringTls} - STAGE: ${self:custom.stage} - maximumRetryAttempts: 2 - timeout: 120 - vpc: - securityGroupIds: - - Ref: LambdaConfigureConnectorsSecurityGroup - subnetIds: ${self:custom.privateSubnets} sinkEnrollmentCounts: handler: handlers/sinkEnrollmentCounts.handler - role: SinkEnrollmentCountsRole environment: - BOOTSTRAP_BROKER_STRING_TLS: ${self:custom.bootstrapBrokerStringTls} - STAGE: ${self:custom.stage} stageEnrollmentCountsTableName: ${self:custom.stageEnrollmentCountsTableName} + sedsTopic: ${self:custom.sedsTopic} maximumRetryAttempts: 2 timeout: 120 vpc: @@ -139,251 +124,40 @@ resources: - "" - ${self:provider.iam.role.permissionsBoundary} Resources: - KafkaConnectWorkerLogGroup: - Type: "AWS::Logs::LogGroup" - Properties: - LogGroupName: /aws/fargate/${self:service}-${self:custom.stage}-kafka-connect - KafkaConnectWorkerSecurityGroup: + LambdaConfigureConnectorsSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: - GroupDescription: Security Group for the Fargate Connect Workers. + GroupDescription: Security Group for configuring the connector. VpcId: ${self:custom.vpcId} - KafkaConnectWorkerSecurityGroupIngressLambda: + LambdaSecurityGroupIngressCluster: Type: AWS::EC2::SecurityGroupIngress Properties: - GroupId: !Sub "${KafkaConnectWorkerSecurityGroup}" + GroupId: !Sub "${LambdaConfigureConnectorsSecurityGroup}" IpProtocol: tcp FromPort: 8083 ToPort: 8083 SourceSecurityGroupId: !Sub "${LambdaConfigureConnectorsSecurityGroup}" - KafkaConnectWorkerSecurityGroupIngressCluster: - Type: AWS::EC2::SecurityGroupIngress - Properties: - GroupId: !Sub "${KafkaConnectWorkerSecurityGroup}" - IpProtocol: tcp - FromPort: 8083 - ToPort: 8083 - SourceSecurityGroupId: !Sub "${KafkaConnectWorkerSecurityGroup}" - KafkaConnectWorkerRole: - Type: "AWS::IAM::Role" - Properties: - AssumeRolePolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: "Allow" - Principal: - Service: - - "ecs.amazonaws.com" - - "ecs-tasks.amazonaws.com" - Action: "sts:AssumeRole" - Path: ${self:provider.iam.role.path} - PermissionsBoundary: - Fn::If: - - CreatePermissionsBoundary - - ${self:provider.iam.role.permissionsBoundary} - - !Ref AWS::NoValue - ManagedPolicyArns: - - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy - Policies: - - PolicyName: "LambdaRolePolicy" - PolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: "Allow" - Action: - - "lambda:*" - Resource: !GetAtt SinkEnrollmentCountsLambdaFunction.Arn - KafkaConnectWorkerTaskDefinition: - Type: "AWS::ECS::TaskDefinition" - Properties: - ContainerDefinitions: - - Name: ${self:service}-${self:custom.stage}-worker - Image: ${self:custom.kafkaConnectImage} - Memory: 4096 - Cpu: 2048 - Command: - - bash - - "-c" - - | - export CONNECT_REST_HOST_NAME=`curl $ECS_CONTAINER_METADATA_URI_V4 | sed -e 's/.*IPv4Addresses":\["\(.*\)"\],"AttachmentIndex.*/\1/'` && - export CONNECT_REST_ADVERTISED_HOST_NAME=$CONNECT_REST_HOST_NAME && - curl -k -SL -o /etc/kafka-connect/jars/postgresql-42.2.18.jar "https://jdbc.postgresql.org/download/postgresql-42.2.18.jar" && - chmod +x /etc/kafka-connect/jars/postgresql-42.2.18.jar && - curl -k -SL -o /etc/kafka-connect/jars/kafka-connect-lambda-1.2.2.jar "https://github.com/Nordstrom/kafka-connect-lambda/releases/download/v1.2.2/kafka-connect-lambda-1.2.2.jar" && - chmod +x /etc/kafka-connect/jaras/kafka-connect-lambda-1.2.2.jar - curl -k -SL -o /etc/kafka-connect/jars/kafka-connect-jdbc-10.2.0.jar "https://packages.confluent.io/maven/io/confluent/kafka-connect-jdbc/10.2.0/kafka-connect-jdbc-10.2.0.jar" && - chmod +x /etc/kafka-connect/jars/kafka-connect-jdbc-10.2.0.jar && - /etc/confluent/docker/run - Environment: - - Name: CONNECT_BOOTSTRAP_SERVERS - Value: >- - ${self:custom.bootstrapBrokerStringTls} - - Name: CONNECT_GROUP_ID - Value: mgmt.connect.cms-carts-seds.${self:service}-${self:custom.stage} - - Name: CONNECT_CONFIG_STORAGE_TOPIC - Value: mgmt.connect.cms-carts-seds.${self:service}-${self:custom.stage}.config - - Name: CONNECT_OFFSET_STORAGE_TOPIC - Value: mgmt.connect.cms-carts-seds.${self:service}-${self:custom.stage}.offsets - - Name: CONNECT_STATUS_STORAGE_TOPIC - Value: mgmt.connect.cms-carts-seds.${self:service}-${self:custom.stage}.status - - Name: CONNECT_OFFSET_STORAGE_PARTITIONS - Value: 5 - - Name: CONNECT_STATUS_STORAGE_PARTITIONS - Value: 1 - - Name: CONNECT_KEY_CONVERTER - Value: org.apache.kafka.connect.json.JsonConverter - - Name: CONNECT_VALUE_CONVERTER - Value: org.apache.kafka.connect.json.JsonConverter - - Name: CONNECT_INTERNAL_KEY_CONVERTER - Value: org.apache.kafka.connect.json.JsonConverter - - Name: CONNECT_INTERNAL_VALUE_CONVERTER - Value: org.apache.kafka.connect.json.JsonConverter - - Name: CONNECT_PLUGIN_PATH - Value: /usr/share/java,/etc/kafka-connect/jars - - Name: CONNECT_SECURITY_PROTOCOL - Value: SSL - # Producer/Consumer configs below - # Thank you to https://github.com/confluentinc/kafka-connect-jdbc/issues/161 - - Name: CONNECT_PRODUCER_BOOTSTRAP_SERVERS - Value: >- - ${self:custom.bootstrapBrokerStringTls} - - Name: CONNECT_PRODUCER_SECURITY_PROTOCOL - Value: SSL - - Name: CONNECT_CONSUMER_BOOTSTRAP_SERVERS - Value: >- - ${self:custom.bootstrapBrokerStringTls} - - Name: CONNECT_CONSUMER_SECURITY_PROTOCOL - Value: SSL - LogConfiguration: - LogDriver: awslogs - Options: - awslogs-region: !Sub "${AWS::Region}" - awslogs-group: !Sub "${KafkaConnectWorkerLogGroup}" - awslogs-stream-prefix: fargate - Family: ${self:service}-${self:custom.stage}-kafka-connect-worker - NetworkMode: awsvpc - ExecutionRoleArn: !GetAtt KafkaConnectWorkerRole.Arn - TaskRoleArn: !GetAtt KafkaConnectWorkerRole.Arn - RequiresCompatibilities: - - FARGATE - Memory: 4GB - Cpu: 2048 - KafkaConnectCluster: - Type: "AWS::ECS::Cluster" - KafkaConnectService: - Type: "AWS::ECS::Service" + SinkEnrollmentCountsEventSourceMappingKafka: + Type: AWS::Lambda::EventSourceMapping Properties: - Cluster: !Sub "${KafkaConnectCluster}" - DeploymentConfiguration: - MaximumPercent: 100 - MinimumHealthyPercent: 0 - LaunchType: FARGATE - ServiceName: kafka-connect - DesiredCount: 1 - TaskDefinition: !Sub "${KafkaConnectWorkerTaskDefinition}" - NetworkConfiguration: - AwsvpcConfiguration: - AssignPublicIp: DISABLED - SecurityGroups: - - !Sub "${KafkaConnectWorkerSecurityGroup}" - Subnets: ${self:custom.privateSubnets} - LambdaConfigureConnectorsSecurityGroup: - Type: AWS::EC2::SecurityGroup - Properties: - GroupDescription: Security Group for configuring the connector. - VpcId: ${self:custom.vpcId} - SinkEnrollmentCountsRole: - Type: "AWS::IAM::Role" - Properties: - AssumeRolePolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: "Allow" - Principal: - Service: "lambda.amazonaws.com" - Action: "sts:AssumeRole" - Path: ${self:provider.iam.role.path} - PermissionsBoundary: - Fn::If: - - CreatePermissionsBoundary - - ${self:provider.iam.role.permissionsBoundary} - - !Ref AWS::NoValue - ManagedPolicyArns: - - !Sub arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole - Policies: - - PolicyName: "LambdaRolePolicy" - PolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: "Allow" - Action: - - logs:CreateLogGroup - - logs:CreateLogStream - - logs:PutLogEvents - Resource: "arn:aws:logs:*:*:*" - - Effect: "Allow" - Action: - - "ec2:CreateNetworkInterface" - - "ec2:DescribeNetworkInterfaces" - - "ec2:DetachNetworkInterface" - - "ec2:DeleteNetworkInterface" - - "ec2:DescribeSecurityGroups" - Resource: "*" - - Effect: "Allow" - Action: - - dynamodb:DescribeTable - - dynamodb:Query - - dynamodb:Scan - - dynamodb:GetItem - - dynamodb:PutItem - - dynamodb:UpdateItem - - dynamodb:DeleteItem - Resource: "*" - LambdaConfigureConnectorsRole: - Type: "AWS::IAM::Role" - Properties: - AssumeRolePolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: "Allow" - Principal: - Service: "lambda.amazonaws.com" - Action: "sts:AssumeRole" - Path: ${self:provider.iam.role.path} - PermissionsBoundary: - Fn::If: - - CreatePermissionsBoundary - - ${self:provider.iam.role.permissionsBoundary} - - !Ref AWS::NoValue - Policies: - - PolicyName: "LambdaRolePolicy" - PolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: "Allow" - Action: - - logs:CreateLogGroup - - logs:CreateLogStream - - logs:PutLogEvents - Resource: "arn:aws:logs:*:*:*" - - Effect: "Allow" - Action: - - ec2:CreateNetworkInterface - - ec2:DeleteNetworkInterface - - ec2:DetachNetworkInterface - - ec2:DescribeNetworkInterfaces - - ec2:DescribeSecurityGroups - - ec2:DescribeSubnets - - ec2:DescribeVpcs - Resource: "*" - - Effect: "Allow" - Action: - - ecs:ListTasks - - ecs:DescribeTasks - Resource: "*" - Outputs: - KafkaConnectWorkerSecurityGroupId: - Description: | - The ID of the security group attached to the Kafka Connect cluster tasks. - This can be used by other resources to attach additional ingress rules. - Value: !Ref KafkaConnectWorkerSecurityGroup + FunctionName: !GetAtt SinkEnrollmentCountsLambdaFunction.Arn + SelfManagedEventSource: + Endpoints: + KafkaBootstrapServers: + - ${self:custom.bootstrapBroker1} + - ${self:custom.bootstrapBroker2} + - ${self:custom.bootstrapBroker3} + SelfManagedKafkaEventSourceConfig: + ConsumerGroupId: ${self:custom.project}-${self:custom.stage} + Topics: + - ${self:custom.sedsTopic} + SourceAccessConfigurations: + - Type: "VPC_SUBNET" + URI: subnet:${self:custom.privateSubnetA} + - Type: "VPC_SUBNET" + URI: subnet:${self:custom.privateSubnetB} + - Type: "VPC_SUBNET" + URI: subnet:${self:custom.privateSubnetC} + - Type: "VPC_SECURITY_GROUP" + URI: !Sub security_group:${LambdaConfigureConnectorsSecurityGroup} + MaximumBatchingWindowInSeconds: 30 diff --git a/services/carts-bigmac-streams/yarn.lock b/services/carts-bigmac-streams/yarn.lock index c734dccce..9d243ee50 100644 --- a/services/carts-bigmac-streams/yarn.lock +++ b/services/carts-bigmac-streams/yarn.lock @@ -90,55 +90,6 @@ tslib "^2.6.2" uuid "^9.0.1" -"@aws-sdk/client-ecs@^3.621.0": - version "3.621.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ecs/-/client-ecs-3.621.0.tgz#5dd17c7445990d325657a3f62ebfb4365223ff6d" - integrity sha512-0jwDWcMWKv/ODAv8Ez9JmIQVDfDNsfDiCWizEFWaeNts0Lpu4lNANU4JxRG9ttgOiqo5wfUc4SOQ8EXnJoabsQ== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.621.0" - "@aws-sdk/client-sts" "3.621.0" - "@aws-sdk/core" "3.621.0" - "@aws-sdk/credential-provider-node" "3.621.0" - "@aws-sdk/middleware-host-header" "3.620.0" - "@aws-sdk/middleware-logger" "3.609.0" - "@aws-sdk/middleware-recursion-detection" "3.620.0" - "@aws-sdk/middleware-user-agent" "3.620.0" - "@aws-sdk/region-config-resolver" "3.614.0" - "@aws-sdk/types" "3.609.0" - "@aws-sdk/util-endpoints" "3.614.0" - "@aws-sdk/util-user-agent-browser" "3.609.0" - "@aws-sdk/util-user-agent-node" "3.614.0" - "@smithy/config-resolver" "^3.0.5" - "@smithy/core" "^2.3.1" - "@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.13" - "@smithy/middleware-serde" "^3.0.3" - "@smithy/middleware-stack" "^3.0.3" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.1.11" - "@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.13" - "@smithy/util-defaults-mode-node" "^3.0.13" - "@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" - "@aws-sdk/client-sso-oidc@3.621.0": version "3.621.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.621.0.tgz#3fa3d468fbebbd93a5f75c1d51b63cc7af3ef17b" @@ -960,11 +911,6 @@ kafkajs@^1.15.0: resolved "https://registry.yarnpkg.com/kafkajs/-/kafkajs-1.15.0.tgz#a5ada0d933edca2149177393562be6fb0875ec3a" integrity sha512-yjPyEnQCkPxAuQLIJnY5dI+xnmmgXmhuOQ1GVxClG5KTOV/rJcW1qA3UfvyEJKTp/RTSqQnUR3HJsKFvHyTpNg== -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - mnemonist@0.38.3: version "0.38.3" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" @@ -987,11 +933,6 @@ tslib@^2.6.2: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" diff --git a/services/database/data/seed-local/seed-section.json b/services/database/data/seed-local/seed-section.json index ec098c54d..faa2eab30 100644 --- a/services/database/data/seed-local/seed-section.json +++ b/services/database/data/seed-local/seed-section.json @@ -4896,8 +4896,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -5648,8 +5647,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -5744,8 +5742,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -5840,8 +5837,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -5937,8 +5933,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6033,8 +6028,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6136,8 +6130,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6232,8 +6225,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6328,8 +6320,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6425,8 +6416,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6521,8 +6511,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { diff --git a/services/database/data/seed/seed-section-base-2023.json b/services/database/data/seed/seed-section-base-2023.json index bba4ec5ad..f8d6c8d01 100644 --- a/services/database/data/seed/seed-section-base-2023.json +++ b/services/database/data/seed/seed-section-base-2023.json @@ -4888,8 +4888,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -5640,8 +5639,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -5736,8 +5734,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -5832,8 +5829,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -5929,8 +5925,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6025,8 +6020,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6128,8 +6122,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6224,8 +6217,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6320,8 +6312,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6417,8 +6408,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { @@ -6513,8 +6503,7 @@ "type": "integer", "label": "Total for all ages (0-16)", "answer": { - "entry": null, - "readonly": true + "entry": null }, "context_data": { "conditional_display": { diff --git a/services/database/scripts/remove-readonly-in-section-3c.js b/services/database/scripts/remove-readonly-in-section-3c.js new file mode 100644 index 000000000..22bead5f1 --- /dev/null +++ b/services/database/scripts/remove-readonly-in-section-3c.js @@ -0,0 +1,99 @@ +/* eslint-disable no-console */ +/* + * Local: + * `DYNAMODB_URL="http://localhost:8000" dynamoPrefix="local" node services/database/scripts/remove-readonly-in-section-3c.js` + * Branch: + * dynamoPrefix="YOUR BRANCH NAME" node services/database/scripts/remove-readonly-in-section-3c.js + */ + +const { buildDynamoClient, scan, update } = require("./utils/dynamodb.js"); + +const isLocal = !!process.env.DYNAMODB_URL; + +const sectionTable = isLocal + ? "local-section" + : process.env.dynamoPrefix + "-section"; + +async function handler() { + try { + console.log("Searching for 2023 Forms"); + + buildDynamoClient(); + + console.log(`Processing table ${sectionTable}`); + const existingItems = await scan({ + TableName: sectionTable, + }); + const filteredItems = filter(existingItems); + const transformedItems = await transform(filteredItems); + await update(sectionTable, transformedItems); + console.log(`Touched ${transformedItems.length} in table ${sectionTable}`); + console.debug("Data fix complete"); + + return { + statusCode: 200, + body: "All done!", + }; + } catch (err) { + console.error(err); + return { + statusCode: 500, + body: err.message, + }; + } +} + +function filter(items) { + return items.filter((item) => item.year === 2023 && item.sectionId === 3); +} + +async function transform(items) { + // Touch sync field only + const transformed = items.map((section) => { + console.log("Transforming section!", section); + return updateSection3(section); + }); + + return transformed; +} + +const updateSection3 = (section) => { + section.contents.section.subsections[2].parts.map((part) => { + return recurseAndUpdateQuestions(part.questions, section.pk); + }); + return section; +}; + +const recurseAndUpdateQuestions = (questions, reportBeingTransformed) => { + const fieldstoRemoveReadonly = [ + "2023-03-c-05-19-a", + "2023-03-c-06-10-a", + "2023-03-c-06-11-a", + "2023-03-c-06-12-a", + "2023-03-c-06-13-a", + "2023-03-c-06-14-a", + "2023-03-c-06-15-a", + "2023-03-c-06-16-a", + "2023-03-c-06-17-a", + "2023-03-c-06-18-a", + "2023-03-c-06-19-a", + ]; + for (let question of questions) { + if ( + fieldstoRemoveReadonly.includes(question?.id) && + question?.answer?.readonly + ) { + console.log( + reportBeingTransformed, + "Found and deleting readonly field from question", + question.id + ); + delete question.answer.readonly; + } + if (question?.questions) { + recurseAndUpdateQuestions(question.questions, reportBeingTransformed); + } + } +}; + +handler(); diff --git a/services/database/serverless.yml b/services/database/serverless.yml index 4cb11570c..cd23c4b87 100644 --- a/services/database/serverless.yml +++ b/services/database/serverless.yml @@ -21,7 +21,6 @@ custom: serverlessTerminationProtection: stages: - main - - master - val - production acsTableName: ${self:custom.stage}-acs diff --git a/services/ui-auth/serverless.yml b/services/ui-auth/serverless.yml index 068112c66..b8b50f50b 100644 --- a/services/ui-auth/serverless.yml +++ b/services/ui-auth/serverless.yml @@ -29,6 +29,7 @@ plugins: - serverless-bundle - serverless-iam-helper - serverless-s3-bucket-helper + - "@enterprise-cmcs/serverless-waf-plugin" s3BucketHelper: loggingConfiguration: @@ -39,10 +40,14 @@ custom: project: "carts" stage: ${opt:stage, self:provider.stage} region: ${opt:region, self:provider.region} + wafPlugin: + name: ${self:service}-${self:custom.stage}-webacl-waf + wafExcludeRules: + awsCommon: + - "SizeRestrictions_BODY" serverlessTerminationProtection: stages: - main - - master - val - production sesSourceEmailAddress: ${ssm:/configuration/${self:custom.stage}/sesSourceEmailAddress, ssm:/configuration/default/sesSourceEmailAddress, ""} @@ -116,6 +121,18 @@ resources: StringAttributeConstraints: MinLength: 0 MaxLength: 256 + UserPoolAddOns: + AdvancedSecurityMode: ENFORCED + UserPoolTags: + Name: ${self:custom.stage}-user-pool + + # Associate the WAF Web ACL with the Cognito User Pool + CognitoUserPoolWAFAssociation: + Type: 'AWS::WAFv2::WebACLAssociation' + Properties: + ResourceArn: !GetAtt CognitoUserPool.Arn + WebACLArn: !GetAtt WafPluginAcl.Arn + CognitoUserPoolClient: Type: AWS::Cognito::UserPoolClient Properties: diff --git a/services/ui-src/package.json b/services/ui-src/package.json index 40c10cc74..5fb8787bb 100644 --- a/services/ui-src/package.json +++ b/services/ui-src/package.json @@ -17,11 +17,11 @@ "@testing-library/user-event": "^14.5.1", "@vitejs/plugin-react": "^4.2.1", "aws-amplify": "^5.3.4", + "date-fns": "^3.6.0", "font-awesome": "^4.7.0", "jsonpath": "^1.0.2", "launchdarkly-react-client-sdk": "^3.3.2", "mathjs": "^7.5.0", - "moment": "^2.29.4", "prop-types": "^15.7.2", "react": "^16.13.1", "react-data-table-component": "^6.11.6", diff --git a/services/ui-src/serverless.yml b/services/ui-src/serverless.yml index 711d6d61f..eff1d6bdf 100644 --- a/services/ui-src/serverless.yml +++ b/services/ui-src/serverless.yml @@ -29,7 +29,6 @@ custom: serverlessTerminationProtection: stages: - main - - master - val - production api_region: ${param:ApiRegion} diff --git a/services/ui-src/src/components/layout/CertifyAndSubmit.jsx b/services/ui-src/src/components/layout/CertifyAndSubmit.jsx index 296e44a8e..c0fb90e9c 100644 --- a/services/ui-src/src/components/layout/CertifyAndSubmit.jsx +++ b/services/ui-src/src/components/layout/CertifyAndSubmit.jsx @@ -1,9 +1,8 @@ import React, { useEffect } from "react"; import { shallowEqual, useDispatch, useSelector } from "react-redux"; -import moment from "moment"; -import PropTypes from "prop-types"; import { Button, Dialog } from "@cmsgov/design-system"; import { useHistory } from "react-router-dom"; +import { format } from "date-fns"; // components import PageInfo from "./PageInfo"; import FormActions from "./FormActions"; @@ -17,6 +16,7 @@ import { import useModal from "../../hooks/useModal"; // types import { AppRoles } from "../../types"; +import PropTypes from "prop-types"; const Submit = ({ openCertifyConfirmation }) => ( <> @@ -43,15 +43,25 @@ const Submit = ({ openCertifyConfirmation }) => ( Submit.propTypes = { openCertifyConfirmation: PropTypes.func.isRequired }; -const Thanks = ({ done: doneDispatch, lastSave, submitterUsername }) => { +const Thanks = ({ done: doneDispatch, submitterUsername }) => { + const lastSave = useSelector( + (state) => + getCurrentReportStatus( + state.reportStatus, + state.formData, + state.stateUser, + state.global.formYear + ).lastChanged + ); + const formattedDate = lastSave ? format(lastSave, "PPP") : ""; + const formattedTime = lastSave ? format(lastSave, "p") : ""; return ( <>

Thank you for submitting your CARTS report!

- Submitted on {lastSave.format("MMMM Do, YYYY")} at{" "} - {lastSave.format("h:mm A")} by {submitterUsername}. + Submitted on {formattedDate} at {formattedTime} by {submitterUsername}.

What to expect next

You‘ll hear from CMS if they have any questions about your report.

@@ -64,7 +74,6 @@ const Thanks = ({ done: doneDispatch, lastSave, submitterUsername }) => { Thanks.propTypes = { done: PropTypes.func.isRequired, - lastSave: PropTypes.object.isRequired, submitterUsername: PropTypes.string.isRequired, }; @@ -72,34 +81,25 @@ const CertifyAndSubmit = () => { const dispatch = useDispatch(); const history = useHistory(); const { isShowing, toggleModal } = useModal(); - const [isCertified, lastSave, submitterUsername, currentUserRole, state] = - useSelector( - (state) => [ - !selectIsFormEditable( - state.reportStatus, - state.formData, - state.stateUser, - state.global.formYear - ), - moment( - getCurrentReportStatus( - state.reportStatus, - state.formData, - state.stateUser, - state.global.formYear - ).lastChanged - ), - getCurrentReportStatus( - state.reportStatus, - state.formData, - state.stateUser, - state.global.formYear - ).username, - state.stateUser.currentUser.role, - state.stateUser.abbr, - ], - shallowEqual - ); + const [isCertified, submitterUsername, currentUserRole, state] = useSelector( + (state) => [ + !selectIsFormEditable( + state.reportStatus, + state.formData, + state.stateUser, + state.global.formYear + ), + getCurrentReportStatus( + state.reportStatus, + state.formData, + state.stateUser, + state.global.formYear + ).username, + state.stateUser.currentUser.role, + state.stateUser.abbr, + ], + shallowEqual + ); useEffect(() => { dispatch(loadForm(state)); @@ -149,11 +149,7 @@ const CertifyAndSubmit = () => { {currentUserRole === AppRoles.STATE_USER &&

Certify and Submit

} {isCertified ? ( - + ) : ( )} diff --git a/services/ui-src/src/components/layout/FormActions.jsx b/services/ui-src/src/components/layout/FormActions.jsx index cd2f3114d..8013054bd 100644 --- a/services/ui-src/src/components/layout/FormActions.jsx +++ b/services/ui-src/src/components/layout/FormActions.jsx @@ -1,9 +1,10 @@ import React, { useState, useEffect, useRef } from "react"; +import { useSelector, shallowEqual } from "react-redux"; +// components import { Button } from "@cmsgov/design-system"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faPrint, faWindowClose } from "@fortawesome/free-solid-svg-icons"; -import { connect } from "react-redux"; -import PropTypes from "prop-types"; +//types import { AppRoles } from "../../types"; /** @@ -12,10 +13,14 @@ import { AppRoles } from "../../types"; * @returns {JSX.Element} * @constructor */ -const FormActions = (props) => { +const FormActions = () => { + const [currentUser, formYear] = useSelector( + (state) => [state.stateUser.currentUser, state.global.formYear], + shallowEqual + ); + // Initialise printDialogeRef const printDialogeRef = useRef(null); - const { currentUser, formYear } = props; // Get section IDs and subsection IDs for printing single section let searchParams = document.location.pathname @@ -163,15 +168,4 @@ const FormActions = (props) => { ); }; -FormActions.propTypes = { - currentUser: PropTypes.object.isRequired, - formYear: PropTypes.number.isRequired, -}; - -export const mapStateToProps = (state) => ({ - currentUser: state.stateUser.currentUser, - formYear: state.global.formYear, - printType: state.global.printType, -}); - -export default connect(mapStateToProps)(FormActions); +export default FormActions; diff --git a/services/ui-src/src/components/layout/FormNavigation.jsx b/services/ui-src/src/components/layout/FormNavigation.jsx index 8f3d3222e..967c5c242 100644 --- a/services/ui-src/src/components/layout/FormNavigation.jsx +++ b/services/ui-src/src/components/layout/FormNavigation.jsx @@ -1,17 +1,28 @@ import React from "react"; -import PropTypes from "prop-types"; +import { useSelector, shallowEqual } from "react-redux"; +import { useHistory, useLocation } from "react-router-dom"; + +//components import { Button } from "@cmsgov/design-system"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faAngleLeft, faAngleRight } from "@fortawesome/free-solid-svg-icons"; -import { connect } from "react-redux"; -import { withRouter } from "react-router-dom"; +//selectors import { selectSectionsForNav } from "../../store/selectors"; +//types import { AppRoles } from "../../types"; const idToUrl = (id) => `/sections/${id.replace(/-/g, "/")}`; -const FormNavigation = (props) => { - const { history, location, sections, role } = props; +const FormNavigation = () => { + const history = useHistory(); + const location = useLocation(); + + const [formData, role] = useSelector( + (state) => [state.formData, state.stateUser?.currentUser?.role], + shallowEqual + ); + + const sections = selectSectionsForNav(formData); const items = []; sections.forEach((section) => { @@ -120,16 +131,4 @@ const FormNavigation = (props) => { ); }; -FormNavigation.propTypes = { - history: PropTypes.object.isRequired, - location: PropTypes.object.isRequired, - sections: PropTypes.array.isRequired, - role: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]).isRequired, -}; - -const mapStateToProps = (state) => ({ - sections: selectSectionsForNav(state), - role: state.stateUser?.currentUser?.role, -}); - -export default connect(mapStateToProps)(withRouter(FormNavigation)); +export default FormNavigation; diff --git a/services/ui-src/src/components/layout/PageInfo.jsx b/services/ui-src/src/components/layout/PageInfo.jsx index 1e3076dd1..41dae237e 100644 --- a/services/ui-src/src/components/layout/PageInfo.jsx +++ b/services/ui-src/src/components/layout/PageInfo.jsx @@ -1,19 +1,18 @@ import React from "react"; import { shallowEqual, useSelector } from "react-redux"; -import moment from "moment"; import Autosave from "../fields/Autosave"; import Title from "./Title"; const PageInfo = () => { const [lastSaved, status] = useSelector( - (state) => [moment(state.save.lastSave), state.reportStatus.status], + (state) => [state.save.lastSave, state.reportStatus.status], shallowEqual ); return (
{status ?? "draft"} - {lastSaved.isValid() && ` | Last Edit: ${lastSaved.format("M/D/YYYY")}`} + {lastSaved && ` | Last Edit: ${lastSaved.toLocaleDateString()}`}
<Autosave /> diff --git a/services/ui-src/src/components/layout/PageInfo.test.jsx b/services/ui-src/src/components/layout/PageInfo.test.jsx index 203e4cf87..22300eef4 100644 --- a/services/ui-src/src/components/layout/PageInfo.test.jsx +++ b/services/ui-src/src/components/layout/PageInfo.test.jsx @@ -11,7 +11,9 @@ const store = mockStore({ status: null, }, save: { - lastSave: "01/01/2002", + lastSave: new Date( + "Mon Jan 1 2024 12:00:00 GMT-0400 (Eastern Daylight Time)" + ), }, }); jest.mock("./Title", () => () => { diff --git a/services/ui-src/src/components/layout/Part.jsx b/services/ui-src/src/components/layout/Part.jsx index 894793d14..0e5a8b9a5 100644 --- a/services/ui-src/src/components/layout/Part.jsx +++ b/services/ui-src/src/components/layout/Part.jsx @@ -11,11 +11,51 @@ import { shouldDisplay } from "../../util/shouldDisplay"; const Part = ({ partId, partNumber, nestedSubsectionTitle }) => { const [, section] = partId.split("-"); - const { contextData, questions, show, text, title } = useSelector( - (state) => mapStateToProps(state, partId), + + const [ + formData, + currentUserRole, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments, + ] = useSelector( + (state) => [ + state.formData, + state.stateUser.currentUser.role, + state.reportStatus, + state.allStatesData, + state.stateUser.abbr, + state.enrollmentCounts.chipEnrollments, + ], shallowEqual ); + const part = selectFragment(formData, partId); + const partContextData = part.context_data; + + const contextData = partContextData; + const questions = selectQuestionsForPart( + formData, + currentUserRole, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments, + partId + ); + const show = shouldDisplay( + currentUserRole, + formData, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments, + partContextData + ); + const text = part ? part.text : null; + const title = part ? part.title : null; + const getPartContent = () => { if (show) { return ( @@ -62,18 +102,4 @@ const Part = ({ partId, partNumber, nestedSubsectionTitle }) => { </div> ); }; - -const mapStateToProps = (state, partId) => { - const part = selectFragment(state, partId); - const partContextData = part.context_data; - - return { - contextData: partContextData, - questions: selectQuestionsForPart(state, partId), - show: shouldDisplay(state, partContextData), - text: part ? part.text : null, - title: part ? part.title : null, - }; -}; - export default Part; diff --git a/services/ui-src/src/components/layout/Part.test.jsx b/services/ui-src/src/components/layout/Part.test.jsx index 8053313a9..44cdeb951 100644 --- a/services/ui-src/src/components/layout/Part.test.jsx +++ b/services/ui-src/src/components/layout/Part.test.jsx @@ -87,6 +87,9 @@ const store = mockStore({ stateId: "AL", }, ], + enrollmentCounts: { + chipEnrollments: {}, + }, global: { isFetching: false, }, diff --git a/services/ui-src/src/components/layout/SaveMessage.js b/services/ui-src/src/components/layout/SaveMessage.js deleted file mode 100644 index a3c83e8d8..000000000 --- a/services/ui-src/src/components/layout/SaveMessage.js +++ /dev/null @@ -1,65 +0,0 @@ -import moment from "moment"; -import { useEffect, useState } from "react"; -import PropTypes from "prop-types"; - -/* - * Configure moment to display '1 time-unit ago' instead of 'a time-unit ago' - * https://github.com/moment/moment/issues/3764 - */ -moment.updateLocale("en", { - relativeTime: { - s: "seconds", - m: "1 minute", - mm: "%d minutes", - h: "1 hour", - hh: "%d hours", - d: "1 day", - dd: "%d days", - M: "1 month", - MM: "%d months", - y: "1 year", - yy: "%d years", - }, -}); - -const SaveMessage = ({ lastSaved }) => { - const [currentMoment, setCurrentMoment] = useState(() => moment()); - - useEffect(() => { - const timerID = setInterval(() => setCurrentMoment(moment()), 1000); - return () => clearInterval(timerID); - }); - - const lastSavedMoment = moment(lastSaved); - - if (!lastSavedMoment.isValid()) { - return "Not yet saved"; - } - - const difference = currentMoment.diff(lastSavedMoment); - const duration = moment.duration(difference); - let result = "Last saved "; - - if (duration.asMinutes() < 1) return "Saved"; - - if (duration.asDays() < 1) { - result += lastSavedMoment.format("h:mm a"); - } else if (duration.asYears() < 1) { - result += lastSavedMoment.format("MMMM D"); - } else { - result += lastSavedMoment.format("MMMM D, YYYY"); - } - - result += ` (${lastSavedMoment.fromNow()})`; - return result; -}; - -SaveMessage.propTypes = { - lastSaved: PropTypes.oneOfType([ - PropTypes.instanceOf(Date), - PropTypes.instanceOf(moment), - PropTypes.string, - ]), -}; - -export default SaveMessage; diff --git a/services/ui-src/src/components/layout/SaveMessage.jsx b/services/ui-src/src/components/layout/SaveMessage.jsx new file mode 100644 index 000000000..8d790b3d9 --- /dev/null +++ b/services/ui-src/src/components/layout/SaveMessage.jsx @@ -0,0 +1,32 @@ +import { useEffect, useState } from "react"; +import { + differenceInMinutes, + format, + formatDistanceToNowStrict, +} from "date-fns"; +import PropTypes from "prop-types"; + +const SaveMessage = ({ lastSaved }) => { + const [currentMoment, setCurrentMoment] = useState(() => Date.now()); + + useEffect(() => { + const timerID = setInterval(() => setCurrentMoment(Date.now()), 1000); + return () => clearInterval(timerID); + }); + + if (!lastSaved) return "Not yet saved"; + if (differenceInMinutes(currentMoment, lastSaved) < 1) return "Saved"; + + return `Last saved ${format(lastSaved, "p")} (${formatDistanceToNowStrict( + lastSaved + )} ago)`; +}; + +SaveMessage.propTypes = { + lastSaved: PropTypes.oneOfType([ + PropTypes.instanceOf(Date), + PropTypes.string, + ]), +}; + +export default SaveMessage; diff --git a/services/ui-src/src/components/layout/SaveMessage.test.jsx b/services/ui-src/src/components/layout/SaveMessage.test.jsx index 8c811153e..e03de1d0c 100644 --- a/services/ui-src/src/components/layout/SaveMessage.test.jsx +++ b/services/ui-src/src/components/layout/SaveMessage.test.jsx @@ -1,5 +1,4 @@ import { mount, shallow } from "enzyme"; -import moment from "moment"; import React from "react"; import SaveMessage from "./SaveMessage"; @@ -10,9 +9,6 @@ describe("SaveMessage Component", () => { const dateProp = { lastSaved: new Date() }; const saveMessageDateProp = <SaveMessage {...dateProp} />; - const momentProp = { lastSaved: moment() }; - const saveMessageMomentProp = <SaveMessage {...momentProp} />; - const nullProp = { lastSaved: null }; const saveMessageNullProp = <SaveMessage {...nullProp} />; @@ -24,10 +20,6 @@ describe("SaveMessage Component", () => { expect(shallow(saveMessageDateProp).exists()).toBe(true); }); - it("should accept moment as prop", () => { - expect(shallow(saveMessageMomentProp).exists()).toBe(true); - }); - it("should accept null as prop and return not saved", () => { const wrapper = mount(saveMessageNullProp); expect(wrapper.text().includes("Not yet saved")).toBe(true); diff --git a/services/ui-src/src/components/layout/StateHeader.jsx b/services/ui-src/src/components/layout/StateHeader.jsx index b37c25366..e9c3eafc1 100644 --- a/services/ui-src/src/components/layout/StateHeader.jsx +++ b/services/ui-src/src/components/layout/StateHeader.jsx @@ -1,27 +1,29 @@ import React from "react"; -import PropTypes from "prop-types"; -import { connect } from "react-redux"; +import { useSelector } from "react-redux"; +import { AppRoles } from "../../types"; -const StateHeader = ({ imageURI, name }) => ( - <div - className="state-header" - data-testid="state-header" - aria-label="State Header" - > - <div className="state-image"> - <img src={imageURI} alt={name} /> - </div> - <div className="state-name">{name}</div> - </div> -); -StateHeader.propTypes = { - imageURI: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, +const StateHeader = () => { + const { currentUser, name, imageURI } = useSelector( + (state) => state.stateUser + ); + return ( + <> + {currentUser?.role === AppRoles.STATE_USER && ( + <div + className="state-header" + data-testid="state-header" + aria-label="State Header" + > + <div className="state-image"> + <img src={imageURI} alt={name} /> + </div> + <div className="state-name" aria-label={name}> + {name} + </div> + </div> + )} + </> + ); }; -const mapStateToProps = (state) => ({ - name: state.stateUser.name, - imageURI: state.stateUser.imageURI, -}); - -export default connect(mapStateToProps)(StateHeader); +export default StateHeader; diff --git a/services/ui-src/src/components/layout/StateHeader.test.jsx b/services/ui-src/src/components/layout/StateHeader.test.jsx index 5d8f1fbe3..6a91f01cd 100644 --- a/services/ui-src/src/components/layout/StateHeader.test.jsx +++ b/services/ui-src/src/components/layout/StateHeader.test.jsx @@ -4,30 +4,45 @@ import configureMockStore from "redux-mock-store"; import { Provider } from "react-redux"; import { render } from "@testing-library/react"; import StateHeader from "./StateHeader"; +import { + adminUserWithReportInProgress, + stateUserWithReportInProgress, +} from "../../store/fakeStoreExamples"; const mockStore = configureMockStore(); -const store = mockStore({ - stateUser: { - name: "Kentucky", - imageURI: "kentucky.png", - }, -}); -const header = ( - <Provider store={store}> - <StateHeader /> - </Provider> -); +const stateUserStore = mockStore(stateUserWithReportInProgress); +const adminUserStore = mockStore(adminUserWithReportInProgress); describe("State Header Component", () => { - it("should render correctly", () => { + test("should render correctly", () => { + const header = ( + <Provider store={stateUserStore}> + <StateHeader /> + </Provider> + ); expect(shallow(header).exists()).toBe(true); }); - it("Displays name, image, and alt-text for a state", () => { + test("Displays state header content for state user", () => { + const header = ( + <Provider store={stateUserStore}> + <StateHeader /> + </Provider> + ); const { getByTestId, getByAltText } = render(header); const headerComponent = getByTestId("state-header"); - expect(headerComponent).toHaveTextContent("Kentucky"); - const img = getByAltText("Kentucky"); - expect(img.src).toContain("kentucky.png"); + expect(headerComponent).toHaveTextContent("Alabama"); + const img = getByAltText("Alabama"); + expect(img.src).toContain("al.svg"); + }); + + test("Does not display state header content for admin user", () => { + const header = ( + <Provider store={adminUserStore}> + <StateHeader /> + </Provider> + ); + const { queryByTestId } = render(header); + expect(queryByTestId("state-header")).not.toBeInTheDocument(); }); }); diff --git a/services/ui-src/src/components/layout/Subsection.jsx b/services/ui-src/src/components/layout/Subsection.jsx index 60799cede..67433a5b5 100644 --- a/services/ui-src/src/components/layout/Subsection.jsx +++ b/services/ui-src/src/components/layout/Subsection.jsx @@ -1,11 +1,22 @@ import React from "react"; -import PropTypes from "prop-types"; -import { connect } from "react-redux"; -import { selectSubsectionTitleAndPartIDs } from "../../store/selectors"; +import { useSelector } from "react-redux"; +//components import Part from "./Part"; import Text from "./Text"; +//selectors +import { selectSubsectionTitleAndPartIDs } from "../../store/selectors"; +//types +import PropTypes from "prop-types"; + +const Subsection = ({ subsectionId }) => { + const formData = useSelector((state) => state.formData); + + const subsection = selectSubsectionTitleAndPartIDs(formData, subsectionId); + + const partIds = subsection ? subsection.parts : []; + const title = subsection ? subsection.title : null; + const text = subsection ? subsection.text : null; -const Subsection = ({ partIds, subsectionId, title, text }) => { return ( <div id={subsectionId}> {title && <h3 className="h3-pdf-bookmark">{title}</h3>} @@ -26,25 +37,10 @@ const Subsection = ({ partIds, subsectionId, title, text }) => { ); }; Subsection.propTypes = { - partIds: PropTypes.array.isRequired, subsectionId: PropTypes.string.isRequired, - text: PropTypes.oneOf([PropTypes.string, null]), - title: PropTypes.string, }; Subsection.defaultProps = { text: null, }; -const mapStateToProps = (state, ownProps) => { - const subsection = selectSubsectionTitleAndPartIDs( - state, - ownProps.subsectionId - ); - return { - partIds: subsection ? subsection.parts : [], - title: subsection ? subsection.title : null, - text: subsection ? subsection.text : null, - }; -}; - -export default connect(mapStateToProps)(Subsection); +export default Subsection; diff --git a/services/ui-src/src/components/layout/Timeout.jsx b/services/ui-src/src/components/layout/Timeout.jsx index 38f60b036..9f927f9b7 100644 --- a/services/ui-src/src/components/layout/Timeout.jsx +++ b/services/ui-src/src/components/layout/Timeout.jsx @@ -1,24 +1,27 @@ import React, { useEffect, useState } from "react"; -import { connect } from "react-redux"; -import PropTypes from "prop-types"; -import { Dialog } from "@cmsgov/design-system"; +import { useSelector } from "react-redux"; import { useHistory } from "react-router-dom"; +//components +import { Dialog } from "@cmsgov/design-system"; +//auth import { refreshCredentials, updateTimeout, useUser, } from "../../hooks/authHooks"; -import moment from "moment"; const calculateTimeLeft = (expiresAt) => { if (!expiresAt) return 0; - return expiresAt.diff(moment()) / 1000; + return (new Date(expiresAt).valueOf() - Date.now()) / 1000; }; -const Timeout = ({ showTimeout, expiresAt }) => { +const Timeout = () => { + const { showTimeout, expiresAt } = useSelector((state) => state.stateUser); const { logout } = useUser(); - const [timeLeft, setTimeLeft] = useState(calculateTimeLeft(expiresAt)); const history = useHistory(); + + const [timeLeft, setTimeLeft] = useState(calculateTimeLeft(expiresAt)); + useEffect(() => { const unlisten = history.listen(() => { updateTimeout(); @@ -44,7 +47,7 @@ const Timeout = ({ showTimeout, expiresAt }) => { if (!showTimeout) return <></>; - const expired = expiresAt.isBefore(); + const expired = new Date(expiresAt).valueOf() < Date.now(); const body = expired ? "You have been logged out due to inactivity. Please log in again." : `Due to inactivity, you will be logged out in ${Math.floor( @@ -88,14 +91,4 @@ const Timeout = ({ showTimeout, expiresAt }) => { ); }; -Timeout.propTypes = { - showTimeout: PropTypes.bool.isRequired, - expiresAt: PropTypes.any.isRequired, -}; - -const mapState = (state) => ({ - showTimeout: state.stateUser.showTimeout, - expiresAt: state.stateUser.expiresAt, -}); - -export default connect(mapState)(Timeout); +export default Timeout; diff --git a/services/ui-src/src/components/layout/Timeout.test.jsx b/services/ui-src/src/components/layout/Timeout.test.jsx index 697b3a1c1..c2f2204f3 100644 --- a/services/ui-src/src/components/layout/Timeout.test.jsx +++ b/services/ui-src/src/components/layout/Timeout.test.jsx @@ -4,7 +4,7 @@ import configureMockStore from "redux-mock-store"; import { Provider } from "react-redux"; import { screen, render, fireEvent } from "@testing-library/react"; import Timeout from "./Timeout"; -import moment from "moment"; +import { add, sub } from "date-fns"; jest.mock("react-router-dom", () => ({ ...jest.requireActual("react-router-dom"), @@ -17,19 +17,19 @@ const mockStore = configureMockStore(); const store = mockStore({ stateUser: { showTimeout: true, - expiresAt: moment().add(5, "minutes"), + expiresAt: add(Date.now(), { minutes: 5 }), }, }); const expiredStore = mockStore({ stateUser: { showTimeout: true, - expiresAt: moment().subtract(5, "minutes"), + expiresAt: sub(Date.now(), { minutes: 5 }), }, }); const hiddenStore = mockStore({ stateUser: { showTimeout: false, - expiresAt: moment().add(5, "minutes"), + expiresAt: add(Date.now(), { minutes: 5 }), }, }); const timeout = ( diff --git a/services/ui-src/src/components/layout/Title.jsx b/services/ui-src/src/components/layout/Title.jsx index e315f2247..5812673a5 100644 --- a/services/ui-src/src/components/layout/Title.jsx +++ b/services/ui-src/src/components/layout/Title.jsx @@ -1,8 +1,17 @@ import React from "react"; +import { useSelector, shallowEqual } from "react-redux"; +//types import PropTypes from "prop-types"; -import { connect } from "react-redux"; -const Title = ({ name, stateName, formYear, urlStateName }) => { +const Title = ({ urlStateName }) => { + const [name, stateName, formYear] = useSelector( + (state) => [ + state.stateUser.name, + state.global.stateName, + state.global.formYear, + ], + shallowEqual + ); const displayStateName = name || urlStateName || stateName || ""; return ( @@ -14,16 +23,7 @@ const Title = ({ name, stateName, formYear, urlStateName }) => { ); }; Title.propTypes = { - name: PropTypes.string, - stateName: PropTypes.string, urlStateName: PropTypes.string, - formYear: PropTypes.number.isRequired, }; -const mapStateToProps = (state) => ({ - name: state.stateUser.name, - stateName: state.global.stateName, - formYear: state.global.formYear, -}); - -export default connect(mapStateToProps)(Title); +export default Title; diff --git a/services/ui-src/src/hooks/authHooks/authLifecycle.js b/services/ui-src/src/hooks/authHooks/authLifecycle.js index ebce8f5c4..c0ee3b689 100644 --- a/services/ui-src/src/hooks/authHooks/authLifecycle.js +++ b/services/ui-src/src/hooks/authHooks/authLifecycle.js @@ -1,10 +1,10 @@ import { Auth, Hub } from "aws-amplify"; -import moment from "moment"; +import { add } from "date-fns"; import { setAuthTimeout } from "../../store/stateUser"; /* * After the token expires, refresh tokens will be used in the allotted idle window. - * If not retireved, they will bre prompted at the specified time to refresh or logout. + * If not retrieved, they will be prompted at the specified time to refresh or logout. */ const IDLE_WINDOW = 30 * 60 * 1000; // ms const PROMPT_AT = 29 * 60 * 1000; //ms @@ -22,9 +22,10 @@ class AuthManager { updateTimeout = debounce(() => this.setTimer()); constructor(store) { - // Force users with stale tokens > then the timeout to log in for a fresh session - const exp = localStorage.getItem("mdctcarts_session_exp"); - if (exp && moment(exp).isBefore()) { + // Force users with stale tokens greater than the timeout to log in for a fresh session + const expiration = localStorage.getItem("mdctcarts_session_exp"); + const isExpired = expiration && new Date(expiration).valueOf() < Date.now(); + if (isExpired) { localStorage.removeItem("mdctcarts_session_exp"); Auth.signOut().then(() => { window.location.href = "/"; @@ -63,7 +64,7 @@ class AuthManager { * Timer function for idle timeout, keeps track of an idle timer that triggers a forced logout timer if not reset. */ setTimer() { - const expiration = moment().add(IDLE_WINDOW, "milliseconds"); + const expiration = add(Date.now(), { seconds: IDLE_WINDOW / 1000 }); if (this.timeoutPromptId) { clearTimeout(this.timeoutPromptId); clearTimeout(this.timeoutForceId); diff --git a/services/ui-src/src/store/formData.js b/services/ui-src/src/store/formData.js index ff00206cc..b6d86bf5b 100644 --- a/services/ui-src/src/store/formData.js +++ b/services/ui-src/src/store/formData.js @@ -107,8 +107,8 @@ export default (state = initialState, action) => { }; /* Helper functions for getting values from the JSON returned by the API */ -export const selectSectionByOrdinal = (state, ordinal) => { - const section = state.formData.filter( +export const selectSectionByOrdinal = (formData, ordinal) => { + const section = formData.filter( (c) => c.contents.section.ordinal === ordinal ); if (section.length > 0) { @@ -158,22 +158,22 @@ export const extractJsonPathExpressionFromQuestionLike = ( }; export const selectFragmentByJsonPath = ( - state, + formData, expr, sectionOrdinal = false ) => { const sectionNumber = sectionOrdinal || extractSectionOrdinalFromJPExpr(expr); - const section = selectSectionByOrdinal(state, sectionNumber); + const section = selectSectionByOrdinal(formData, sectionNumber); // Note that the following assumes that there's only one matching result. const fragment = jsonpath.query(section, expr)[0]; return fragment; }; -export const selectFragmentById = (state, id) => { +export const selectFragmentById = (formData, id) => { const sectionOrdinal = extractSectionOrdinalFromId(id); const jpexpr = `$..*[?(@ && @.id=='${id}')]`; - return selectFragmentByJsonPath(state, jpexpr, sectionOrdinal); + return selectFragmentByJsonPath(formData, jpexpr, sectionOrdinal); }; /** @@ -199,8 +199,8 @@ export const selectFragmentFromTarget = (target, expr) => { * @param {string} id - The id of what we're looking for, e.g. 2020-01-a-01-01-a-01. * @param {string} jp - JSONPath expression, although if id is not supplied it must be a JSONPath expression with an id lookup in it. */ -export const selectFragment = (state, id = null, jp = null) => { - if (!state.formData || state.formData.length === 0) { +export const selectFragment = (formData, id = null, jp = null) => { + if (!formData || formData.length === 0) { return null; } if (!id && !jp) { @@ -208,7 +208,7 @@ export const selectFragment = (state, id = null, jp = null) => { } const idValue = id ?? jp.split("id=='")[1].split("'")[0]; const sectionOrdinal = extractSectionOrdinalFromId(idValue); - const section = selectSectionByOrdinal(state, sectionOrdinal); + const section = selectSectionByOrdinal(formData, sectionOrdinal); let targetObject = section; const chunks = idValue.split("-").slice(2); // Year is irrelevant so we skip it; same for section since we just got it above. if (chunks.length >= 2) { diff --git a/services/ui-src/src/store/selectors.js b/services/ui-src/src/store/selectors.js index fcd1b9c16..a64834d0c 100644 --- a/services/ui-src/src/store/selectors.js +++ b/services/ui-src/src/store/selectors.js @@ -24,8 +24,8 @@ export const selectSectionTitle = (state, sectionId) => { return null; }; -export const selectSubsectionTitleAndPartIDs = (state, subsectionId) => { - const subsection = selectFragment(state, subsectionId); +export const selectSubsectionTitleAndPartIDs = (formData, subsectionId) => { + const subsection = selectFragment(formData, subsectionId); if (subsection) { return { @@ -37,18 +37,6 @@ export const selectSubsectionTitleAndPartIDs = (state, subsectionId) => { return null; }; -export const selectPartTitle = (state, partId) => { - const part = selectFragment(state, partId); - - if (part) { - return { - text: part.text, - title: part.title, - }; - } - return null; -}; - export const selectQuestion = (state, id) => { const jp = `$..[*].contents.section.subsections[*].parts[*]..questions[?(@ && @.id=='${id}')]`; const questions = jsonpath.query(state, jp); @@ -63,11 +51,29 @@ export const selectQuestion = (state, id) => { * This function is a callback for the filter method in selectQuestionsForPart * @function filterDisplay * @param {object} question - single question from the unfilteredData array in selectQuestionsForPart. - * @param {object} state - the application state + * @param {object} currentUserRole - The role of the current user. Accessed at state.currentUser.role * @returns {boolean} - to be evaluated by the filter method */ -const filterDisplay = (question, state) => { - if (!shouldDisplay(state, question.context_data)) { +const filterDisplay = ( + question, + currentUserRole, + formData, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments +) => { + if ( + !shouldDisplay( + currentUserRole, + formData, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments, + question.context_data + ) + ) { // If context data and a variation of skip text exists if ( question.context_data && @@ -100,7 +106,15 @@ const filterDisplay = (question, state) => { question.questions = question.questions .map((singleQuestion) => { // reassign question.questions to be a filtered version of itself - return filterDisplay(singleQuestion, state); + return filterDisplay( + singleQuestion, + currentUserRole, + formData, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments + ); }) .filter((q) => q !== false); } @@ -108,24 +122,41 @@ const filterDisplay = (question, state) => { }; // Returns an array of questions for the QuestionComponent to map through -export const selectQuestionsForPart = (state, partId) => { +export const selectQuestionsForPart = ( + formData, + currentUserRole, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments, + partId +) => { const jp = `$..[*].contents.section.subsections[*].parts[?(@ && @.id=='${partId}')].questions[*]`; - const unfilteredData = JSON.parse(JSON.stringify(jsonpath.query(state, jp))); + const unfilteredData = JSON.parse( + JSON.stringify(jsonpath.query(formData, jp)) + ); // Filter the array of questions based on conditional logic const filteredQuestions = unfilteredData .map((question) => { - return filterDisplay(question, state); + return filterDisplay( + question, + currentUserRole, + formData, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments + ); }) .filter((q) => q !== false); return filteredQuestions; }; -export const selectSectionsForNav = (state) => { - if (state.formData) { - const sections = state.formData; - return sections.map( +export const selectSectionsForNav = (formData) => { + if (formData) { + return formData.map( ({ contents: { section: { id, ordinal, subsections, title }, diff --git a/services/ui-src/src/styles/_main.scss b/services/ui-src/src/styles/_main.scss index a1f9545e6..4b275d447 100644 --- a/services/ui-src/src/styles/_main.scss +++ b/services/ui-src/src/styles/_main.scss @@ -309,6 +309,9 @@ img { padding: ($padding * 2) ($padding * 5); text-align: center; width: auto; + @media only screen and (min-width: 768px) { + padding-right: 2rem; + } } } diff --git a/services/ui-src/src/styles/_sidebar.scss b/services/ui-src/src/styles/_sidebar.scss index 29d288bb0..b30be3c43 100644 --- a/services/ui-src/src/styles/_sidebar.scss +++ b/services/ui-src/src/styles/_sidebar.scss @@ -5,26 +5,25 @@ .sidebar { margin: ($margin * 3) 0; + .skip-content { margin-bottom: ($margin * 3); } .state-header { margin-bottom: ($margin * 3); position: relative; + display: flex; + flex-flow: row wrap; + align-items: center; } .state-image { - position: absolute; - text-align: center; - top: 50%; - transform: translateY(-50%); width: 70px; } .state-name { font-size: 1.6rem; font-weight: $font-weight-semi-bold; - line-height: 70px; - padding-left: 70px; + overflow-wrap: anywhere; } } diff --git a/services/ui-src/src/util/shouldDisplay.js b/services/ui-src/src/util/shouldDisplay.js index 0e2912916..14c39e493 100644 --- a/services/ui-src/src/util/shouldDisplay.js +++ b/services/ui-src/src/util/shouldDisplay.js @@ -14,8 +14,8 @@ import { * @param {object} hideIfInfo - the hide_if object from a question's context_data * @returns {boolean} - determines if an element should be filtered out, returning true hides a question */ -const hideIf = (state, hideIfInfo) => { - const targetAnswer = jsonpath.query(state, hideIfInfo.target)[0]; // User's selection from associated question +const hideIf = (formData, hideIfInfo) => { + const targetAnswer = jsonpath.query(formData, hideIfInfo.target)[0]; // User's selection from associated question const interactiveValues = hideIfInfo.values.interactive; // Array of values which if selected, should hide a question if (interactiveValues.includes(targetAnswer)) { @@ -27,10 +27,10 @@ const hideIf = (state, hideIfInfo) => { return false; }; -const hideIfAll = (state, hideIfAllInfo) => { +const hideIfAll = (formData, hideIfAllInfo) => { const answers = hideIfAllInfo.values.interactive; return hideIfAllInfo.targets - .map((target) => jsonpath.query(state, target)[0]) + .map((target) => jsonpath.query(formData, target)[0]) .every((answer) => answers.includes(answer)); }; @@ -41,8 +41,8 @@ const hideIfAll = (state, hideIfAllInfo) => { * @param {object} hideIfNotInfo - the hide_if_not object from a question's context_data * @returns {boolean} - determines if an element should be filtered out, returning true hides a question */ -const hideIfNot = (state, hideIfNotInfo) => { - const targetAnswer = jsonpath.query(state, hideIfNotInfo.target)[0]; // Array of user selections from associated question +const hideIfNot = (formData, hideIfNotInfo) => { + const targetAnswer = jsonpath.query(formData, hideIfNotInfo.target)[0]; // Array of user selections from associated question const interactiveValues = hideIfNotInfo.values.interactive; // Array of values which if present in a user's selections, should hide a question const includedBoolean = @@ -53,9 +53,15 @@ const hideIfNot = (state, hideIfNotInfo) => { return includedBoolean; }; -const hideIfTableValue = (state, hideIfTableValueInfo) => { +const hideIfTableValue = ( + formData, + allStatesData, + stateUserAbbr, + chipEnrollments, + hideIfTableValueInfo +) => { // Get table values - const targetValues = jsonpath.query(state, hideIfTableValueInfo.target)[0]; + const targetValues = jsonpath.query(formData, hideIfTableValueInfo.target)[0]; let computedValues = []; // If target needs to be calculated @@ -67,23 +73,16 @@ const hideIfTableValue = (state, hideIfTableValueInfo) => { // get computed value via lookup function and push into a multidimensional array if (item.compareACS) { computedRow.push( - compareACS( - state.allStatesData, - state.stateUser.abbr, - item.compareACS - ) + compareACS(allStatesData, stateUserAbbr, item.compareACS) ); } else if (item.lookupChipEnrollments) { computedRow.push( - lookupChipEnrollments( - state.enrollmentCounts.chipEnrollments, - item.lookupChipEnrollments - ) + lookupChipEnrollments(chipEnrollments, item.lookupChipEnrollments) ); } else if (item.compareChipEnrollements) { computedRow.push( compareChipEnrollements( - state.enrollmentCounts.chipEnrollments, + chipEnrollments, item.compareChipEnrollements ) ); @@ -181,11 +180,11 @@ const hideIfTableValue = (state, hideIfTableValueInfo) => { const PROGRAM_TYPE_QUESTION_ID = "-00-a-01-02"; -const getProgramTypeFromForm = (state) => { +const getProgramTypeFromForm = (formData, reportStatus) => { // attempt to find programType from same year as form - const formYear = state.formData[0].year; + const formYear = formData[0].year; const currentYearProgramType = selectFragmentById( - state, + formData, `${formYear}${PROGRAM_TYPE_QUESTION_ID}` )?.answer?.entry; if (currentYearProgramType) { @@ -195,11 +194,11 @@ const getProgramTypeFromForm = (state) => { // attempt to find programType from the previous year's form, otherwise retrieve from status const previousYear = parseInt(formYear) - 1; const previousYearProgramType = selectFragmentById( - state, + formData, `${previousYear}${PROGRAM_TYPE_QUESTION_ID}` )?.answer?.entry; - const reportStatusCode = state.formData[0].stateId + state.formData[0].year; - const programFromStatus = state.reportStatus[reportStatusCode].programType; + const reportStatusCode = formData[0].stateId + formData[0].year; + const programFromStatus = reportStatus[reportStatusCode].programType; return previousYearProgramType || programFromStatus; }; @@ -210,8 +209,16 @@ const getProgramTypeFromForm = (state) => { * @param {object} context - the context_data from a question * @returns {boolean} - determines if an element should be filtered out, returning true means a question will display */ -const shouldDisplay = (state, context) => { - if (state.stateUser.currentUser.role === AppRoles.CMS_ADMIN) return true; +const shouldDisplay = ( + currentUserRole, + formData, + reportStatus, + allStatesData, + stateUserAbbr, + chipEnrollments, + context +) => { + if (currentUserRole === AppRoles.CMS_ADMIN) return true; if ( !context || @@ -225,7 +232,7 @@ const shouldDisplay = (state, context) => { * displaying relies on that answer being included in the show_if_state_program_type_in array */ if (context.show_if_state_program_type_in) { - const program = getProgramTypeFromForm(state); + const program = getProgramTypeFromForm(formData, reportStatus); return context.show_if_state_program_type_in.includes(program); } @@ -234,12 +241,12 @@ const shouldDisplay = (state, context) => { * displaying relies on that answer being incldued in the hide_if.values.interactive array */ if (context.conditional_display.hide_if) { - return !hideIf(state, context.conditional_display.hide_if); + return !hideIf(formData, context.conditional_display.hide_if); } // hide_if_all, there is an array of targets (questions) that another question's display relies on if (context.conditional_display.hide_if_all) { - return !hideIfAll(state, context.conditional_display.hide_if_all); + return !hideIfAll(formData, context.conditional_display.hide_if_all); } /* @@ -247,7 +254,7 @@ const shouldDisplay = (state, context) => { * displaying relies on that array of answers including any of the values from the hide_if_not.values.interactive array */ if (context.conditional_display.hide_if_not) { - return !hideIfNot(state, context.conditional_display.hide_if_not); + return !hideIfNot(formData, context.conditional_display.hide_if_not); } /* @@ -256,7 +263,10 @@ const shouldDisplay = (state, context) => { */ if (context.conditional_display.hide_if_table_value) { return hideIfTableValue( - state, + formData, + allStatesData, + stateUserAbbr, + chipEnrollments, context.conditional_display.hide_if_table_value ); } diff --git a/services/ui-src/src/util/shouldDisplay.test.js b/services/ui-src/src/util/shouldDisplay.test.js index b3ccfd317..de48fe230 100644 --- a/services/ui-src/src/util/shouldDisplay.test.js +++ b/services/ui-src/src/util/shouldDisplay.test.js @@ -88,7 +88,15 @@ describe("shouldDisplay", () => { conditional_display: null, show_if_state_program_type_in: ["a different program"], }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(false); }); @@ -115,7 +123,15 @@ describe("shouldDisplay", () => { conditional_display: null, show_if_state_program_type_in: ["test program"], }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(true); }); @@ -143,7 +159,15 @@ describe("shouldDisplay", () => { conditional_display: null, show_if_state_program_type_in: ["test program"], }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(true); expect(selectFragmentById).toHaveBeenCalledTimes(1); }); @@ -172,7 +196,15 @@ describe("shouldDisplay", () => { conditional_display: null, show_if_state_program_type_in: ["test program"], }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(true); expect(selectFragmentById).toHaveBeenCalledTimes(1); }); @@ -202,7 +234,15 @@ describe("shouldDisplay", () => { conditional_display: null, show_if_state_program_type_in: ["test program"], }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(true); expect(selectFragmentById).toHaveBeenCalledTimes(2); }); @@ -214,8 +254,10 @@ describe("shouldDisplay", () => { role: "test role", }, }, - foo: { - bar: "baz", + formData: { + foo: { + bar: "baz", + }, }, }; const context = { @@ -228,7 +270,15 @@ describe("shouldDisplay", () => { }, }, }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + null, + null, + null, + null, + context + ); expect(result).toBe(false); }); @@ -239,8 +289,10 @@ describe("shouldDisplay", () => { role: "test role", }, }, - foo: { - bar: "quux", + formData: { + foo: { + bar: "quux", + }, }, }; const context = { @@ -253,7 +305,15 @@ describe("shouldDisplay", () => { }, }, }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(true); }); @@ -264,11 +324,13 @@ describe("shouldDisplay", () => { role: "test role", }, }, - foo: { - // All of these are in values.interactive - bar: "baz", - bbr: "bbz", - bcr: "baz", + formData: { + foo: { + // All of these are in values.interactive + bar: "baz", + bbr: "bbz", + bcr: "baz", + }, }, }; const context = { @@ -281,7 +343,15 @@ describe("shouldDisplay", () => { }, }, }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(false); }); @@ -292,11 +362,13 @@ describe("shouldDisplay", () => { role: "test role", }, }, - foo: { - // One of these is not in values.interactive - bar: "baz", - bbr: "bbz", - bcr: "quux", + formData: { + foo: { + // One of these is not in values.interactive + bar: "baz", + bbr: "bbz", + bcr: "quux", + }, }, }; const context = { @@ -309,7 +381,15 @@ describe("shouldDisplay", () => { }, }, }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(true); }); @@ -320,9 +400,11 @@ describe("shouldDisplay", () => { role: "test role", }, }, - foo: { - // At least one of these is in values.interactive - bar: ["baz", "quux"], + formData: { + foo: { + // At least one of these is in values.interactive + bar: ["baz", "quux"], + }, }, }; const context = { @@ -335,7 +417,15 @@ describe("shouldDisplay", () => { }, }, }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(true); }); @@ -346,9 +436,11 @@ describe("shouldDisplay", () => { role: "test role", }, }, - foo: { - // None of these are in values.interactive - bar: ["corge", "quux"], + formData: { + foo: { + // None of these are in values.interactive + bar: ["corge", "quux"], + }, }, }; const context = { @@ -361,7 +453,15 @@ describe("shouldDisplay", () => { }, }, }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + state.formData, + state.reportStatus, + null, + null, + null, + context + ); expect(result).toBe(false); }); @@ -376,7 +476,15 @@ describe("shouldDisplay", () => { const context = { conditional_display: {}, }; - const result = shouldDisplay(state, context); + const result = shouldDisplay( + state.stateUser.currentUser.role, + null, + null, + null, + null, + null, + context + ); expect(result).toBe(true); }); }); diff --git a/services/ui-src/yarn.lock b/services/ui-src/yarn.lock index be4111350..38b7929fb 100644 --- a/services/ui-src/yarn.lock +++ b/services/ui-src/yarn.lock @@ -5842,6 +5842,11 @@ date-fns@^2.28.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.1.tgz#9667c2615525e552b5135a3116b95b1961456e60" integrity sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw== +date-fns@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" + integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== + debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -8770,11 +8775,6 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -moment@^2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - moo@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" diff --git a/services/uploads/serverless.yml b/services/uploads/serverless.yml index 074a35739..f08d11186 100644 --- a/services/uploads/serverless.yml +++ b/services/uploads/serverless.yml @@ -46,7 +46,6 @@ custom: serverlessTerminationProtection: stages: - main - - master - val - production scripts: diff --git a/yarn.lock b/yarn.lock index db382a571..d1296e2f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,6 +47,15 @@ "@aws-sdk/types" "^3.222.0" tslib "^1.11.1" +"@aws-crypto/crc32@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + "@aws-crypto/crc32c@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz#016c92da559ef638a84a245eecb75c3e97cb664f" @@ -56,6 +65,15 @@ "@aws-sdk/types" "^3.222.0" tslib "^1.11.1" +"@aws-crypto/crc32c@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e" + integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + "@aws-crypto/ie11-detection@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" @@ -76,6 +94,18 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/sha1-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4" + integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== + dependencies: + "@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" + "@aws-crypto/sha256-browser@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" @@ -90,6 +120,19 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + 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" + "@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" @@ -99,6 +142,15 @@ "@aws-sdk/types" "^3.222.0" tslib "^1.11.1" +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + "@aws-crypto/supports-web-crypto@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" @@ -106,6 +158,13 @@ dependencies: tslib "^1.11.1" +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== + dependencies: + tslib "^2.6.2" + "@aws-crypto/util@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" @@ -115,6 +174,64 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" +"@aws-crypto/util@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-api-gateway@^3.588.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-api-gateway/-/client-api-gateway-3.624.0.tgz#3d65ddb227b4c8b1a432ed297f1a1be2186ef969" + integrity sha512-9DeJihU48KVVYlymg9/pfgiLNQ4Kiss5Ei2Ph9SUxZwGBw7uKZwHnE8dfBoGGq1KwDo+hEtQSd+/i/K6p/GwYQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.624.0" + "@aws-sdk/client-sts" "3.624.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/credential-provider-node" "3.624.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-sdk-api-gateway" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-stream" "^3.1.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-cloudformation@^3.128.0": version "3.576.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudformation/-/client-cloudformation-3.576.0.tgz#aac4b796d5998d722cded31a755731b4aec636a4" @@ -261,6 +378,149 @@ tslib "^2.6.2" uuid "^9.0.1" +"@aws-sdk/client-cognito-identity-provider@^3.588.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.624.0.tgz#2113f44296454ec1f10f3fcea6fe43a596a7828d" + integrity sha512-AKzSCARzVUqclaXxxRE7UXZAhF+HoJGbAdYvQxj9LJdejuBRCo49LUqmiCTr7pUEPDK/RkDtv3+JLhxqN4z8YA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.624.0" + "@aws-sdk/client-sts" "3.624.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/credential-provider-node" "3.624.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-eventbridge@^3.588.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-eventbridge/-/client-eventbridge-3.624.0.tgz#aadd03846b7881e49da6b7c105c8f002669948e8" + integrity sha512-02HxeImNQv+yA+36Y+gn5ZM2v3JhG9gbbtXokv1YoByh9Ot9WG5Xm5Fsj9i6Dno34LneA2HCQqdMws67woXxVg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.624.0" + "@aws-sdk/client-sts" "3.624.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/credential-provider-node" "3.624.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/signature-v4-multi-region" "3.624.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-iam@^3.588.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.624.0.tgz#89c57b70a15c44a007483088d7f6f20844800cb8" + integrity sha512-a3Qy7AIht2nHiZPJ/HiMdyiOLiDN+iKp1R916SEbgFi9MiOyRHFeLCCPQHMf1O8YXfb0hbHr5IFnfZLfUcJaWQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.624.0" + "@aws-sdk/client-sts" "3.624.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/credential-provider-node" "3.624.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + "@aws-sdk/client-lambda@^3.509.0": version "3.569.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.569.0.tgz#b95b6c5186c87ce53b3de2607faebdad1031eddc" @@ -313,6 +573,58 @@ "@smithy/util-waiter" "^2.2.0" tslib "^2.6.2" +"@aws-sdk/client-lambda@^3.588.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.624.0.tgz#9d674bc061ba9ca5057426ae6940f5fbb1f73c6b" + integrity sha512-bfhFeg6LoC6AFM68+Gyogq9UpyW83Jwkwobo9CtxSTfaNIOYdKgTOdYtn4pM/bRYrWon4CstJQymIsPbY7ra5Q== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.624.0" + "@aws-sdk/client-sts" "3.624.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/credential-provider-node" "3.624.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/eventstream-serde-browser" "^3.0.5" + "@smithy/eventstream-serde-config-resolver" "^3.0.3" + "@smithy/eventstream-serde-node" "^3.0.4" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-stream" "^3.1.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + "@aws-sdk/client-s3@^3.128.0": version "3.576.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.576.0.tgz#0e2f8f8fdbf1548ed2bd7d782f8fdf2e90131de1" @@ -441,6 +753,70 @@ "@smithy/util-waiter" "^2.2.0" tslib "^2.6.2" +"@aws-sdk/client-s3@^3.588.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.624.0.tgz#4114c3cb4bf820e0aa480d3783c3cd2ae2575737" + integrity sha512-A18tgTKC4ZTAwV8i3pkyAL1XDLgH7WGS5hZA/0FOntI5l+icztGZFF8CdeYWEAFnZA7SfHK6vmtEbIQDOzTTAA== + dependencies: + "@aws-crypto/sha1-browser" "5.2.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.624.0" + "@aws-sdk/client-sts" "3.624.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/credential-provider-node" "3.624.0" + "@aws-sdk/middleware-bucket-endpoint" "3.620.0" + "@aws-sdk/middleware-expect-continue" "3.620.0" + "@aws-sdk/middleware-flexible-checksums" "3.620.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-location-constraint" "3.609.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-sdk-s3" "3.624.0" + "@aws-sdk/middleware-ssec" "3.609.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/signature-v4-multi-region" "3.624.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@aws-sdk/xml-builder" "3.609.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/eventstream-serde-browser" "^3.0.5" + "@smithy/eventstream-serde-config-resolver" "^3.0.3" + "@smithy/eventstream-serde-node" "^3.0.4" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-blob-browser" "^3.1.2" + "@smithy/hash-node" "^3.0.3" + "@smithy/hash-stream-node" "^3.1.2" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/md5-js" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-stream" "^3.1.3" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.1.2" + tslib "^2.6.2" + "@aws-sdk/client-sso-oidc@3.554.0": version "3.554.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.554.0.tgz#c4002879c89cf5e4a45f39c63b2963f8fab88385" @@ -624,6 +1000,51 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/client-sso-oidc@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.624.0.tgz#33d0927519de333387ee07cb7f6483b0bd4db2f2" + integrity sha512-Ki2uKYJKKtfHxxZsiMTOvJoVRP6b2pZ1u3rcUb2m/nVgBPUfLdl8ZkGpqE29I+t5/QaS/sEdbn6cgMUZwl+3Dg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/credential-provider-node" "3.624.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-sso@3.554.0": version "3.554.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.554.0.tgz#fef7b7ee47cad3987b50e9218ec1d11dcd42e32b" @@ -800,6 +1221,50 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/client-sso@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.624.0.tgz#5d6bd308c1a6bb876c0bffc369c31a4916271219" + integrity sha512-EX6EF+rJzMPC5dcdsu40xSi2To7GSvdGQNIpe97pD9WvZwM9tRNQnNM4T6HA4gjV1L6Jwk8rBlG/CnveXtLEMw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/client-sts@3.554.0", "@aws-sdk/client-sts@^3.410.0": version "3.554.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.554.0.tgz#511f1bafe628613f1824274f9c11a9df31ac0b09" @@ -982,6 +1447,52 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/client-sts@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.624.0.tgz#ee19e08835a04d173f4997285e26558ac431d938" + integrity sha512-k36fLZCb2nfoV/DKK3jbRgO/Yf7/R80pgYfMiotkGjnZwDmRvNN08z4l06L9C+CieazzkgRxNUzyppsYcYsQaw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.624.0" + "@aws-sdk/core" "3.624.0" + "@aws-sdk/credential-provider-node" "3.624.0" + "@aws-sdk/middleware-host-header" "3.620.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.620.0" + "@aws-sdk/middleware-user-agent" "3.620.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.3.2" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.5" + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.14" + "@smithy/util-defaults-mode-node" "^3.0.14" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/core@3.554.0": version "3.554.0" resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.554.0.tgz#84def70777ace823efb54451da403bfc125a8571" @@ -1034,6 +1545,21 @@ fast-xml-parser "4.2.5" tslib "^2.6.2" +"@aws-sdk/core@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.624.0.tgz#ff0d7745bd662f53d99dbb7293416a45ddde5aa6" + integrity sha512-WyFmPbhRIvtWi7hBp8uSFy+iPpj8ccNV/eX86hwF4irMjfc/FtsGVIAeBXxXM/vGCjkdfEzOnl+tJ2XACD4OXg== + dependencies: + "@smithy/core" "^2.3.2" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/signature-v4" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-env@3.535.0": version "3.535.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.535.0.tgz#26248e263a8107953d5496cb3760d4e7c877abcf" @@ -1064,6 +1590,16 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-env@3.620.1": + version "3.620.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz#d4692c49a65ebc11dae3f7f8b053fee9268a953c" + 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" + "@aws-sdk/credential-provider-http@3.552.0": version "3.552.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.552.0.tgz#ecc88d02cba95621887e6b85b2583e756ad29eb6" @@ -1109,6 +1645,21 @@ "@smithy/util-stream" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-http@3.622.0": + version "3.622.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz#db481fdef859849d07dd5870894f45df2debab3d" + integrity sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/fetch-http-handler" "^3.2.4" + "@smithy/node-http-handler" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/util-stream" "^3.1.3" + tslib "^2.6.2" + "@aws-sdk/credential-provider-imds@^3.81.0": version "3.374.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.374.0.tgz#19f1d6625b2b91114f3d5c2a479b86a4114620a6" @@ -1182,6 +1733,23 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-ini@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.624.0.tgz#af4b485e9ceeca97e1681b2402c50dc192c1dc06" + integrity sha512-mMoNIy7MO2WTBbdqMyLpbt6SZpthE6e0GkRYpsd0yozPt0RZopcBhEh+HG1U9Y1PVODo+jcMk353vAi61CfnhQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.620.1" + "@aws-sdk/credential-provider-http" "3.622.0" + "@aws-sdk/credential-provider-process" "3.620.1" + "@aws-sdk/credential-provider-sso" "3.624.0" + "@aws-sdk/credential-provider-web-identity" "3.621.0" + "@aws-sdk/types" "3.609.0" + "@smithy/credential-provider-imds" "^3.2.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-node@3.554.0": version "3.554.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.554.0.tgz#74e8ae0b69cfba716e57881ace9d6466deedfb5e" @@ -1254,6 +1822,24 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-node@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz#d7ebe191194eb09764b313c1f4e259cb42795079" + integrity sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw== + dependencies: + "@aws-sdk/credential-provider-env" "3.620.1" + "@aws-sdk/credential-provider-http" "3.622.0" + "@aws-sdk/credential-provider-ini" "3.624.0" + "@aws-sdk/credential-provider-process" "3.620.1" + "@aws-sdk/credential-provider-sso" "3.624.0" + "@aws-sdk/credential-provider-web-identity" "3.621.0" + "@aws-sdk/types" "3.609.0" + "@smithy/credential-provider-imds" "^3.2.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-process@3.535.0": version "3.535.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.535.0.tgz#ea1e8a38a32e36bbdc3f75eb03352e6eafa0c659" @@ -1298,6 +1884,17 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-process@3.620.1": + version "3.620.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz#10387cf85400420bb4bbda9cc56937dcc6d6d0ee" + 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" + "@aws-sdk/credential-provider-sso@3.554.0": version "3.554.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.554.0.tgz#83e950685aaadb18d48d51c39f6201d820a5de41" @@ -1350,6 +1947,19 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-sso@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.624.0.tgz#4a617577d04b23f80e86e1f76cc15dc3e9895c21" + integrity sha512-A02bayIjU9APEPKr3HudrFHEx0WfghoSPsPopckDkW7VBqO4wizzcxr75Q9A3vNX+cwg0wCN6UitTNe6pVlRaQ== + dependencies: + "@aws-sdk/client-sso" "3.624.0" + "@aws-sdk/token-providers" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/credential-provider-web-identity@3.554.0": version "3.554.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.554.0.tgz#6076a32066b633a18fc90cae7ed0b874db78a556" @@ -1381,6 +1991,16 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/credential-provider-web-identity@3.621.0": + version "3.621.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz#b25878c0a05dad60cd5f91e7e5a31a145c2f14be" + 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" + "@aws-sdk/middleware-bucket-endpoint@3.568.0": version "3.568.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.568.0.tgz#790c0943cc097d3a83665131bc9e0743598cc6ca" @@ -1407,6 +2027,19 @@ "@smithy/util-config-provider" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-bucket-endpoint@3.620.0": + version "3.620.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.620.0.tgz#c5dc0e98b6209a91479cad6c2c74fbc5a3429fab" + integrity sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-arn-parser" "3.568.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + "@smithy/util-config-provider" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/middleware-expect-continue@3.572.0": version "3.572.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.572.0.tgz#91df3b88a0a109450db84577609ed19520dfff38" @@ -1427,6 +2060,16 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-expect-continue@3.620.0": + version "3.620.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.620.0.tgz#6a362c0f0696dc6749108a33de9998e0fa6b50ec" + integrity sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-flexible-checksums@3.572.0": version "3.572.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.572.0.tgz#639ee54f838a5382a69f07351cd783488b6ad89b" @@ -1455,6 +2098,20 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-flexible-checksums@3.620.0": + version "3.620.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.620.0.tgz#42cd48cdc0ad9639545be000bf537969210ce8c5" + integrity sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@aws-crypto/crc32c" "5.2.0" + "@aws-sdk/types" "3.609.0" + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/middleware-host-header@3.535.0": version "3.535.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.535.0.tgz#d5264f813592f5e77df25e5a14bbb0e6441812db" @@ -1485,6 +2142,16 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-host-header@3.620.0": + version "3.620.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz#b561d419a08a984ba364c193376b482ff5224d74" + 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" + "@aws-sdk/middleware-location-constraint@3.567.0": version "3.567.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.567.0.tgz#c469e745a3fa146dd29d0024a9f4d2a498985822" @@ -1503,6 +2170,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-location-constraint@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz#7ed82d71e5ddcd50683ef2bbde10d1cc2492057e" + integrity sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-logger@3.535.0": version "3.535.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.535.0.tgz#1a8ffd6c368edd6cb32e1edf7b1dced95c1820ee" @@ -1530,6 +2206,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-logger@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz#ed44d201f091b8bac908cbf14724c7a4d492553f" + integrity sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-recursion-detection@3.535.0": version "3.535.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.535.0.tgz#6aa1e1bd1e84730d58a73021b745e20d4341a92d" @@ -1560,6 +2245,26 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-recursion-detection@3.620.0": + version "3.620.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz#f8270dfff843fd756be971e5673f89c6a24c6513" + 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" + +"@aws-sdk/middleware-sdk-api-gateway@3.620.0": + version "3.620.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-api-gateway/-/middleware-sdk-api-gateway-3.620.0.tgz#479e839455bcfa22952a1080d5598061a1f1f0e3" + integrity sha512-JH8JzZb5CTry5Xit51jwyES8cqihaUWJVS3pcr5L73g8qLDUnvfg2IJJJ7pXs0hVAaCNjDs4L97DW3ity76CUA== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-sdk-s3@3.572.0": version "3.572.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.572.0.tgz#62534ecbfc55d91fcb768b97bb14f73577c3b00e" @@ -1590,6 +2295,26 @@ "@smithy/util-config-provider" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-sdk-s3@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.624.0.tgz#770cbc3f91b99ed70de6f7b9552917de99ee7e78" + integrity sha512-HUiaZ6+JXcG0qQda10ZxDGJvbT71YUp1zX+oikIsfTUeq0N75O82OY3Noqd7cyjEVtsGSo/y0e6U3aV1hO+wPw== + dependencies: + "@aws-sdk/core" "3.624.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-arn-parser" "3.568.0" + "@smithy/core" "^2.3.2" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/signature-v4" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-stream" "^3.1.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@aws-sdk/middleware-signing@3.572.0": version "3.572.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.572.0.tgz#d3c648e3a280774115003d7ea07860f80f79a19d" @@ -1634,6 +2359,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-ssec@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz#b87a8bc6133f3f6bdc6801183d0f9dad3f93cf9f" + integrity sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/middleware-user-agent@3.540.0": version "3.540.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.540.0.tgz#4981c64c1eeb6b5c453bce02d060b8c71d44994d" @@ -1678,6 +2412,17 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/middleware-user-agent@3.620.0": + version "3.620.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz#1fe3104f04f576a942cf0469bfbd73c38eef3d9e" + integrity sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A== + dependencies: + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/property-provider@^3.78.0": version "3.374.0" resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.374.0.tgz#ba302bfd9cdd4751efdb50ef60e7ee3cbd09c62a" @@ -1734,6 +2479,18 @@ "@smithy/util-middleware" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/region-config-resolver@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz#9cebb31a5bcfea2a41891fff7f28d0164cde179a" + 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" + "@aws-sdk/shared-ini-file-loader@^3.80.0": version "3.374.0" resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.374.0.tgz#dc992051b59169a33cf1acef2d268b7c8e3470f5" @@ -1766,6 +2523,18 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/signature-v4-multi-region@3.624.0": + version "3.624.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.624.0.tgz#86829acc07871758a592dd50812ca4d370f641ed" + integrity sha512-gu1SfCyUPnq4s0AI1xdAl0whHwhkTyltg4QZWc4vnZvEVudCpJVVxEcroUHYQIO51YyVUT9jSMS1SVRe5VqPEw== + dependencies: + "@aws-sdk/middleware-sdk-s3" "3.624.0" + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.1.0" + "@smithy/signature-v4" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/token-providers@3.554.0": version "3.554.0" resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.554.0.tgz#5a20ce273451654a1382f772ef119a9a156f537c" @@ -1811,6 +2580,17 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/token-providers@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz#88da04f6d4ce916b0b0f6e045676d04201fb47fd" + 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" + "@aws-sdk/types@3.535.0", "@aws-sdk/types@^3.222.0": version "3.535.0" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.535.0.tgz#5e6479f31299dd9df170e63f4d10fe739008cf04" @@ -1835,6 +2615,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/types@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.609.0.tgz#06b39d799c9f197a7b43670243e8e78a3bf7d6a5" + integrity sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@aws-sdk/util-arn-parser@3.568.0": version "3.568.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz#6a19a8c6bbaa520b6be1c278b2b8c17875b91527" @@ -1882,6 +2670,16 @@ "@smithy/util-endpoints" "^2.0.0" tslib "^2.6.2" +"@aws-sdk/util-endpoints@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz#6564b0ffd7dc3728221e9f9821f5aab1cc58468e" + integrity sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + "@smithy/util-endpoints" "^2.0.5" + tslib "^2.6.2" + "@aws-sdk/util-locate-window@^3.0.0": version "3.535.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.535.0.tgz#0200a336fddd47dd6567ce15d01f62be50a315d7" @@ -1919,6 +2717,16 @@ bowser "^2.11.0" tslib "^2.6.2" +"@aws-sdk/util-user-agent-browser@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz#aa15421b2e32ae8bc589dac2bd6e8969832ce588" + 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" + "@aws-sdk/util-user-agent-node@3.535.0": version "3.535.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.535.0.tgz#f5c26fb6f3f561d3cf35f96f303b1775afad0a5b" @@ -1949,6 +2757,16 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/util-user-agent-node@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz#1e3f49a80f841a3f21647baed2adce01aac5beb5" + 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" + "@aws-sdk/util-utf8-browser@^3.0.0": version "3.259.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" @@ -1972,6 +2790,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@aws-sdk/xml-builder@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz#eeb3d5cde000a23cfeeefe0354b6193440dc7d87" + integrity sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -3880,6 +4706,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/abort-controller@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.1.tgz#291210611ff6afecfc198d0ca72d5771d8461d16" + integrity sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/chunked-blob-reader-native@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.2.0.tgz#aff8bddf9fdc1052f885e1b15aa81e4d274e541e" @@ -3932,6 +4766,17 @@ "@smithy/util-middleware" "^3.0.0" tslib "^2.6.2" +"@smithy/config-resolver@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.5.tgz#727978bba7ace754c741c259486a19d3083431fd" + 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" + "@smithy/core@^1.4.2": version "1.4.2" resolved "https://registry.yarnpkg.com/@smithy/core/-/core-1.4.2.tgz#1c3ed886d403041ce5bd2d816448420c57baa19c" @@ -3960,6 +4805,20 @@ "@smithy/util-middleware" "^3.0.0" tslib "^2.6.2" +"@smithy/core@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.3.2.tgz#4a1e3da41d2a3a494cbc6bd1fc6eeb26b2e27184" + integrity sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q== + dependencies: + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-retry" "^3.0.14" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/protocol-http" "^4.1.0" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" + tslib "^2.6.2" + "@smithy/credential-provider-imds@^1.0.1": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-1.1.0.tgz#4d9444c4c8de70143c3f16bdba188b0e42cb48f9" @@ -3993,6 +4852,17 @@ "@smithy/url-parser" "^3.0.0" tslib "^2.6.2" +"@smithy/credential-provider-imds@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz#0e0e7ddaff1a8633cb927aee1056c0ab506b7ecf" + 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" + "@smithy/eventstream-codec@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz#63d74fa817188995eb55e792a38060b0ede98dc4" @@ -4013,6 +4883,16 @@ "@smithy/util-hex-encoding" "^3.0.0" tslib "^2.6.2" +"@smithy/eventstream-codec@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz#4a1c72b34400631b829241151984a1ad8c4f963c" + integrity sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^3.3.0" + "@smithy/util-hex-encoding" "^3.0.0" + tslib "^2.6.2" + "@smithy/eventstream-serde-browser@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.2.0.tgz#69c93cc0210f04caeb0770856ef88c9a82564e11" @@ -4031,6 +4911,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/eventstream-serde-browser@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.5.tgz#3e971afd2b8a02a098af8decc4b9e3f35296d6a2" + integrity sha512-dEyiUYL/ekDfk+2Ra4GxV+xNnFoCmk1nuIXg+fMChFTrM2uI/1r9AdiTYzPqgb72yIv/NtAj6C3dG//1wwgakQ== + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/eventstream-serde-config-resolver@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.2.0.tgz#23c8698ce594a128bcc556153efb7fecf6d04f87" @@ -4047,6 +4936,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/eventstream-serde-config-resolver@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz#f852e096d0ad112363b4685e1d441088d1fce67a" + integrity sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/eventstream-serde-node@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz#b82870a838b1bd32ad6e0cf33a520191a325508e" @@ -4065,6 +4962,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/eventstream-serde-node@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.4.tgz#6301752ca51b3ebabcd2dec112f1dacd990de4c1" + integrity sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg== + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/eventstream-serde-universal@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz#a75e330040d5e2ca2ac0d8bccde3e390ac5afd38" @@ -4083,6 +4989,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/eventstream-serde-universal@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.4.tgz#6754de5b94bdc286d8ef1d6bcf22d80f6ab68f30" + integrity sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A== + dependencies: + "@smithy/eventstream-codec" "^3.1.2" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/fetch-http-handler@^2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz#0b8e1562807fdf91fe7dd5cde620d7a03ddc10ac" @@ -4105,6 +5020,17 @@ "@smithy/util-base64" "^3.0.0" tslib "^2.6.2" +"@smithy/fetch-http-handler@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz#c754de7e0ff2541b73ac9ba7cc955940114b3d62" + 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" + "@smithy/hash-blob-browser@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-2.2.0.tgz#d26db0e88b8fc4b59ee487bd026363ea9b48cf3a" @@ -4125,6 +5051,16 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/hash-blob-browser@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz#90281c1f183d93686fb4f26107f1819644d68829" + integrity sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg== + dependencies: + "@smithy/chunked-blob-reader" "^3.0.0" + "@smithy/chunked-blob-reader-native" "^3.0.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/hash-node@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-2.2.0.tgz#df29e1e64811be905cb3577703b0e2d0b07fc5cc" @@ -4145,6 +5081,16 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@smithy/hash-node@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.3.tgz#82c5cb7b0f1a29ee7319081853d2d158c07dff24" + 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" + "@smithy/hash-stream-node@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-2.2.0.tgz#7b341fdc89851af6b98d8c01e47185caf0a4b2d9" @@ -4163,6 +5109,15 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@smithy/hash-stream-node@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz#89f0290ae44b113863878e75b10c484ff48af71c" + integrity sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g== + dependencies: + "@smithy/types" "^3.3.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@smithy/invalid-dependency@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz#ee3d8980022cb5edb514ac187d159b3e773640f0" @@ -4179,6 +5134,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/invalid-dependency@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz#8d9fd70e3a94b565a4eba4ffbdc95238e1930528" + integrity sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/is-array-buffer@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" @@ -4211,6 +5174,15 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@smithy/md5-js@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-3.0.3.tgz#55ee40aa24075b096c39f7910590c18ff7660c98" + integrity sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q== + dependencies: + "@smithy/types" "^3.3.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@smithy/middleware-content-length@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz#a82e97bd83d8deab69e07fea4512563bedb9461a" @@ -4229,6 +5201,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/middleware-content-length@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz#1680aa4fb2a1c0505756103c9a5c2916307d9035" + integrity sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw== + dependencies: + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/middleware-endpoint@^2.5.1": version "2.5.1" resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.1.tgz#1333c58304aff4d843e8ef4b85c8cb88975dd5ad" @@ -4255,6 +5236,19 @@ "@smithy/util-middleware" "^3.0.0" tslib "^2.6.2" +"@smithy/middleware-endpoint@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz#9b8a496d87a68ec43f3f1a0139868d6765a88119" + 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" + "@smithy/middleware-retry@^2.3.1": version "2.3.1" resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.3.1.tgz#d6fdce94f2f826642c01b4448e97a509c4556ede" @@ -4285,6 +5279,21 @@ tslib "^2.6.2" uuid "^9.0.1" +"@smithy/middleware-retry@^3.0.14": + version "3.0.14" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz#739e8bac6e465e0cda26446999db614418e79da3" + integrity sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/protocol-http" "^4.1.0" + "@smithy/service-error-classification" "^3.0.3" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + tslib "^2.6.2" + uuid "^9.0.1" + "@smithy/middleware-serde@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz#a7615ba646a88b6f695f2d55de13d8158181dd13" @@ -4301,6 +5310,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/middleware-serde@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz#74d974460f74d99f38c861e6862984543a880a66" + integrity sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/middleware-stack@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz#3fb49eae6313f16f6f30fdaf28e11a7321f34d9f" @@ -4317,6 +5334,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/middleware-stack@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz#91845c7e61e6f137fa912b623b6def719a4f6ce7" + integrity sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/node-config-provider@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-1.1.0.tgz#86c64e4ef6a557863422a236ba10aa7ed51ad85d" @@ -4347,6 +5372,16 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/node-config-provider@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz#05647bed666aa8036a1ad72323c1942e5d421be1" + 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" + "@smithy/node-http-handler@^2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz#7b5e0565dd23d340380489bd5fe4316d2bed32de" @@ -4369,6 +5404,17 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/node-http-handler@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz#be4195e45639e690d522cd5f11513ea822ff9d5f" + 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" + "@smithy/property-provider@^1.0.1", "@smithy/property-provider@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-1.2.0.tgz#2e4ca34b0994ec6de734316c0093e671a1bfa5c7" @@ -4393,6 +5439,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/property-provider@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.3.tgz#afd57ea82a3f6c79fbda95e3cb85c0ee0a79f39a" + integrity sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/protocol-http@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-3.3.0.tgz#a37df7b4bb4960cdda560ce49acfd64c455e4090" @@ -4409,6 +5463,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/protocol-http@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.0.tgz#23519d8f45bf4f33960ea5415847bc2b620a010b" + integrity sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/querystring-builder@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz#22937e19fcd0aaa1a3e614ef8cb6f8e86756a4ef" @@ -4427,6 +5489,15 @@ "@smithy/util-uri-escape" "^3.0.0" tslib "^2.6.2" +"@smithy/querystring-builder@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz#6b0e566f885bb84938d077c69e8f8555f686af13" + integrity sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw== + dependencies: + "@smithy/types" "^3.3.0" + "@smithy/util-uri-escape" "^3.0.0" + tslib "^2.6.2" + "@smithy/querystring-parser@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-1.1.0.tgz#4bf4be6d1db8b769d346a0d98c5b0db4e99a8ba6" @@ -4451,6 +5522,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/querystring-parser@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz#272a6b83f88dfcbbec8283d72a6bde850cc00091" + integrity sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/service-error-classification@^2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz#0568a977cc0db36299d8703a5d8609c1f600c005" @@ -4465,6 +5544,13 @@ dependencies: "@smithy/types" "^3.0.0" +"@smithy/service-error-classification@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz#73484255060a094aa9372f6cd972dcaf97e3ce80" + integrity sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ== + dependencies: + "@smithy/types" "^3.3.0" + "@smithy/shared-ini-file-loader@^1.0.1", "@smithy/shared-ini-file-loader@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.1.0.tgz#144a03a303590ef7d465ebcb21ffc2a52efc3389" @@ -4489,6 +5575,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/shared-ini-file-loader@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz#7dceaf5a5307a2ee347ace8aba17312a1a3ede15" + integrity sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/signature-v4@^2.2.1", "@smithy/signature-v4@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.3.0.tgz#c30dd4028ae50c607db99459981cce8cdab7a3fd" @@ -4515,6 +5609,20 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@smithy/signature-v4@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.1.0.tgz#251ff43dc1f4ad66776122732fea9e56efc56443" + 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" + "@smithy/smithy-client@^2.5.1": version "2.5.1" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-2.5.1.tgz#0fd2efff09dc65500d260e590f7541f8a387eae3" @@ -4539,6 +5647,18 @@ "@smithy/util-stream" "^3.0.1" tslib "^2.6.2" +"@smithy/smithy-client@^3.1.12": + version "3.1.12" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.1.12.tgz#fb6386816ff8a5c50eab7503d4ee3ba2e4ebac63" + integrity sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA== + dependencies: + "@smithy/middleware-endpoint" "^3.1.0" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/protocol-http" "^4.1.0" + "@smithy/types" "^3.3.0" + "@smithy/util-stream" "^3.1.3" + tslib "^2.6.2" + "@smithy/types@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-1.2.0.tgz#9dc65767b0ee3d6681704fcc67665d6fc9b6a34e" @@ -4560,6 +5680,13 @@ dependencies: tslib "^2.6.2" +"@smithy/types@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.3.0.tgz#fae037c733d09bc758946a01a3de0ef6e210b16b" + integrity sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA== + dependencies: + tslib "^2.6.2" + "@smithy/url-parser@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-1.1.0.tgz#1d88af653b02fda0be59064bfe5420c0b34b4dcb" @@ -4587,6 +5714,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/url-parser@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.3.tgz#e8a060d9810b24b1870385fc2b02485b8a6c5955" + integrity sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A== + dependencies: + "@smithy/querystring-parser" "^3.0.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/util-base64@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-2.3.0.tgz#312dbb4d73fb94249c7261aee52de4195c2dd8e2" @@ -4685,6 +5821,17 @@ bowser "^2.11.0" tslib "^2.6.2" +"@smithy/util-defaults-mode-browser@^3.0.14": + version "3.0.14" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz#21f3ebcb07b9d6ae1274b9d655c38bdac59e5c06" + integrity sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w== + dependencies: + "@smithy/property-provider" "^3.1.3" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + bowser "^2.11.0" + tslib "^2.6.2" + "@smithy/util-defaults-mode-node@^2.3.1": version "2.3.1" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.1.tgz#4613210a3d107aadb3f85bd80cb71c796dd8bf0a" @@ -4711,6 +5858,19 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/util-defaults-mode-node@^3.0.14": + version "3.0.14" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz#6bb9e837282e84bbf5093dbcd120fcd296593f7a" + integrity sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ== + dependencies: + "@smithy/config-resolver" "^3.0.5" + "@smithy/credential-provider-imds" "^3.2.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/smithy-client" "^3.1.12" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/util-endpoints@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz#b8b805f47e8044c158372f69b88337703117665d" @@ -4729,6 +5889,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/util-endpoints@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz#e3a7a4d1c41250bfd2b2d890d591273a7d8934be" + integrity sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/util-hex-encoding@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz#87edb7c88c2f422cfca4bb21f1394ae9602c5085" @@ -4759,6 +5928,14 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/util-middleware@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.3.tgz#07bf9602682f5a6c55bc2f0384303f85fc68c87e" + integrity sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/util-retry@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-2.2.0.tgz#e8e019537ab47ba6b2e87e723ec51ee223422d85" @@ -4777,6 +5954,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/util-retry@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.3.tgz#9b2ac0dbb1c81f69812a8affa4d772bebfc0e049" + integrity sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w== + dependencies: + "@smithy/service-error-classification" "^3.0.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@smithy/util-stream@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-2.2.0.tgz#b1279e417992a0f74afa78d7501658f174ed7370" @@ -4805,6 +5991,20 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" +"@smithy/util-stream@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.1.3.tgz#699ee2397cc1d474e46d2034039d5263812dca64" + 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" + "@smithy/util-uri-escape@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz#56f5764051a33b67bc93fdd2a869f971b0635406" @@ -4819,7 +6019,7 @@ dependencies: tslib "^2.6.2" -"@smithy/util-utf8@^2.3.0": +"@smithy/util-utf8@^2.0.0", "@smithy/util-utf8@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== @@ -4853,6 +6053,15 @@ "@smithy/types" "^3.0.0" tslib "^2.6.2" +"@smithy/util-waiter@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-3.1.2.tgz#2d40c3312f3537feee763459a19acafab4c75cf3" + integrity sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw== + dependencies: + "@smithy/abort-controller" "^3.1.1" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@stratiformdigital/serverless-stage-destroyer@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@stratiformdigital/serverless-stage-destroyer/-/serverless-stage-destroyer-2.1.1.tgz#6c0a5bde84d8e0646aa4ddf9ea0b0b9b099495fb" @@ -7975,6 +9184,13 @@ fast-xml-parser@4.2.5: dependencies: strnum "^1.0.5" +fast-xml-parser@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== + dependencies: + strnum "^1.0.5" + fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -11927,11 +13143,17 @@ serverless-webpack@^5.6.1: optionalDependencies: ts-node ">= 8.3.0" -serverless@^3.38.0: - version "3.38.0" - resolved "https://registry.yarnpkg.com/serverless/-/serverless-3.38.0.tgz#9275763cab3ec1cd29635520cf24b9b5e7202583" - integrity sha512-NJE1vOn8XmQEqfU9UxmVhkUFaCRmx6FhYw/jITN863WlOt4Y3PQbj3hwQyIb5QS1ZrXFq5ojklwewUXH7xGpdA== - dependencies: +serverless@^3.39.0: + version "3.39.0" + resolved "https://registry.yarnpkg.com/serverless/-/serverless-3.39.0.tgz#699fbea4d0b0ba0baba0510be743f9d025ac363d" + integrity sha512-FHI3fhe4TRS8+ez/KA7HmO3lt3fAynO+N1pCCzYRThMWG0J8RWCI0BI+K0mw9+sEV+QpBCpZRZbuGyUaTsaQew== + dependencies: + "@aws-sdk/client-api-gateway" "^3.588.0" + "@aws-sdk/client-cognito-identity-provider" "^3.588.0" + "@aws-sdk/client-eventbridge" "^3.588.0" + "@aws-sdk/client-iam" "^3.588.0" + "@aws-sdk/client-lambda" "^3.588.0" + "@aws-sdk/client-s3" "^3.588.0" "@serverless/dashboard-plugin" "^7.2.0" "@serverless/platform-client" "^4.5.1" "@serverless/utils" "^6.13.1"